【问题标题】:Docker + Nginx: Getting proxy_pass to workDocker + Nginx:让 proxy_pass 工作
【发布时间】:2017-10-29 06:13:19
【问题描述】:

我在尝试让 Nginx 代理到另一个也在 Docker 中运行的服务器的路径时遇到问题。

为了说明,我以 Nexus 服务器为例。

这是我的第一次尝试......

docker-compose.yml:-

version: '2'
services:
  nexus:
    image: "sonatype/nexus3"
    ports:
     - "8081:8081"
    volumes:
     - ./nexus:/nexus-data

  nginx:
    image: "nginx"
    ports:
    - "80:80"
    volumes:
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro

nginx.conf:-

worker_processes 4;
events { worker_connections 1024; }
http {
        server {
              listen 80;

              location /nexus/ {
                proxy_pass http://localhost:8081/;
              }
        }
}

当我点击http://localhost/nexus/ 时,我得到 502 Bad Gateway 并显示以下日志:-

nginx_1  | 2017/05/29 02:20:50 [error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /nexus/ HTTP/1.1", upstream: "http://[::1]:8081/", host: "localhost"
nginx_1  | 2017/05/29 02:20:50 [error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /nexus/ HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "localhost"
nginx_1  | 172.18.0.1 - - [29/May/2017:02:20:50 +0000] "GET /nexus/ HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

在我的第二次尝试中......,

docker-compose.yml - 我在 Nginx 配置中添加了links:-

version: '2'
services:
  nexus:
    image: "sonatype/nexus3"
    ports:
     - "8081:8081"
    volumes:
     - ./nexus:/nexus-data

  nginx:
    image: "nginx"
    ports:
    - "80:80"
    volumes:
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    links:
    - nexus:nexus

nginx.conf...我没有使用http://localhost:8081/,而是使用http://nexus:8081/:-

worker_processes 4;
events { worker_connections 1024; }
http {
        server {
              listen 80;

              location /nexus/ {
                proxy_pass http://nexus:8081/;
              }
        }
}   

现在,当我点击http://localhost/nexus/ 时,它会被正确代理,但网页内容会部分呈现。在检查该页面的 HTML 源代码时,javascript、样式表和图像链接指向 http://nexus:8081/[path]... 因此是 404。

我应该改变什么才能让它正常工作?

非常感谢。

【问题讨论】:

    标签: nginx docker docker-compose nginx-location


    【解决方案1】:

    以下是我用过的附加选项

    http {
        server {
              listen 80;
    
              location /{
                proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header    Host $http_host;
                server_name_in_redirect on;
                proxy_pass      http://nexus:8081;
    
              }
    
              location /nexus/ {
                proxy_pass          http://nexus:8081/;
                proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header    X-Real-IP $remote_addr;
                proxy_set_header    Host $http_host;
                server_name_in_redirect on;
              }
        }
    

    }

    我的解决方案是在 nginx 配置中包含“/”路径的重定向。 Nexus 应用将向“/”发出请求,以获取不起作用的资源。

    但是,这并不理想,并且不适用于为多个应用服务的 Nginx 配置。

    docs 涵盖此配置并指出您需要将 Nexus 配置为在 /nexus 上提供服务。这将使您能够按以下方式配置 Nginx(来自文档)减去上面的 hack。

    location /nexus {
      proxy_pass http://localhost:8081/nexus;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

    我建议使用该配置。

    【讨论】:

    • 它对我不起作用...http://localhost/nexus 被重定向到 http://nexus,我在该页面上得到 404。
    • 这种情况会发生,因为您没有匹配位置指令所需的尾随 '/'。这本身并不能解决问题。我正在用解决方案更新答案。
    • 将 Nexus 配置为具有自定义上下文路径 /nexus 对我有用。然后,我将 proxy_pass 配置为指向 http://nexus:8081/nexus/。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2018-07-08
    • 2019-05-03
    • 2021-07-18
    • 2014-11-30
    相关资源
    最近更新 更多