博客部署在家里的群晖上,并通过阿里云服务器代理了443端口,并转发到家里的群晖HTTP端口,但是会偶尔出现502,但是通过内网地址和DDNS是能正常访问的,之前一直没找到原因。

nginx代理配置如下:

server {
        listen       443 ssl;
        server_name  blog.nzcong.cn;
	ssl_certificate	/etc/nginx/cert/nzcong_cn/nzcong_cn.cer;
	ssl_certificate_key /etc/nginx/cert/nzcong_cn/nzcong_cn.key;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers on;

    location / {
            proxy_redirect  off;
            proxy_pass http://xxxxxx:xxxx/;
    }


    location ~* /!((css)|(img)|(js)/).+ {
            return https://blog.nzcong.cn/;
    }

}

问题排查:

首先在群晖设置了监控,每5分钟curl一下博客网址,并在博客返回502时回调给群晖chat应用,进而通知到手机端.

定时任务脚本如下:

#!/bin/sh
MonitorUrl=https://blog.nzcong.cn
result=`sudo curl -I -m 10 -o /dev/null -s -w %{http_code} $MonitorUrl`
if [ $result -eq 200 ]
then
# curl -H "Content-Type: application/json" -X POST -d 'payload={"text": "'"$MonitorUrl"' online."}' "http://xxxxxxx:4918/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=xxxxx"
 echo "$MonitorUrl online."
else
 curl -H "Content-Type: application/json" -X POST -d 'payload={"text": "'"$MonitorUrl"' offline."}' "http://xxxxxx:4918/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=xxxxx"
 echo "$MonitorUrl offline."
fi

监控了一段时间后,发现出现的两次问题都是在04:05

而这个时间点恰好是我路由器每天重启的时间。

因为运营商提供的外网IP是动态的,所以使用了群晖的DDNS,把博客域名指向映射到DDNS。

至此,怀疑是因为路由器重启之后重新登陆宽带账号,运营商为我分配了新的IP,导致DDNS后面的IP发生了变化,而nginx缓存了DNS解析的结果,没有实时更新导致。

百度了一下发现有类似的情况:https://www.lizi.tw/program/5247.html

遂更改了nginx配置,继续监控一段时间,看是否还会出现502的问题,更改的配置如下:

http {
	resolver 223.5.5.5 114.114.114.114 valid=600s;
	resolver_timeout 3s;
}

server { listen 443 ssl; server_name blog.nzcong.cn;

	ssl_certificate	/etc/nginx/cert/nzcong_cn/nzcong_cn.cer;
	ssl_certificate_key /etc/nginx/cert/nzcong_cn/nzcong_cn.key;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers on;
	set $url  http://xxxxxx:xxxx/;                         // 这里设置为变量,nginx不会在启动时进行解析,而是在运行时进行解析
    location / {
            proxy_redirect  off;
            proxy_pass $url;
    }


    location ~* /!((css)|(img)|(js)/).+ {
            return https://blog.nzcong.cn/;
    }

}