Nginx 代理到 AWS ELB 未将 HTTPS 协议传递给后端实例

Nginx 代理到 AWS ELB 未将 HTTPS 协议传递给后端实例

这是我的第一个问题,所以请大家多多包涵!

我正在尝试在多租户 SAAS 平台内设置一个 Nginx 代理服务器,以使用 OpenResty/Lua 和 LetsEncrypt 自动生成 SSL 证书。

代理服务器正在运行,证书正在顺利颁发。Nginx 配置(通过 OpenResty)正在将请求传递给我的 AWS Elastic (Classic) 负载均衡器。

问题是,我的 ELB 后面的实例似乎没有接收 HTTPS 协议,因此我的网站导航等中的链接都是 HTTP 而不是 HTTPS。

例如加载https://www.domain.com 有效,但点击导航中的链接会显示http://www.domain.com/page.html

这是我在代理上的 OpenResty/nginx 配置:

http {
  lua_shared_dict auto_ssl 1m;
  lua_shared_dict auto_ssl_settings 64k;
  resolver 8.8.8.8 ipv6=off;

  init_by_lua_block {
    auto_ssl = (require "resty.auto-ssl").new()
    auto_ssl:set("allow_domain", function(domain)
      return true
    end)
    auto_ssl:init()
  }

  init_worker_by_lua_block {
    auto_ssl:init_worker()
  }

  server {
    listen 443 ssl;
    location / {
      proxy_pass http://AWS-ELB-URL-HERE;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
  }

  server {
    listen 80;
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  server {
    listen 127.0.0.1:8999;
    client_body_buffer_size 128k;
    client_max_body_size 128k;

    location / {
      content_by_lua_block {
        auto_ssl:hook_server()
      }
    }
  }
}

为了尝试确定问题是否出在我的 Rails 应用程序中,我将 Nginx 配置更改为直接指向实例 IP 地址而不是 ELB。这样做,所有链接都是 https(!),这就是我想要的!

所以此时,我相信问题要么是 a) 我的 Nginx 配置没有正确传递协议,要么是 b) 我的 ELB 没有将协议传递给后端实例。

我有点倾向于认为 ELB 是罪魁祸首,因为当将代理直接指向实例 IP 时,一切都按预期工作。

因此,我开始研究 ELB 配置和侦听器,但尚未找到可行的配置。以下是我现在所拥有的:

在此处输入图片描述

我也尝试过将其改为:

负载均衡器协议:HTTPS(安全 HTTP),负载均衡器端口:443,实例协议:HTTP,实例端口:80

但这也不起作用,链接仍然是 HTTP。

我现在只是猜测如何针对监听器和端口进行操作,尝试任何配置以查看它是否有效。到目前为止什么都没有。

有人知道这个问题可能是什么以及如何解决它吗?TIA!

答案1

好的,我明白了!我刚刚在 SSL 块中添加了一条附加指令:

proxy_set_header X-Forwarded-Ssl on;

重新启动 nginx 后,所有请求现在都作为 https 传递到我的 ELB 和它后面的应用服务器!

此外,对于我的 ELB 监听器,我删除了 SSL(安全 TCP)监听器并添加:

LB 协议:HTTPS(安全 HTTP),LB 端口:443,实例协议:HTTP,实例端口:80

相关内容