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

时间:2016-02-03 12:24:13

标签: ssl nginx tcp https load-balancing

所以我的负载均衡器看起来像这样:

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 {...}配置关注此tutorial,尝试以与上述类似的方式覆盖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证书并将这些证书传递给集群?这是一种更好的方法吗?

1 个答案:

答案 0 :(得分: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_pass使用proxy_ssl布尔指令按http://nginx.org/docs/stream/ngx_stream_proxy_module.html#proxy_ssl将其sudo apt-get install eclipse 发送到http上游或https。