Nginx子域名指向主域名而非对应server块问题求助
问题解决方法
核心问题
你的两个Nginx站点配置文件都错误嵌套了http块,违反了Nginx配置规范——主配置文件(如/etc/nginx/nginx.conf)已包含顶级http上下文,站点配置只需直接定义server块即可。这种嵌套会导致Nginx解析异常,将第一个加载的example.com服务器设为默认,所有请求(包括api.example.com)都会被它处理。
修复步骤
1. 修改站点配置文件,移除外层http块
修改 /etc/nginx/sites-available/r6dle.tech
删除文件开头和结尾的http {和},仅保留server块:
server { listen 80; server_name example.com; root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location /50x.html { root /usr/share/nginx/html; } # Additional redirect for api service location /api { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://rest-api:8000; } }
修改 /etc/nginx/sites-available/api.r6dle.tech
同样移除外层http块,同时删除多余的root /app/app;(反向代理场景无需定义root路径):
server { listen 80; server_name api.example.com *.api.example.com; location / { proxy_pass http://rest-api:8000/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Prefix /; } }
2. 验证配置并重启Nginx
先检查配置语法是否合法:
sudo nginx -t
若输出显示test is successful,再重启Nginx使配置生效:
sudo systemctl restart nginx
补充说明
单独配置子域名时正常,是因为单个配置文件的http块会被Nginx当作顶级上下文解析;但同时加载两个带嵌套http块的配置时,Nginx无法正确识别第二个server块,导致所有请求都匹配到第一个加载的example.com服务器。
内容的提问来源于stack exchange,提问作者Moder New
相关产品推荐
相关产品推荐

