Docker Nginx代理本机服务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JosephThatwho/article/details/102736767

尝试用的docker Nginx代理本机的服务。
本机Django服务配置在8001端口,由supervisor+daphne启动,命令配置如下:

[program:apollo]
command=/home/user/pythonvirtualenv/apollo/bin/daphne -b 0.0.0.0 -p 8001 --proxy-headers config.asgi:application

之后用supervisor启动Django:

(apollo) root@user:~/program/apollo$ sudo supervisorctl start apollo
apollo: started

本地的nginx配置在路径/etc/nginx/sites-enabled/下,监听80端口,代理8001:

upstream apollo {
        server 127.0.0.1:8001;
}
server {
        listen 80;
        server_name 192.168.50.104;
        client_max_body_size 1000m;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8;

        location /admin/{
                proxy_pass  http://apollo/admin/;
                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;
        }
}

再由docker启动Nginx镜像,命名为tmp_nginx1,使用本地的配置文件:

root@user:~/Desktop$ docker run --name tmp_nginx1 -d -p 83:80 -v /etc/nginx/sites-enabled/:/etc/nginx/sites-enabled/ nginx
000bd23e56c262424c6ffb0557f0e39916a6d083b279bc5dcb64770f7d3ba917

启动成功:
nginx启动成功但是并不能找到本机的服务:
在这里插入图片描述最开始分析原因是以为容器的nginx寻找容器内的8001端口时无法和本机端口通信,需要映射。所以启动新容器验证,结果因为端口冲突,根本无法启动:

root@user:~/Desktop$ docker run --name tmp_nginx1 -d -p 83:80 -p 8001:8001 -v /etc/nginx/sites-enabled/:/etc/nginx/sites-enabled/ nginx
b7d225ef99d45023d36725e11fdcc20eb583e65550c1c24bf6c9f624de2c344c
docker: Error response from daemon: driver failed programming external connectivity on endpoint tmp_nginx1 (22a619e72e9b9176819161ee53d69df1afdc866a83b3edbea10c217a661ca32d): Error starting userland proxy: listen tcp 0.0.0.0:8001: bind: address already in use.

实际上容器默认是可以和容器外网络环境通信的,端口映射仅用于外部网络访问容器服务。
Docker安装时会创建一个docker0的bridge,创建的容器默认挂在docker0,当docker0收到172.17.0.0/16网段的外出包,会由MASQUERADE将源地址换为host地址,即作一次NAT。
所以这里需要把容器内nginx反向代理的地址还为本机的IP,不然nginx会在容器内的网络寻找服务。在桌面新建配置文件,准确代理本机IP以及PORT:

# ~/Desktop/nginx.conf
    upstream apollo_spa {
        server 192.168.50.104:8001;  # 这里需要写本机IP
}
server {
        listen 80;
        server_name _;
        client_max_body_size 1000m;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8;

        location /admin/{
                proxy_pass  http://apollo/admin/;
                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;
        }
}

再次启动容器,使用新的配置文件,映射到本机82端口:

root@user:~/Desktop$ docker run --name tmp_nginx_1 -d -p 82:80 -v ~/Desktop/nginx.conf:/etc/nginx/nginx.conf nginx
80f6a68c6f988e57424f4db6e2944103414a0516a0e2e05578d779641e34f273

成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JosephThatwho/article/details/102736767
今日推荐