这是我的第一个问题,所以请大家多多包涵!
我正在尝试在多租户 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