docker - 如何为多种服务配置NGINX位置

标签 docker nginx docker-machine nginx-location nginx-reverse-proxy

我想将NGINX配置为充当其他微服务的反向代理。

我能够将请求从NGINX转发到微服务之一

如果我这样做curl http://xx.xx.xx.xx:8080/ call 确实落在消费者门户上,但是
其使用默认位置配置/
当我注释1st块并为位置code配置相同的/consumer-portal并执行curl http://xx.xx.xx.xx:8080/consumer-portal

我得到:

Cannot GET /consumer-portal



我想使用NGINX调用十多个微服务。

以下是我的nginx.conf文件
worker_processes 4;
events { 
        worker_connections 1024; 
    }

http {
    sendfile on;
    upstream consumer-portal {

         server xx.xx.xx.xx:9006;

    }
    upstream publisher-portal {

         server xx.xx.xx.xx:9001;
    }
    server {
        listen 8080;

        #1st Block
        #location / {
        #    proxy_pass         http://consumer-portal;
        #    proxy_redirect     off;
        #    proxy_set_header   Host $host;
        #    proxy_set_header   X-Real-IP $remote_addr;
        #    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        #    proxy_set_header   X-Forwarded-Host $server_name;
        #}

        #2nd Block
        location  /consumer-portal {
            proxy_pass         http://consumer-portal;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }

        #3rd Block
        location /publisher-portal/ {
             proxy_pass         http://publisher-portal;
             proxy_redirect     off;
             proxy_set_header   Host $host;
             proxy_set_header   X-Real-IP $remote_addr;
             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header   X-Forwarded-Host $server_name;
         }
}
}

另外,请告诉我是否可以使用docker容器名称转发请求。

例如,我想使用xx.xx.xx.xx:9006代替服务器server consumer-portal:9006
请提出我需要对 .conf 文件进行的更改。

最佳答案

    location  /consumer-portal {
        proxy_pass         http://consumer-portal;

如果您的proxy_pass URL仅是域/ IP /主机名,并且未设置URI,则Nginx会将完整的客户端请求URL传递给代理,以查找与位置块匹配的请求。所以在这里您的要求
http://xx.xx.xx.xx:8080/consumer-portal将由Nginx代理到
http://consumer-portal/consumer-portal
如果您的proxy_pass URL是还附加了URI的域/ IP /主机名,则Nginx将用指令中的URI替换原始客户端请求中位置块的匹配部分,然后将结果URL代理到上游服务器。因此,如果您有proxy_pass http://consumer-portal/new/location;,则请求
http://xx.xx.xx.xx:8080/consumer-portal/account将由Nginx代理为
http://consumer-portal/new/location/account
当您想从请求中删除对上游代理的/consumer-portal时,解决方案就像在proxy_pass指令中添加斜杠一样简单,如下所示:
proxy_pass http://consumer-portal/;

关于docker - 如何为多种服务配置NGINX位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51210307/

相关文章:

linux - 如何为给定 Linux 文件夹中的所有文件提供 777 默认权限

docker - 在 DockerFile 中定义 VOLUME 挂载点而不是 adhoc cmd-line -v 的目的是什么?

node.js - 使用 Nginx 时 socket.io 出现 CORS 错误

ssl - 在 debian 服务器上的 nginx 中启用 SSLv3

java - Docker 中的 JRE 内存不足

azure - 在/etc/nginx/nginx.conf 的上游 "php"中找不到 Docker Azure 主机

mysql - 您如何检测导致 Passenger 应用程序实例不断消耗越来越多内存的问题?

tomcat - 如何将docker容器的IP地址动态映射到另一个容器

docker - 如何从主机MacOS机器内部连接到在Docker容器上运行的服务?

docker - 错误:服务 'web'生成失败:命令 '/bin/sh -c apk add --no-cache gcc musl-dev linux-headers'返回了非零代码:3