嵌入式工程师建站手记:裸机到高可用全链路
|
去年六月份,我给自己那个嵌入式博客搭了个新站——不是用现成的CMS,是裸机上起的:树莓派4B+Arch ARM、自己编译的Nginx(带stream模块)、用systemd跑着三进程:主站、API网关、还有个轮询串口读温感数据的Python脚本——就图个“能看见底层中断被谁占了”。备案过了那天我连喝了两罐冰啤酒,铝罐捏扁的时候听见邻居在阳台训狗。 结果第七天凌晨两点十七分,首页返回502。不是Nginx报错页,是彻底空白——curl -I 看状态码就是502,header里连Server字段都没有。我立刻ssh进去看nginx.service,状态显示active (running),journalctl -u nginx --since "2 hours ago" 只有三条access日志,全是/health,没一条是/。我原以为是upstream崩了,把proxy_pass指向的本地API进程kill -9 再systemctl restart nginx,它居然秒启、依然502。我切到API进程目录,ps aux | grep api,空。systemctl status api.service?Active: inactive (dead) since Sat 2023-06-17 02:16:43 CST。可systemctl list-dependencies nginx.target 明明包含api.service。
文章配图,仅供参考 我翻systemd unit文件,[Unit]里写了Wants=api.service、After=api.service,[Service]里Type=simple,ExecStart=/usr/local/bin/api —port 8080。都对。我手动执行那行命令,API起来了,curl localhost:8080/ 返回{"status":"ok"}。我再systemctl start nginx,还是502。我改Nginx upstream为127.0.0.1:8080硬写死端口,reload,502。我tcpdump -i lo port 8080,发现Nginx根本没发SYN包出去——它连connect()都没调。我strace -p $(pgrep nginx) -e trace=connect,sendto,recvfrom,输出是空的。我懵了,重启机器,502还在。我删掉所有自定义module,只留最简conf,502。我甚至重装了openssl——反正当时脑子已经不转了。第八次重启后我躺沙发上盯天花板,突然想起早上清理过/var/log/journal,删了二十来分钟前的日志。但journalctl --list-boots 里还剩上次启动记录。我随手敲 journalctl -b -1 | grep -i "api\\|socket",跳出来一行:Jun 17 02:16:43 raspberrypi systemd[1]: api.service: Failed at step SOCKET spawning: Unit socket.socket not found. 我愣住——socket.socket?我从来没建过这个东西。我搜自己所有unit文件,grep -r "socket\\.socket" ./,零结果。我查systemctl list-sockets,真有一行:sockets.target loaded active active Sockets。点开看,里面列着dbus.socket、syslog.socket……还有一个叫 systemd-journald-dev-log.socket,但没有我那个api.service对应的socket。 等等——我API的unit文件里没写任何Socket,但systemd居然在找socket.unit?我试着手动建一个 /etc/systemd/system/api.socket,内容就三行:[Unit] Description=API socket;[Socket] ListenStream=8080;Accept=false。然后 systemctl daemon-reload && systemctl start api.socket && systemctl start api.service。再curl首页——回来了,200。我盯着terminal,手有点抖。原来我抄的某篇旧教程里写着“Type=notify + SocketActivation=true”,可我没删那行SocketActivation=true,systemd就默认去找同名.socket,找不到就静默fail,连journal都不记——只记那句“Failed at step SOCKET spawning”,藏在-boot日志里。而我删日志时刚好删掉了上一次启动的完整boot log,只留了当前boot里没触发那行的片段。 我坐那儿想:这玩意儿优胜劣汰的狠劲儿,不是靠跑得多快,是靠藏得多深。同事老张路过瞄了一眼屏幕,说:“哦,你还没加socket激活啊?”——他语气平常得像问你吃没吃饭。我点点头,手指还停在键盘上,光标在空行里闪。那台树莓派散热片现在还烫手,风扇声跟当年调试STM32的JTAG适配器嗡鸣一模一样。(冰箱里第三罐啤酒结露了) 有谁碰到过这个吗 (编辑:航空爱好网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


MySQL运维设计实战:36小时构建高可用安全体系
嵌入式工程师拒外包,靠私域年入200万
5G模组功耗降维,嵌入式工程师重定义移动互联
SQL Server存储过程+触发器:零基础构建高可用数据审计系统

