如何为多个服务配置 NGINX 位置

How to configure NGINX Location for Multiple Service

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

我能够将请求从 NGINX 转发到其中一个微服务

如果我这样做 curl http://xx.xx.xx.xx:8080/ 呼叫确实登陆了 consumer-portal 但是 它使用默认位置配置 /

当我评论 1st 块并为位置 /consumer-portal 配置相同的 code 并执行 curl http://xx.xx.xx.xx:8080/consumer-portal

我得到:

Cannot GET /consumer-portal

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

下面是我的 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 容器名称转发请求,请告诉我。

例如,我想使用 server consumer-portal:9006

而不是服务器 xx.xx.xx.xx:9006

请建议我需要对 .conf 文件进行哪些更改。

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

如果你的 proxy_pass URL 只是一个 domain/IP/hostname 并且没有设置 URI 那么 Nginx 将把完整的客户端请求 URL 传递给代理以匹配请求位置块。所以在这里你的请求

http://xx.xx.xx.xx:8080/consumer-portal 将被 Nginx 代理到

http://consumer-portal/consumer-portal

如果您的 proxy_pass URL 是一个 domain/IP/hostname 并且还附加了一个 URI,那么 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/;