2017-05-29 378 views
0

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

为了说明,我以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错误网关支持以下日志: -

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 - 我加links到Nginx的配置: -

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/时,它会正确代理,但Web内容已部分呈现。当检查该页面的HTML源代码时,javascript,样式表和图像链接指向http://nexus:8081/[path] ...因此,404。

我该如何改变以使其正常工作?

非常感谢。

回答

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(从文档)减去上面的黑客。

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; 
} 

我会推荐使用该配置。

+0

它不适合我......'http:// localhost/nexus'重定向到'http:// nexus',我在那个页面上得到了404。 – limc

+0

这会发生,因为您没有位置指令需要匹配的尾部“/”。这本身并不能解决问题。我正在用解决方案更新答案。 –

+0

将Nexus配置为具有自定义上下文路径'/ nexus'对我来说是个诀窍。然后,我配置proxy_pass指向'http:// nexus:8081/nexus /'。非常感谢您的帮助。 – limc