我在一个ec2实例中运行了四个Web应用程序,在端口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 Server。
我如何配置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并回复
其他港口也一样
TL; DR:有几种方法可以完成你在这里寻找的东西。
在可能的情况下坚持减少attack surface的原则,除非绝对必要,否则通常最好不要将端口暴露给公共互联网。反向代理是实现此目的的绝佳方法。通常,您希望所有后端Web应用程序都通过端口443上的HTTPS进行反向代理,您可以访问每个服务:
app1.example.com
和app2.example.com
,或example.com/app1
和example.com/app2
根据您选择的方法,配置可能会有很大差异,前者可以使用多个server
块,后者可以使用location
块。在任何一种情况下,我们都将使用upstream
和proxy_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
块。如果它们分别在不同的端口上提供,也会出现这种情况。ssl_certificate
,则每个ssl_certificate_key
块中的server
和SANs可以指向不同的证书,甚至是相同的证书。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
块。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配置,其中implements SSL和reverse proxies有几个其他服务,虽然在它们的原始端口上,而不是443.如果你想要它可能是有用的将它们保留在原始端口上。
Nginx站点在反向代理基本配置上也有一个decent primer。