项目场景
80 端口 nginx 配置时遇到的 default_server 冲突和重启问题
问题描述
问题1:加 80 server 块后 curl 返回 302
curl -I http://ip:18006/可信域名验证文件.txt
问题2:service nginx restart 失败
原因分析
问题1的原因
# nginx.conf 新增 server { listen 80; server_name 域名; location = /验证文件.txt{ } } # /etc/nginx/sites-enable/default 同时存在 server { listen 80 default_server; server_name _; ... }
- 忽略默认配置,两个server块都监听80端口,default_server 的server块优先级高。
- curl 被 sites-enable/default 的 listen 80 default_server 抢走请求,但server块内未找到验证文件,root /var/www/html 下没有请求的文件,try_files $uri $uri/ =404 触发302重定向。
问题2的原因
sudo nginx 手动启动引起的冲突。
- 直接由sudo nginx 命令启动的进程,不受 systemd 管理。
- 通过 service nginx restart 启动时,由于手动启动的老进程依然存活,占用端口,
新 nginx 尝试 bind() 端口时,报错 address already in use ,所以启动失败
nginx: [emerg] bind() to 0.0.0.0:port failed (98: Address already in use)
解决方案
问题1的解决
sudo mv /etc/nginx/sites-enable/default /etc/nginx/sites-enable/default.bak
原因:include 配置读取 sites-enable/ 目录时,只认 .conf 后缀,所以.bak不会被加载
问题2的解决
排查:
sudo netstat -tlnp | grep ':80' # xxx/nginx: mast 占用80端口 sudo ps aux | grep nginx | grep -v grep # -v反向匹配,即排除 grep 命令自身统一使用 systemd 方式启动:
sudo killall nginx sleep 1 sudo service nginx start