NGINX - 在不同端口上反向代理多个API

时间:2016-09-29 12:10:29

标签: api nginx port reverse-proxy

我有以下API:

  1. localhost:300 / api / customers /
  2. 本地主机:400 / API /客户/:ID /计费
  3. 本地主机:500 / API /订单
  4. 我想使用NGINX将它们全部运行在以下位置:

    本地主机:443 / API /

    由于客户跨越两台服务器,这似乎非常困难。

    这是我从订单开始的失败尝试

    server {
        listen 443;
        server_name localhost;
    
        location /api/orders {
                proxy_pass https://localhost:500/api/orders;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    
    
    server {
        listen 443;
        server_name localhost;
    
        location /api/customers/$id/billing {
                proxy_pass https://localhost:400/api/customers/$id/billing;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    
    server {
        listen 443;
        server_name localhost;
    
        location /api/customers {
                proxy_pass https://localhost:300/api/customers;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    

    任何事情都可以解决?谢谢!

2 个答案:

答案 0 :(得分:14)

这三个服务由同一服务器代理(就nginx而言),因此必须在一个location块中构造为三个server块。有关详细信息,请参阅this document

如果您只是未经修改地传递原始URI,则无需在proxy_pass语句中指定URI。

server {
{
    listen 443;
    server_name localhost;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;

    location /api/orders {
        proxy_pass https://localhost:500;
    }
    location /api/customers {
        proxy_pass https://localhost:400;
    }
    location = /api/customers {
        proxy_pass https://localhost:300;
    }
}

如果proxy_set_header语句相同,则可以在父块中指定它们一次。

所需的location语句类型取决于localhost:300/api/customers/服务处理的URI范围。如果它是一个URI,则=语法将起作用。如果它是任何与/api/customers/:id/billing不匹配的URI,那么您将需要使用正则表达式位置块。有关详细信息,请参阅this document

除非您在此处终止SSL,否则我不确定这是否有效。这是配置reverse proxy as a secure server

答案 1 :(得分:2)

被接受的答案对我不起作用;我有三台服务器作为Kubernetes服务运行,它们映射到不同的群集IP(只能从Kubernetes节点访问)。因此,我使用了主机IP-10.ttt.ttt.104和以下配置,以便可以从工作网络访问这些服务。

无论如何我都不是nginx专家-但这行之有效-因此可以将其用作基础

events {
  worker_connections  4096;  ## Default: 1024
}
http{
    server {
       listen 80;
       listen [::]:80;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.103.152.188:80/;
       }
     }

    server {
       listen 9090;
       listen [::]:9090;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.107.115.44:9091/;
       }
     }

    server {
       listen 8080;
       listen [::]:8080;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.105.249.237:80/;
       }
     }
}