关于Nginx反向代理DDNS域名,DDNS域名IP变更后导致502(Bad Gateway)问题。
0x01 前言
Nginx在启动(或重载配置)时,会将反向代理配置中的DDNS域名解析为对应的IP地址并缓存。而DDNS域名的IP是动态变化的,当IP更新后,Nginx不会主动重新解析域名,仍会使用旧的缓存IP,导致请求无法连接到正确的后端服务,最终返回502错误。
0x02 解决方法
设置一个定时任务,检测站点存活,如果返回不是200就重启nginx。
#!/bin/bash
# 获取状态码(-s 静默模式,-I 只获取头部)
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://itho.cn)
# 判断是否是 200
if [ "$HTTP_CODE" != "200" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 状态码: $HTTP_CODE,正在重启 Nginx..."
pkill -9 nginx > /dev/null 2>&1
/etc/init.d/nginx restart
else
echo "$(date '+%Y-%m-%d %H:%M:%S') 状态正常: $HTTP_CODE"
fi
配置定时任务,每分钟执行一次。
*/1 * * * * /bin/bash /path/to/你的脚本.sh >> /var/log/nginx_ddns_check.log 2>&1
长效优化建议:
我没试过,若使用Nginx 1.1.9及以上版本,可在反向代理配置中添加resolver指令并启用valid参数,让Nginx定期重新解析域名(示例):
location / {
resolver 8.8.8.8 valid=300s; # 每300秒重新解析
proxy_pass http://你的DDNS域名;
}