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

Posted

技术标签:

【中文标题】NGINX - 在不同端口上反向代理多个 API【英文标题】:NGINX - Reverse proxy multiple API on different ports 【发布时间】:2017-02-07 18:13:39 【问题描述】:

我有以下 API:

    localhost:300/api/customers/ localhost:400/api/customers/:id/billing localhost:500/api/orders

我想使用 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;
    

有什么可以解决的吗?谢谢!

【问题讨论】:

【参考方案1】:

这三个服务由同一台服务器代理(就nginx 而言),因此必须在一个server 块内构造为三个location 块。详情请见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。

【讨论】:

【参考方案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/;
       
     

【讨论】:

你所做的是不同的。我需要将在不同端口上运行的服务合并到一个 SSL 端点。

以上是关于NGINX - 在不同端口上反向代理多个 API的主要内容,如果未能解决你的问题,请参考以下文章

vue-cli 配置服务端口反向代理

使用nginx反向代理,一个80端口下,配置多个微信项目

nginx 80端口反向代理多个域名,怎样隐藏端口的

求助 nginx反向代理两个服务器一个服务器手动关闭后 整个服务无法运行

nginx 80端口反向代理多个域名,怎样隐藏端口的

nginx 80端口反向代理多个域名,怎样隐藏端口的