Docker + Nginx:让proxy_pass工作

时间:2017-05-29 02:41:05

标签: nginx docker docker-compose nginx-location

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

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

我使用的是以下附加选项

  Type[] formatStringArgs = { typeof(string), typeof(int), typeof(string), typeof(int) };
   MethodInfo formatString = typeof(String).GetMethod("Format", formatStringArgs);

   il = toStringMethod.GetILGenerator();
   il.Emit(OpCodes.Nop);
   il.Emit(OpCodes.Ldstr, "{0},{1},{2}");

   il.Emit(OpCodes.Ldarg_0);
   il.Emit(OpCodes.Call, getIdMethodeBuilder);
   il.Emit(OpCodes.Box, typeof(Int32));

   il.Emit(OpCodes.Ldarg_0);                   
   il.Emit(OpCodes.Call, getDescriptionMethodeBuilder);

   il.Emit(OpCodes.Ldarg_0);
   il.Emit(OpCodes.Call, getParentIdMethodeBuilder);
   il.Emit(OpCodes.Box, typeof(Int32));

   il.Emit(OpCodes.Call, formatString);
   il.Emit(OpCodes.Ret);
   typebuilder.DefineMethodOverride(toStringMethod, 
   typeof(object).GetMethod("ToString"));

}

我的解决方案是包含' /'的重定向。 nginx配置中的路径。 Nexus应用程序将向' /'对于它不起作用的资源。

然而,这并不理想,并且不适用于为多个应用程序提供服务的Nginx配置。

docs 覆盖此配置并指示您需要将Nexus配置为在/nexus上投放。这将使您能够按如下方式(从文档)配置Nginx减去上面的黑客。

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

我建议使用该配置。