承接上文的對Kestrel的思考
上一篇介紹了如何一下在docker中發布Asp.Net Core項目(傳送門)在最后嘗試從外網訪問網站的時候發現請求的響應頭中包含了這個信息Server:Kestrel(響應請求的服務器是Kestrel)
對於ASP.NET Core的Kestrel服務器,官網上有詳細的解釋,同時推薦一個大佬的翻譯文,詳細描述Kestrel的使用方式。
https://www.cnblogs.com/Wddpct/p/6123653.html
使用Nginx做為反向代理服務器
為了不直接暴露Kestrel服務器,在Kestrel和Internet之間加入Nginx作為反向代理服務器,所有的請求需要經過Nginx再轉發到Kestrel。思考了一下有兩種做法
- 在外部Linux上通過Nginx進行反向代理,將請求轉發到docker容器
- 使用docker-compose實現多容器獨立部署,通過容器間的虛擬網絡進行代理
這里因為Linux上已經安裝過Nginx了,偷個懶直接用第一種方式來做。(我也默認你已經裝好了Nginx了)
1.新建dotnet.conf用於反向代理
先進到nginx目錄(/usr/local/webserver/nginx/)
不管怎么樣,要改配置了,先把Nginx停了
nginx -s stop //快速停止nginx
進入conf目錄,新建dotnet.conf文件(隨便起個名)內容如下
upstream mysvr {
server localhost:8000;#目標地址
}
server {
listen 8000; #監聽端口
server_name www.cplemom.com; #監聽地址
access_log logs/mysvr.access.log;
error_log logs/mysvr.error.log;
root html;
index index.html index.htm index.php;
location / {
proxy_pass http://mysvr;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
有興趣的可以去學習一下這個配置文件到底是怎么回事,比如:如何配置反向代理。
2.在nginx.conf的http模塊中引用dotnet.conf
nginx配置一定要加分號結尾
include dotnet.conf;
3.使用命令測試配置文件是否正確
/usr/local/webserver/nginx/sbin/nginx -t -c /usr/local/webserver/nginx/conf/nginx.conf
這時候可以看到,果斷報錯了,錯誤提示:端口8000已經被占用了
仔細思考一下,發現是因為在當初創建容器的時候,將容器內的80端口映射到了外部的8000端口。
使用命令查看下端口的占用情況
ps -ef | grep 8000
知道原因就好辦了,最后的解決方法如下
(如果你已經把上面的步驟都做了,請你重來一遍,就當熟悉命令了。手動滑稽!)
1.停用之前創建的testapp容器,然后刪除掉
2.重新根據鏡像創建一個新的容器,但是將端口映射到8001(保證不和nginx沖突)
3.修改dotnet.conf配置文件,將server地址的端口改成8001
4.啟動nginx,並訪問查看
接收請求的服務器已經變成了nginx,我們開放的端口還是8000!!!