Nginx子域名反向代理配置失效:所有请求均指向默认站点
一、修正证书路径一致性
你的配置中第一个server块的ssl_certificate_key路径为/etc/nginx/ssl/domain.com/privkey.pem,而api、admin子域名的server块路径是/etc/nginx/ssl/live/domain.com/privkey.pem,两者路径不一致。若第一个server的证书路径不存在,Nginx启动时会加载失败,仅能正常运行第一个server块,导致所有请求都导向React应用。
修正后的第一个server块证书配置:
ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;
二、重新加载Nginx配置
修改配置后必须让Nginx加载最新配置才能生效:
- 单独运行Nginx容器时执行:
docker exec <nginx容器名称> nginx -s reload - 使用docker-compose时执行:
docker-compose exec nginx nginx -s reload
若reload失败,查看Nginx日志定位错误:
docker logs <nginx容器名称>
三、验证子域名DNS解析
确保admin.domain.com和api.domain.com已正确解析到Nginx所在服务器的公网IP,可通过以下命令测试:
nslookup admin.domain.com nslookup api.domain.com
若解析结果错误,需在域名服务商后台添加对应子域名的A/CNAME记录,指向服务器IP。
四、清除缓存并测试请求头
浏览器缓存可能导致旧响应残留,使用Ctrl+Shift+R强制刷新或无痕模式访问。也可通过curl命令直接验证请求:
curl -v https://admin.domain.com curl -v https://api.domain.com
查看输出中的Host头是否正确,以及返回内容是否来自目标容器。
五、确认Docker网络连通性
确保Nginx容器与container1、container2处于同一Docker网络:
- 手动添加容器到同一网络:
docker network connect <共用网络名称> nginx容器 docker network connect <共用网络名称> container1 docker network connect <共用网络名称> container2 - 测试Nginx容器能否解析目标容器:
docker exec nginx容器 ping container1 docker exec nginx容器 ping container2
六、检查SSL证书覆盖范围
若你的SSL证书是单域名证书(仅包含domain.com),访问子域名会触发SSL错误,部分浏览器会自动跳转到主域名。可通过以下命令查看证书包含的域名:
openssl x509 -in /etc/nginx/ssl/live/domain.com/fullchain.pem -text -noout | grep DNS
若输出中无DNS:admin.domain.com和DNS:api.domain.com,需重新申请通配符证书(*.domain.com)或包含所有子域名的SAN证书。
内容的提问来源于stack exchange,提问作者Felipe Calixto

