基于 $scheme 的 NGINX 上游

基于 $scheme 的 NGINX 上游

我们有一个可以同时服务 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 参数设置HTTPSon

相关内容