如何使用nginx从http负载均衡器迁移到https负载均衡器

5
所以我的负载均衡器看起来就像这样:
upstream myapp1 {
    server 192.168.0.20;
    server 8.8.8.8 backup;
}

server {
    listen 80 default;

    location / {
        proxy_pass http://myapp1;
        proxy_set_header Host $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

集群中的众多域配置之一(192.168.0.20)如下所示:

server {
    listen 80;

    root /var/www/maximilian.xyz/public_html;
    index index.php index.html index.htm;

    server_name maximilian.xyz www.maximilian.xyz;
   
    ...
}

现在是你不知道的部分!

我一直在按照这个教程使用stream {...}配置来尝试以类似上文的方式处理ssl/https/443:

stream {
    upstream myapp1 {
        server 192.168.0.20:443;
        server 8.8.8.8:443 backup;
    }
    
    server {
            listen 443 ssl;
            proxy_pass myapp1;
    }
}

这次我在集群中添加了 192.168.0.20:

server {
    listen 443 ssl;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/maximilian.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/maximilian.xyz/privkey.pem;

    server_name maximilian.xyz www.maximilian.xyz;

    root /NAS/maximilian.xyz/public_html;
    index index.php index.html index.htm;

    ...
}

当DNS记录直接指向192.168.0.20时,一切正常(https)。
但是当通过负载均衡器运行时,根本无法工作。在运行service nginx configtest时nginx上的一切都很好。
我已经在负载均衡器上运行了tcpdump port 443 and '(tcp-syn|tcp-ack)!=0',返回访问https://maximilian.xyz/,但在集群上运行时没有任何捕获内容,这意味着TCP数据包未被传递,为什么?
请告诉我是否有更好的方法。我是否可以在负载均衡器上设置SSL证书并将这些证书传递到集群中?

我怀疑你的问题在于你在流中的服务器块中启用了“ssl”。实际上,你只想纯粹地通过它,而不是尝试解释它。可能nginx正在忽略它(因为你没有收到错误),但这是唯一引人注目的事情。 - Joshua DeWald
@jdewald 现在将其删除! - maxisme
没有运气 :( 我真的不知道为什么这不起作用!! - maxisme
1个回答

0
根据http://nginx.org/docs/stream/ngx_stream_upstream_module.html#server上的文档:
“地址可以指定为带有必需端口的域名或IP地址”
然而,似乎你的问题缺少了该端口。
因此,也许这会起作用:
 stream {
    upstream myapp1 {
-        server 192.168.0.20;
+        server 192.168.0.20:433;

(顺便问一下,为什么你要将8.8.8.8作为备用上游?难道不应该是谷歌的公共DNS服务吗?)
或者,确实可以在流模块中直接设置证书,请参见http://nginx.org/docs/stream/ngx_stream_ssl_module.html,SSL指令基本上与流模块外部的指令几乎相同。然后,您可以使用proxy_ssl布尔指令将其代理到http上游或https上游,如http://nginx.org/docs/stream/ngx_stream_proxy_module.html#proxy_ssl所述。

尝试了流更改,但没有成功。有没有办法我可以进行调试? - maxisme
@Maximilian,错误日志显示了什么?你有没有注意到stream只支持相对较新的nginx版本,并且即使在这些版本中,它也是一个编译时选项,默认情况下被禁用。你是否启用了所有这些流模块? - cnst
我已经安装了最新版本的nginx,并且运行system nginx configtest返回OK。有没有办法调试以确定我是否启用了模块? - maxisme
@Maximilian,你可以使用 nginx -V 命令;错误日志显示了什么? - cnst
“--with-stream --with-stream_ssl_module” 都在其中。 - maxisme
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接