配置Nginx以根据端口号将代理请求反向发送到后端服务器

配置Nginx以根据端口号将代理请求反向发送到后端服务器,nginx,reverse-proxy,Nginx,Reverse Proxy,我有四个web应用程序在一个ec2实例中运行,端口8888、8088、8042和8890上的主机名为“ip-10-176-225-83.us-west-2.compute.internal”。所有这些web应用程序都在HTTP上 我们的安全团队不允许打开从onpremise到AWS的http端口。建议在同一VPC子设备中设置反向代理,该代理接受HTTPS请求,并使用HTTP将其转发到后端Web服务器 我在同一子网中创建了一个新实例,主机名为“ip-10-176-225-84.us-west-2.

我有四个web应用程序在一个ec2实例中运行,端口8888、8088、8042和8890上的主机名为“ip-10-176-225-83.us-west-2.compute.internal”。所有这些web应用程序都在HTTP上

我们的安全团队不允许打开从onpremise到AWS的http端口。建议在同一VPC子设备中设置反向代理,该代理接受HTTPS请求,并使用HTTP将其转发到后端Web服务器

我在同一子网中创建了一个新实例,主机名为“ip-10-176-225-84.us-west-2.compute.internal”,并安装了Niginx服务器

我如何配置Nginx,使其能够执行以下操作

回电


其他端口相同

TL;DR:有几种方法可以实现您在这里寻找的目标。

遵循尽可能减少的原则,除非绝对必要,通常最好不要将端口暴露于公共互联网。反向代理是实现这一点的极好方法。通常,您希望所有后端web应用程序都通过端口443上的HTTPS进行反向代理,并且您可以访问每个服务:

  • 使用不同的主机名,例如
    app1.example.com
    app2.example.com
    ,或
  • 使用不同的子目录,例如
    example.com/app1
    example.com/app2
根据您选择的方法,配置可能会有很大的不同,前一种情况下有多个块,后一种情况下有多个块。在任何一种情况下,我们都将使用和指令。我将给出两种情况的示例


多个主机

如果前端使用多个主机名(或多个端口),则需要为其创建多个
服务器
块:

# 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;
    }
}
这里有几点需要注意:

  • 所有后端都使用
    上游
    指令在顶部定义,现在可以通过名称引用。
    • 如果不想这样做,可以省略
      上游
      块,而
      proxy\u pass
      行将如下所示:
      proxy\u passhttp://10.176.225.83:8888;
  • 因为每个应用程序都使用不同的主机名,所以每个应用程序都有自己的
    服务器
    块。如果在不同的港口分别提供服务,情况也会如此
  • 如果在证书中定义了多个证书,则每个
    服务器
    块中的
    ssl\u证书
    ssl\u证书密钥
    可以指向不同的证书,甚至是同一证书
  • 每个应用程序都可以通过其自己的主机名访问,主机名都指向前端服务器:
    • 应用1:
      https://app1.example.com
    • 应用2:
      https://app2.example.com
    • 应用程序3:
      https://app3.example.com
    • 应用程序4:
      https://app4.example.com

多个目录

对于使用单个主机和端口的配置,为子目录中的后端应用提供服务,您将使用单个
服务器
块和多个
位置
块:

# 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;
    }
}
关于这一点,还有几点需要注意:

  • 我们仍然像以前一样定义所有四个
    上游
    服务。如果你喜欢直达路线,你仍然可以省略它们。此指令在复杂配置中更有用
  • 由于所有应用程序都来自同一主机名,因此它们共享一个
    服务器
    块,但各自的子目录有单独的
    位置
  • 由于它们都共享相同的主机名,因此在这种情况下,服务器证书不需要多个SAN
  • 每个后端应用程序都可以从前端服务器上的子目录获得:
    • 应用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配置,它和其他一些服务(尽管在它们的原始端口上)不使用443。如果希望将它们保留在其原始端口上,这可能很有用

Nginx站点还具有反向代理基本配置