简体   繁体   中英

Docker + Nginx: Getting proxy_pass to work

I'm having a problem trying to get Nginx to proxy a path to another server that is also running in Docker.

To illustrate, I'm using Nexus server as an example.

This is my first attempt...

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

When I hit http://localhost/nexus/ , I get 502 Bad Gateway with the following log:-

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"

In my second attempt...,

docker-compose.yml - I added links to Nginx configuration:-

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 ... Instead of using http://localhost:8081/ , I use http://nexus:8081/ :-

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

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

Now, when I hit http://localhost/nexus/ , it gets proxied properly but the web content is partially rendered. When inspecting the HTML source code of that page, the javascript, stylesheet and image links are pointing to http://nexus:8081/[path] ... hence, 404.

What should I change to get this to work properly?

Thank you very much.

The following additional options are what I have used

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

}

My solution is to include the redirect for the '/' path in the nginx config. The Nexus app will be making requests to '/' for it resources which will not work.

However, this is not ideal and will not work with an Nginx configuration serving multiple apps.

The docs cover this configuration and indicate that you need to configure Nexus to serve on /nexus . This would enable you to configure Nginx as follows (from docs) minus the hack above.

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

I would recommend using that configuration.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM