首页 > 解决方案 > 放两个nginx系列

问题描述

有没有办法将两个 NGINX 服务器串联起来?

在我的配置中,我有多个 docker-compose 容器实例,它们都运行相同的 Web 应用程序。另外,我有两个 NGINX。NGINX1 服务器位于我的物理机上,另一个 NGINX 服务器(NGINX2)位于 docker-compose 容器内。

有没有办法连接到 NGINX1 服务器,只需在浏览器中键入链​​接,即可通过第二个 NGINX(NGINX2,也是容器内部)自动到达 APP1 应用程序(位于容器内) “mydomain.com/app1”?

我知道更简单的解决方案是将 docker-compose 容器直接指向外部 NGINX,但我可以应用所描述的场景吗?

为了更好地理解,我制作了一个简单的图像来展示我的架构。

显示项目架构的图像

这是我的 NGINX1 配置文件:

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  9999;

   

    server {
        listen       80;
        server_name client1.nginx.loc;

        access_log  logs/nginx_client_loc-access.log;
        error_log logs/nginx_client_loc-error.log;



        location /loki{
            #proxy_http_version 1.1;
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection "Upgrade";
            #proxy_set_header Host $http_host;
            proxy_pass          http://172.29.161.227:3100;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

这里有第二个 NGINX 配置(NGNX2,容器内部)

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  99999;

         server {
            listen 80;
            server_name localhost 127.0.0.1;
            resolver 127.0.0.11;
            location /APP1 {
                proxy_pass          http://APP1/content;
                proxy_set_header    X-Forwarded-For $remote_addr; 
                proxy_read_timeout 300;
                proxy_connect_timeout 300;
                proxy_send_timeout 300;
            }

            location /App2 {
                include  /etc/nginx/mime.types;
                proxy_pass          http://APP2/targets;
                proxy_set_header    X-Forwarded-For $remote_addr;
            }

非常感谢

标签: dockernginxdocker-composenginx-config

解决方案


如果我理解正确,您希望 NGINX1 传递到 NGINX2 中,NGINX2 会将数据包向前传递到 APP1?在这种情况下,解决方案相当简单:

配置 NGINX1 以将数据包发送到特定端口,例如端口 777。然后,添加一个 NGINX2 侦听器,该侦听器将侦听端口 777 并将其发送出去。

NGINX1:

http {
    ...
    server {
        listen       80;
        ...
        location /loki{
            #proxy_http_version 1.1;
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection "Upgrade";
            #proxy_set_header Host $http_host;
            proxy_pass          http://172.29.161.227:3100;
        }
        location /APP1 {
            proxy_pass  <URL for NGINX2>:777;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_send_timeout 300;
        }
        #error_page  404              /404.html;
        ...
    }

NGINX2:

http {
    include       mime.types;
    ...
    server {
        listen 80;
        ...
    }
    server {
        listen 777;
        server_name localhost 127.0.0.1;
        resolver 127.0.0.11;
        location /APP1 {
            proxy_pass  http://APP1/content;
            proxy_set_header    X-Forwarded-For $remote_addr; 
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_send_timeout 300;
        }
    }
...

这样,到达 /APP1 的数据包由 NGINX1 转发到 NGINX2 的端口 777,然后再将其转发到 APP1 内容。

此外,如果您下次可以在架构图中包含端口,这将使您更清楚地理解数据包移动。

希望这会有所帮助。


推荐阅读