记一次Nginx异常重启失败

一大早收到几个服务同时不可用的告警,一查又是 Nginx 出现启动失败,手动重启后恢复正常,这个情况过去的一年里,也出了一次,同样的时间,于是好好排查下。直接说结论,两个原因:一是系统底层更新,引发多服务重启,包括 nginx 在内。二是 nginx 一个 upstream 用了公网域名,解析失败,导致启动失败。

下面是过程,首先看 Nginx 日志,精简后如下:

[emerg] host not found in upstream "webapi.xxx.com" in /etc/nginx/sites-enabled/com.xxx.conf
nginx: configuration file /etc/nginx/nginx.conf test failed

Nignx 相关的配置,很早就没动过,比较迷惑的是手动执行 nginx -t 却都是 ok 的,唯独这次事故中出现了 test failed,仔细一看,上多了一条 host not found,或许刚好那个点就解析失败了,因为是遗留配置,没有使用,直接删除。

接下来就好玩了,哪个“缺德” Job 会在凌晨6点重启 Nginx?甚至这个时间点重启了好几个重要服务。印象中也就是 acme 刷新证书配置了 reload,一查时间对不上,crontab中也没有 Job 能去操作 Nginx。没有头绪的时候问了下 GPT,给出了一个关键点:系统定时服务,果然就有个时间很吻合,结果如下:

~# systemctl list-timers --all

LAST 2026-02-04 06:03:03 CST
UNIT apt-daily-upgrade.timer
ACTIVATES apt-daily-upgrade.service

看看这个 apt-daily-upgrade 究竟干了什么:

~# journalctl -u apt-daily-upgrade.service --since "2026-02-04 06:00:00" --until "2026-02-04 06:06:00" --no-pager -o short-iso

systemd[1]: Starting apt-daily-upgrade.service - Daily apt upgrade and clean activities...
apt.systemd.daily[4037440]: /usr/bin/unattended-upgrade:567: DeprecationWarning: This process (pid=4037440) is multi-threaded, use of fork() may lead to deadlocks in the child.

日志不多,但明显去了 unattended-upgrade,继续:

~# sudo grep -n "2026-02-04 06:0" /var/log/unattended-upgrades/unattended-upgrades.log | head -n 200

Starting unattended upgrades script
47:2026-02-04 06:03:13,556 INFO Packages that will be upgraded: inetutils-telnet libc-bin libc-dev-bin libc-devtools libc6 libc6-dev libpng16-16t64 locales mysql-client-core-8.0 telnet
49:2026-02-04 06:04:28,538 INFO All upgrades installed

升级了几个底层库,这时候意识到,应该就是这里引发了上层重启,继续:

~# sudo sed -n '1,200p' /var/log/unattended-upgrades/unattended-upgrades-dpkg.log

Restarting services...
systemctl restart aegis.service aliyun.service chrony.service containerd.service cron.service fwupd.service ilogtaild.service multipathd.service mysql.server.service nginx.service php8.3-fpm.service polkit.service redis-server.service rsyslog.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-udevd.service tuned.service udisks2.service uuidd.service
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

好家伙,重启了这么多服务。

这次事故里,“触发器”是自动升级导致的服务重启;“根因”是 Nginx 配置模式的脆弱性,upstream 配置在启动期就要求域名可解析,DNS/解析链路只要在重启瞬间抖动一下,Nginx 就起不来,于是任何一次重启(自动升级、人工重启、机器迁移、网络切换)都可能把隐患放大成故障。

关于远程那些事

25年8月份组装了一台台式机,265K+48G+RTX5080,用来跑一些 AI 相关的测试,同时也是继 NAS 之后,想了很久的一套计算中心,和 NAS 一样,大部分时间需要远程访问,经过这一个月的折腾体验,也基本稳定了,简单分享下过程。

工作日主要在深圳,节假日在惠州,所以目前网络和设备环境有

1:深圳移动宽带100M,公网IPv6,内网IPv4

2:惠州联通宽带100M,公网IPv6,公网IPv4

3:中兴F50+联通5G,公网IPv6,内网IPv4

4:移动端Macbook Pro、GPD win mini等

而这台台式机暂时放在深圳,两个米家插座分别控制显示器和主机,人在家使用则双开,远程使用则关闭显示器,以节省电力。主机的插座为常开状态,主要用来监控功率,以及防止开机卡失效的一个强制关机办法。

开机卡选择的用机箱内 9Pin USB2.0 插座供电,完全藏在机箱内,连接主板电源开关以及 LED 指示灯(相当于按了机箱电源)。在手机上用米家 App 很方便的开关机,还能区分是本地操作还是远程操作。米家的这些设备也用了很多年,稳定性很可靠。

软件方面主要有DDNS-GO、UU远程、Rustdesk、Tailscale、微软远程服务,均设置开机启动。优先使用微软远程桌面通过 IPv6 直连,当效果不理想时,切换到UU,或者自建节点的 Rustdesk。

因 IPv6 直连在跨运营商(跨城)可能会有严重限速,丢包。而自建节点的 Rustdesk 因为服务器有流量费,也不会优先考虑,但他的控制端可以无需管理员权限运行,dddd。UU目前体验算不错的,就是不知道以后会不会收费,大部分场景使用下来,都是基于UDP P2P连接,应该不会很耗服务器资源,就是在 MAC 系统下控制端不太能灵活缩放,导致字体有点小,虽然能改受控端的分辨率,但 Windows 那个缩放一旦跟着变了,很多程序要刷新,也够受的。

至于 DDNS-GO 用来配置域名解析到本机的 IPv6。Tailscale 则用来访问一些无需图像界面的服务,也能将两个地方的设备纳入一个局域网管理。当然也还有 WireGuard 用来连接 ECS,那就和本主题无关了。

近几年的主板默认都开启了 ErP Ready 会在关机时关闭大多数设备供电,包括USB、PCI-E,故需要在 BIOS 中关闭此功能,以及开启关机时候 USB 供电。通过插座功率监控可知,Enable 功耗 1w 不到,Disable 功耗 4w 左右。

Windows 11中使用IPv6的一些问题

目前家宽均配置了公网 IPv6,且启用 SLAAC 和 DHCPv6,地址后缀可由用户设备自行分配。经测试观察在 Windows 11 默认设置中拿到前缀会随机一个“固定” IPv6 地址和一个临时 IPv6 地址,访问网站会优先使用临时 IPv6 以保证隐私性,通常此地址有效期较短。

在配置远程访问过程中,发现两个 IP 表现并不一致,确认无防火墙干扰情况下,固定的地址可以 Ping 入,可以收到 TCP  SYN,在 FIN_WAIT_1 超时断开,在客户端远程桌面中使用这个地址,连接会卡在“正在配置中”,服务器日志显示“TCP 套接字写入操作失败,出现错误 121”。临时 IPv6 地址则无此情况,通讯正常。对于部分下载软件,默认使用第一个固定地址,会有速度影响。

关闭临时 IPv6 地址,此时会从 DHCPv6 多拿一个地址,测试也是可以正常通讯,不需要则在路由器上关闭 DHCPv6。此时如果再关闭 Windows 的随机算法,启用基于 MAC 地址的 EUI-64 算法地址,则可以只有一个 IPv6 地址,且通讯正常。但此时再开启临时 IPv6 则又出现相同问题。在 Windows 10 上测试没有上述问题,IPv6 和临时 IPv6 都正常通讯,不清楚是否其他设置引起。

相关命令(Powershell 需管理员权限)

使用EUI-64,关闭随机生成

Set-NetIPv6Protocol -RandomizeIdentifiers Disabled

关闭临时地址

Set-NetIPv6Protocol -UseTemporaryAddresses Disabled

这样操作会牺牲隐私性,请了解。

新玩具:探险家P-1 Mark II

上一个 GPS Logger V990 于18年购买,使用5年之久,稳定性还是很可靠的,没有出现什么大问题,最近决定做一次升级,换成最新款的 P-1 Mark II,主要有以下几点的考虑。

miniUSB 充电接口实在过于老旧,得多带一根线,也有过几次出门忘了的尴尬。仅支持 4GB 的存储卡和 FAT-16 分区也成古董,格式化都麻烦。单星座接收,定位准确度还是差点意思,尤其是长时间静止,那四处漂移的轨迹够慢慢删了。

过去的几年里,探险家也陆续发布了更高端款 P-1 Mark IIP-10 Pro,也都增加对中国北斗定位的支持,后者更是拥有全星座接收能力,L1+L5 双频定位,将定位精度推到顶峰。然而考虑到价格和实际使用场景,最后选择了 P-1 Mark II 款,目前还没拿到外面实际使用。在楼顶简单试用了下,确实定位精度比之前好很多,绕2圈,拐角处,斜着走都清晰可见。

简单说下第一印象:

从P系列开始,支持了三防,电池容量增加,体积也有了明显的增加,相比之下V系列则苗条太多。背壳从金属壳换成塑料壳,略显廉价,整体设计“粗犷”了不少。几个指示灯亮度感觉有所提高,夜间有点太亮眼。提示音有所减少,取消插拔卡时滴滴声,取消定位成功后滴滴声。广受诟病的 miniUSB 换成了 microUSB,除充电外还能当 USB GPS Device 使用,都 2023 年了,就不能一步到位 Type-C?

存储卡支持了 FAT-32,最大 32GB,虽然本身记录的 CSV 体积并不大,一天下来也就几个 MB 左右,但我习惯转换成的 KML 也存在上面,长年累月也是不小的存储量。P 系列默认按年月建立文件夹,这个功能还是挺实用的,不然塞满根目录。和大多数三防产品一样,一个橡胶盖覆盖了SD卡插槽和充电口,每次取卡充电,得掰一掰,弯折耐久度有点担心。

作为一个小众产品能不断迭代升级,并且能做到性能极致,还是得先点个赞👍,如果能有个小屏幕显示状态,高度,速度就更完美了。

小程序与移动端图片上传那些事

2022年7月14日,深圳一场绝世晚霞突然出现,而随手拍的一张照片上传到相册,却发现了一些问题,于是回来继续研究,顺便对相册的文件上传做个踩坑总结。

图片上传在各种程序开发中是一个再常见不过的需求。PC端由于对文件管理比较专业和成熟,一个 <input file> 直接搞定,但在移动端,却变得复杂起来。主要来说:第一是格式增多,兼容性难保证,各厂家均有自己的转换思路。第二是出于隐私保护,索性抹去了 EXIF。即刻相簿在做这件事情的时候也是不断的摸索中前进,被坑过数次。

对于相册程序而言,我们需要的是“完整”的“原图”,这里有两层含义,第一是包含完整的 EXIF 信息,从而绘制出带相机型号以及拍摄参数的分享图,第二是未经格式转换和机内后期的原始图像,尽可能的保存原始数据,当然,这一点倒影响其次。

即刻相簿是一个以微信小程序为主的相册,自然首先用到的是微信官方提供的上传功能,即 wx.chooseImage() 和 wx.chooseMedia() 很不幸的是这两者均不能满足要求,均抹去了 EXIF,转换成了 JPG,视频经微信压缩,画质掉渣到不可接受。

后来采用内嵌 webview,通过 H5 页面来实现上传,这样 file 的选择权就完全交由手机系统来决定,随后的测试中发现,在 iOS 系统中,相机拍摄格式中选择了“高效”,即 HEIF 格式时,上传时依然会转换成 JPEG,并抹去 EXIF,但拍摄 ProRAW 格式在自动转换 JPEG 的时候又能保留 EXIF,拍摄格式选择“兼容性最佳”,同样也能保留 EXIF,真是迷之操作。

(iOS 似乎在自动转换的过程中存在 Bug,将方向6转换成1的过程中没有更改宽高像素,导致画面比例错误。在选择照片中选择大、中、小,会丢失方向,竖拍图直接横着显示。前者解决办法判断宽度是否小于高度,竖拍一般宽度小于高度,后者基本无解,估计没多少人会去选大小吧)

既然是 webview,也想过能否在前段通过 JavaScript 来预先获取 EXIF,于是使用了 exif-reader.js 来读取 EXIF,很不幸测试结果中和上述表现一致。很好理解,因为在选择文件那一刻,就已经转换一个临时的 JPEG,开发者侧是无法感知这一过程。

另外有趣的是,手机上将 HEIF 图片通过分享存储到“文件”中,再在上传页面选择“选取文件”找到刚才的文件,是可以上传原始的 HEIC 格式文件并且保留了完整的 EXIF。

综上所述,即刻相簿也提供了PC端上传方式,来避开这些“限制”,以上测试基于 iPhone 13 Pro 系统 iOS 15.5。看来迟早得上 native app。