配置Nginx以根据端口号将代理请求反向发送到后端服务器
我有四个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,使其能够执行以下操作 回电配置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.
其他端口相同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站点还具有反向代理基本配置