使用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!!!