Nginx无default_server时证书匹配异常及多证书配置问题咨询
Nginx无default_server时证书匹配异常及多证书配置问题咨询
嘿,我完全懂你现在的烦恼——想给Nginx反向代理配置两张不同的证书,一张给公网域名用,另一张给内网LAN加密流量,但发现去掉default_server后,访问内网IP 10.0.0.103时,Nginx居然会跑去用domain.dev的证书,明明你已经给内网IP的server块单独配置了证书对吧?
问题根源
这其实是Nginx处理HTTPS请求的逻辑导致的:
当客户端发起HTTPS请求时,Nginx会先通过SNI(Server Name Indication)字段匹配server_name。但如果是直接用IP访问(或者客户端不支持SNI),请求里没有携带目标域名/IP的标识,Nginx就会自动选择第一个监听对应端口(这里是443)的server块作为默认处理对象,不管你有没有给其他server块指定了对应IP的server_name。
所以你去掉default_server后,Nginx就把排在前面的domain.dev的server块当成了默认,直接用它的证书来处理10.0.0.103的请求了。
解决方案
推荐用更明确的default_server来划分请求,同时确保每个server块的职责清晰:
配置示例
# 公网域名专用server块 server { listen 443 ssl; server_name domain.dev; ssl_certificate /path/to/your/domain_cert.crt; ssl_certificate_key /path/to/your/domain_key.key; # 这里补充你的公网域名对应的SSL参数和反向代理规则 } # 内网IP专用server块(设置为默认,处理无SNI或匹配IP的请求) server { listen 443 ssl default_server; server_name 10.0.0.103; ssl_certificate /etc/nginx/ssl/certificate.crt; ssl_certificate_key /etc/nginx/ssl/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; location /quantum/ { proxy_pass http://10.0.0.102:8080/; # 补充你的proxy相关配置(比如proxy_set_header等) } }
逻辑说明
- 带SNI的domain.dev请求:会精准匹配第一个server块,使用公网证书;
- 直接访问10.0.0.103的请求(无论是否带SNI):都会命中标记了
default_server的内网server块,使用内网证书。
测试验证
你可以用curl命令快速验证配置是否生效:
- 测试内网IP请求:
curl -v https://10.0.0.103 - 测试公网域名请求:
curl -v -H "Host: domain.dev" https://10.0.0.103
看输出里的证书信息是不是对应各自的配置就好啦。
备注:内容来源于stack exchange,提问作者W Brown
相关产品推荐
相关产品推荐

