【问题标题】:NGINX Reverse Proxy failing with Linked Docker ContainersNGINX 反向代理因链接的 Docker 容器而失败
【发布时间】:2015-09-28 16:06:24
【问题描述】:

我有以下docker-compose.yml

node1:
    build: ./node
    links:
        - redis
    ports:
        - "8080"
node2:
    build: ./node
    links:
        - redis
    ports:
        - "8080"
service1:
    build: ./service
    links:
        - redis
    ports:
        - "8383"
redis:
    image: redis
    ports:
        - "6379"
nginx:
    build: ./nginx
    links:
        - node1:node1
        - node2:node2
        - service1:service1
    ports:
        - "80:80"

执行此操作并运行 docker ps 后,我得到以下信息:

080d9d7dc2e0        dockerworkflow_nginx:latest      "nginx -g 'daemon of   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp, 443/tcp   dockerworkflow_nginx_1
8c25bfdb9d00        dockerworkflow_node1:latest      "nodemon /src/index.   6 minutes ago       Up 6 minutes        0.0.0.0:33023->8080/tcp       dockerworkflow_node1_1
4ae817be2a63        dockerworkflow_service1:latest   "nodemon /src/index.   6 minutes ago       Up 6 minutes        0.0.0.0:33022->8383/tcp       dockerworkflow_service1_1
91ff238fe3f6        dockerworkflow_node2:latest      "nodemon /src/index.   6 minutes ago       Up 6 minutes        0.0.0.0:33021->8080/tcp       dockerworkflow_node2_1
fe0c7e02c860        redis:latest                     "/entrypoint.sh redi   6 minutes ago       Up 6 minutes        0.0.0.0:33020->6379/tcp       dockerworkflow_redis_1

到目前为止,一切似乎都很好。

我使用的nginx.conf 如下所示:

worker_processes 4;
events { worker_connections 1024; }

http {    
    server {
          listen 80;

          location / {
            proxy_pass http://node1;
          }

          location /a/ {
            proxy_pass http://node2;
          }

          location /b/ {
            proxy_pass http://service1;
          }
    }
}

这一切真正应该做的是:

如果我输入http://{host-ip}/,则node1 容器会转发请求。

如果我输入http://{host-ip}/a/,那么node2 容器会转发请求。

如果我输入http://{host-ip}/b/,则service1 容器会转发请求。

现在,如果我尝试什么,我会收到 502 Bad Gateway

【问题讨论】:

    标签: nginx docker reverse-proxy docker-compose


    【解决方案1】:

    我能够找出解决方案,结果证明是一些愚蠢的东西,没有出现在任何日志中,而且我很难发现。

    以下是更新后的nginx.conf 文件。

    worker_processes 4;
    events { worker_connections 1024; }
    
    http {    
    
        upstream node_app {
            server node1:8080;
        }
    
        upstream service_app {
            server service1:8383;
        }
    
            server {
                    listen 80;
    
                location / {
                    proxy_pass http://node_app/;
                    include /etc/nginx/proxy_params;
                }
    
                 location /a/ {
                    proxy_pass http://node_app/;
                    include /etc/nginx/proxy_params;
                 }
    
                 location /b/ {
                    proxy_pass http://service_app/;
                    include /etc/nginx/proxy_params;
                }
            }
    }
    

    目前不确定是否需要包含,但 proxy_pass 指令末尾的尾随 / 似乎在一天结束时可以解决问题。

    【讨论】:

    • 出于好奇,上游 {} 块有没有解决您的问题?还是只是有一个尾随 / 来修复它?
    【解决方案2】:

    我认为您应该在每个 proxy_pass 中指定端口。

    worker_processes 4;
    events { worker_connections 1024; }
    
    http {    
        server {
              listen 80;
    
              location / {
                proxy_pass http://node1:8080;
              }
    
              location /a/ {
                proxy_pass http://node2:8080;
              }
    
              location /b/ {
                proxy_pass http://service1:8383;
              }
        }
    }
    

    【讨论】:

    • @TheJediCowboy 任何错误日志?也许您可以尝试将您的服务端口公开给您的主机并测试 Web 应用程序是否正常工作。
    • 没有错误。我可以在内部点击端点,所以我知道该应用程序有效。
    猜你喜欢
    • 2021-05-04
    • 2018-03-20
    • 2017-03-21
    • 2020-09-10
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多