基于端口号配置Nginx反向代理后端服务器的请求

4
我有四个Web应用程序运行在一个EC2实例上,主机名为“ip-10-176-225-83.us-west-2.compute.internal”,端口分别为8888、8088、8042和8890。所有这些Web应用程序都是基于HTTP协议的。
我们的安全团队不允许从本地到AWS打开HTTP端口。他们建议在同一VPC子网中设置反向代理,该代理接收HTTPS请求,并使用HTTP将其转发到后端Web服务器。
我在同一子网中创建了一个新的实例,主机名为“ip-10-176-225-84.us-west-2.compute.internal”,并安装了Nginx服务器。
如何配置Nginx以使其执行以下操作:
https://ip-10-176-225-84.us-west-2.compute.internal:8080被调用时,它会调用http://ip-10-176-225-83.us-west-2.compute.internal:8080并返回响应。
其他端口也是相同的方法。
1个回答

6
TL;DR: 在此处实现您要寻找的内容有几种方法。
尽可能遵循减少攻击面的原则,通常最好不要将端口暴露在公共互联网上,除非绝对必要。反向代理是实现这一目标的绝佳方式。通常,您希望所有后端 Web 应用程序通过 HTTPS 在端口 443 上进行反向代理,并且您可以通过以下任一服务访问每个服务:
  • 使用不同的主机名,例如app1.example.comapp2.example.com,或
  • 使用不同的子目录,例如example.com/app1example.com/app2
  • 根据您选择的方法,配置可能会有很大差异,前一种情况下需要多个server块,后一种情况下需要location块。无论哪种情况,我们都将使用upstreamproxy_pass指令。我将为两种情况提供示例。


    多个主机

    如果您在前端使用多个主机名(或多个端口),则需要为它们创建多个 server 块:

    # Nginx reverse-proxy configuration
    upstream app1 {
        server 10.176.225.83:8888;
    }
    
    upstream app2 {
        server 10.176.225.83:8088;
    }
    
    upstream app3 {
        server 10.176.225.83:8042;
    }
    
    upstream app4 {
        server 10.176.225.83:8890;
    }
    
    server {
        listen 443 ssl;
        server_name app1.example.com;
    
        ssl_certificate_key /path/to/your/ssl-key.pem;
        ssl_certificate /path/to/your/ssl-cert.pem;
    
        location / {
            proxy_pass http://app1;
        }
    }
    
    server {
        listen 443 ssl;
        server_name app2.example.com;
    
        ssl_certificate_key /path/to/your/ssl-key.pem;
        ssl_certificate /path/to/your/ssl-cert.pem;
    
        location / {
            proxy_pass http://app2;
        }
    }
    
    server {
        listen 443 ssl;
        server_name app3.example.com;
    
        ssl_certificate_key /path/to/your/ssl-key.pem;
        ssl_certificate /path/to/your/ssl-cert.pem;
    
        location / {
            proxy_pass http://app3;
        }
    }
    
    server {
        listen 443 ssl;
        server_name app4.example.com;
    
        ssl_certificate_key /path/to/your/ssl-key.pem;
        ssl_certificate /path/to/your/ssl-cert.pem;
    
        location / {
            proxy_pass http://app4;
        }
    }
    

    这里有几点需要注意:

    • 所有后端都已在顶部使用upstream指令定义,并且现在可以按名称引用。
      • 如果您不想以这种方式执行,则可以省略upstream块,proxy_pass行将如下: proxy_pass http://10.176.225.83:8888;
    • 因为每个应用程序都在不同的主机名上提供服务,每个应用程序都有自己的server块。如果它们每个都在不同的端口上提供服务,情况也是如此。
    • 每个server块中的ssl_certificatessl_certificate_key可以指向不同的证书,甚至是相同的证书,如果您在证书中定义了多个SANs
    • 每个应用程序都将从其自己的主机名中提供服务,所有这些主机名都指向前端服务器:
      • 应用程序1:https://app1.example.com
      • 应用程序2:https://app2.example.com
      • 应用程序3:https://app3.example.com
      • 应用程序4:https://app4.example.com

    多个目录

    对于使用单个主机和端口、从子目录中提供后端应用程序的配置,您将使用一个 server 块和多个 location 块:

    # Nginx reverse-proxy configuration
    upstream app1 {
        server 10.176.225.83:8888;
    }
    
    upstream app2 {
        server 10.176.225.83:8088;
    }
    
    upstream app3 {
        server 10.176.225.83:8042;
    }
    
    upstream app4 {
        server 10.176.225.83:8890;
    }
    
    server {
        listen 443 ssl;
        server_name example.com;
    
        ssl_certificate_key /path/to/your/ssl-key.pem;
        ssl_certificate /path/to/your/ssl-cert.pem;
    
        location /app1 {
            proxy_pass http://app1;
        }
    
        location /app2 {
            proxy_pass http://app2;
        }
    
        location /app3 {
            proxy_pass http://app3;
        }
    
        location /app4 {
            proxy_pass http://app4;
        }
    }
    

    这里还有一些需要注意的事项:
    • 我们仍然像以前一样定义了所有四个upstream服务,如果您更喜欢直接路由,仍然可以省略它们。在复杂的配置中,此指令更加有用。
    • 因为所有应用程序都是从同一个主机名提供服务,所以它们共享一个server块,但具有各自子目录的location块。
    • 由于它们都共享相同的主机名,在这种情况下,服务器证书不需要多个SANs。
    • 每个后端应用程序将在前端服务器上的子目录中可用:
      • 应用程序1:https://example.com/app1
      • 应用程序2:https://example.com/app2
      • 应用程序3:https://example.com/app3
      • 应用程序4:https://example.com/app4

    TLS配置

    在任何一种情况下,您都需要配置SSL证书,可以使用公共CA签名的证书,或者您公司内部的PKI证书(如果适用)。 如果您的应用程序将面向公众,则需要使用公共证书。然后将它们的位置添加到上述Nginx配置中。

    进一步阅读

    对于实际案例,您可以查看我用于Genieacs TR-069服务器的Nginx配置,该配置实现了SSL反向代理多个其他服务,尽管它们仍在其原始端口而非443端口上。如果您想要保留它们的原始端口,则此示例可能有用。

    Nginx官网还有一篇关于反向代理基本配置的良好入门指南

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接