nginx反向代理https访问502解决方法

Jason
2021-01-06 / 0 评论 / 413 阅读 / 正在检测是否收录...

正常nginx配置了SSL是可以通过HTTPS访问后端的,但是对有配置SNI + https后端的支持有点麻烦。

编译安装nginx后,看一下是否支持SNI

/usr/local/nginx/sbin/nginx -V 2>&1 |grep SNI

如果有TLS SNI support enabled就表示支持SNI

配置nginx
修改nginx安装后的conf/nginx.conf文件

以下是我的server配置节

upstream backend {
server 127.0.0.1:8443;
}

server {

    listen  443 ssl http2;
    server_name mytest.com;
    ssl_protocols SSLv3 TLSv1.2 TLSv1.1 TLSv1 SSLv2;
    access_log logs/proxy_access.log main;
    error_log logs/error.log info;
    underscores_in_headers on;
    
    location / {

针对源点使用https+SNI,需要下面两段

        proxy_ssl_server_name on;
        prox_ssl_name $host;

proxy_ssl_verify默认是off的,如果是on,源点的证书必须是正确的

        proxy_ssl_verify off;
        proxy_pass https://backend;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header cookie $http_cookie;
        proxy_set_header Proxy-Connection "";
        proxy_http_version 1.1;
    }
}

最重要的就是

        proxy_ssl_server_name on;
        prox_ssl_name $host;

以上配置,注意以下几点:

1、proxy_pass 后面是upstream中设置的后端源点

2、建议不要设置proxy_ssl_verify 因为默认是off,如果配置了on,请确保你的源服务器中有正确的SSL证书,不能造假

3、这三个是一定要加的

proxy_set_header Host $http_host;
proxy_set_header Proxy-Connection "";
proxy_http_version 1.1;

这两个也是要加的
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

4、处理源点是开启 https + SNI 的,最关键的两段
proxy_ssl_server_name on;
prox_ssl_name $host;

重启nginx

一些参考资料:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_name

一些参考资料:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name

一些不重要的参考资料:https://www.jianshu.com/p/999ac06e3934

1

评论 (0)

取消