记一次与“502”的周旋的随笔

发布时间:2026/7/8 4:09:08
记一次与“502”的周旋的随笔 都说“技术”这东西平日里安安静静像个听话的仆人可一旦发了脾气便成了个蹩脚的戏子总在节骨眼上给你来个鬼脸。这几日我便遇上了这么一出。我在一台CentOS 9的机器里养了一个小东西——一个Docker容器名叫wechat-article-exporter。它乖乖地守着3000号门日夜不停地替我从微信文章里掏些有用的东西出来。我寻思着这3000号门太过素净外人来串门总得走个正经的、带着锁链的通道于是便请了Nginx来当个看门的管家把外头13000号那扇镶着SSL金边的门通通引向里头那扇朴素的3000号门。布置停当我整了整衣冠点开浏览器信心满满地敲下地址。屏幕上缓缓浮出一行字——“502 Bad Gateway”。底下还缀着个“nginx/1.20.1”冷冰冰的像个不屑搭理的铁面人。这“502”我是认得的它不似“404”那般直白找不到便找不到也不似“500”那般暴躁里头出了乱子。它最是暧昧好比你去敲朋友家的门里头明明有动静却偏偏没人来开只从门缝里塞出一张字条“网关不对请回吧。”我先是去瞧了瞧那个容器。用docker ps一看它活得正滋润又用docker logs扒开它的心腹里头清清楚楚地写着“Listening on http://0.0.0.0:3000”——它在3000号门口挂了个灯笼亮堂堂的。我不信邪抄起curl贴着宿主机的心窝子直接捅向3000号门竟麻利地扯回了一整页的HTML活蹦乱跳的。这说明容器没毛病是我那管家Nginx出了幺蛾子。于是我把耳朵贴在Nginx的日志上——那东西藏在/var/log/nginx/error.log里像一本密不透风的账本。翻开几页里面密密麻麻全是同一句话“connect() to 127.0.0.1:3000 failed (13: Permission denied)”。这“Permission denied”像一把生锈的锁卡在喉咙里让我心头一紧。明明门是开着的谁拦着不让进防火墙我查了firewalld端口是放开的网络我ping了127.0.0.1通了又通。那就只剩下一个老谋深算的主儿了——SELinux。这SELinux是Linux系统里一位不苟言笑的看门神。它不像防火墙那样只管谁进谁出它管的是“谁有什么资格去碰谁”。它给每个进程都发了一张身份证安全上下文Nginx那张身份证上印着“httpd_t”而SELinux的规矩里这位“httpd_t”先生默认是不许主动去敲别人家门的——哪怕那门就在自家院子里。这规矩名叫httpd_can_network_connect默认是“off”。我这才恍然大悟Nginx想去敲3000号的门门神SELinux把警棍一横“你一个看大门的安分守己便是凭什么擅自串门”于是Nginx伸出的手被硬生生挡了回来它只好对着外头的访客摊摊手报一个“502”了事。找到了症结治起来便不费事。我对着系统轻轻说了一句sudo setsebool -P httpd_can_network_connect 1这好比给门神递上了一纸通行令“这位管家是得了特许的让它去罢。”那-P是“永久”的意思免得下次重启机器门神又翻脸不认人。话音刚落我再刷新浏览器——嘿页面哗啦啦地铺开了图文并茂活色生香。502那个铁面人不知何时已悄悄退场连声招呼都没打。事后我端着茶杯望着屏幕上安详的页面心里却泛起一点涟漪。技术这玩意儿有时真像人情世故。你以为万事俱备偏偏忘了某一处不成文的规矩你觉得门都敞开了却不知门神手里的令牌没给你。那SELinux古板得像个老学究却也倔强得可爱——它不为难谁只守着它那一套“名正言顺”的道理。你若懂它敬它给它一个说得过去的理由它便放你过去还你一片清平。这一趟周旋下来我反倒对那“502”生出些感激。它虽让我费了番周折却也教会我一件事这世上没有无缘无故的“不准”只有你没读懂的那条规则。后来我把这条经验记在本子上旁边画了一扇门门上写着“SELinux问你可带了通行证”底下用红笔圈出那句咒语setsebool -P httpd_can_network_connect 1。下次若再遇上那铁面人我便能笑着对它说“老相识了请便罢。”