Proxy

NGINX 上游基於 $scheme

  • June 5, 2019

我們有一個上游可以同時提供 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;
   }

這是正確的解決方案 - 還是有更合適的方法?

您可以通過簡單地聲明兩個伺服器來避免 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 參數設置HTTPSon.

引用自:https://unix.stackexchange.com/questions/387589