我们有一个可以同时服务 HTTP 和 HTTPS 流量的上游。问题是 - 如何让 NGINX 将流量发送到正确的上游端口?
当前配置是:
upstream platfrom-dev-eu-app {
server 52.***.***.80:443;
}
...
server {
...
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass $scheme://platfrom-dev-eu-app$request_uri;
}
}
我在这里看到的唯一解决方案 - 是添加两个上游,一个带有:80第二个是:443,然后在 中使用 if/elseserver {}
选择正确的一个(或者在 后设置端口proxy_pass
),例如:
upstream platfrom-dev-eu-app-ssl {
server 52.***.***.80:443;
}
upstream platfrom-dev-eu-app {
server 52.***.***.80;
}
...
if ($scheme = "http") {
proxy_pass http://platfrom-dev-eu-app$request_uri;
}
if ($scheme = "https") {
proxy_pass https://platfrom-dev-eu-app-ssl$request_uri;
}
这是正确的解决方案吗?还是有更合适的方法?
答案1
您可以通过简单地声明两个服务器来避免 if 语句,这是我用于此类事情的模式:
upstream platfrom-dev-eu-app-ssl {
server 52.***.***.80:443;
}
upstream platfrom-dev-eu-app {
server 52.***.***.80;
}
server {
listen 80;
include "common.conf";
proxy_pass http://platfrom-dev-eu-app$request_uri;
}
server {
listen 443 ssl;
# SSL configuration
include "common.conf";
proxy_pass https://platfrom-dev-eu-app-ssl$request_uri;
}
创建该common.conf
文件并将您的通用配置放入其中的两台服务器中。
实际上,如果您位于受信任且安全的网络上,您只需终止反向代理上的 SSL,然后仅与应用程序服务器进行纯文本对话。然后在应用程序服务器上定义一个用于 SSL 连接的端口上的服务器,并将 fastcgi 参数设置HTTPS
为on
。