使用Nginx反向代理Docker的Asp.Net Core項目的請求


承接上文的對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!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM