Proxy
NGINX 上游基於 $scheme
我們有一個上游可以同時提供 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/else
server {}
來選擇正確的一個(或者只是在 之後設置埠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; }
這是正確的解決方案 - 還是有更合適的方法?
您可以通過簡單地聲明兩個伺服器來避免 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
.