加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.ikongjun.com/)- 混合云存储、媒体智能、AI行业应用、应用程序集成、办公协同!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux下PHP开发环境搭建实战指南

发布时间:2026-11-07 11:04:55 所属栏目:Linux 来源:DaWei
导读:  去年过年期间,我在公司机房蹲着调一台新配的 Debian 12 小盒子,装完 nginx、php8.2-fpm、redis-server,照例敲 php -v —— 出来了,版本对;ps aux | grep fpm —— 进程在跑;curl -I localhost —— 返回 200。我原以为

  去年过年期间,我在公司机房蹲着调一台新配的 Debian 12 小盒子,装完 nginx、php8.2-fpm、redis-server,照例敲 php -v —— 出来了,版本对;ps aux | grep fpm —— 进程在跑;curl -I localhost —— 返回 200。我原以为这下能直接扔进测试网了,结果打开浏览器输地址,第五次刷新,页面还是空白,F12 看 Network 标签页,Status 那栏冷冰冰写着 502 Bad Gateway。


  我抄起 ssh 回去翻 /var/log/nginx/error.log,里面就一行:143987 connect() to unix:/run/php/php8.2-fpm.sock failed (111: Connection refused) while connecting to upstream。sock 文件?ls /run/php/ —— 空的。我重启 php8.2-fpm,systemctl status php8.2-fpm —— active (exited)。再 systemctl start php8.2-fpm,还是 exited。我删了 /etc/php/8.2/fpm/pool.d/www.conf 里那行 listen.owner = www-data,改成 listen.owner = root(反正就我一个人用),重启,还是 exited。我盯了三分钟终端,手边泡的茶凉透了,水垢在杯底结了一圈浅褐色的印。


  这时候王工端着泡面路过,扒着机柜门看我屏幕,说:“你改过 /etc/php/8.2/fpm/php-fpm.conf 里 pid 的路径没?”我说没动过,默认是 /run/php/php8.2-fpm.pid。他嗦了一口面,说:“pid 文件写不进去,fpm 启动半截就崩,连 sock 都懒得建。”我顺手 ls -l /run/php/ —— 目录权限是 drwxr-xr-x root root,可 php-fpm 进程启动时是以 www-data 用户身份尝试写 pid 和 sock 的,目录不属于它,也无写权限。我原以为 systemd 会自动搞定这些路径归属,结果它真不管——就静静等着你跪着 chmod。


文章配图,仅供参考

  我改完 chown www-data:www-data /run/php/,systemctl start php8.2-fpm,status 显示 active (running),/run/php/ 下多了 php8.2-fpm.sock 和 php8.2-fpm.pid,nginx reload,页面刷出来第一行 “” 的输出。我长出一口气,转身去接水,听见机柜风扇嗡一声变了调,像打了个喷嚏。隔壁机房老张养的绿萝叶子上积了灰,叶尖微微发黄——我上次擦玻璃是十二月廿三,蒸馒头那会儿。


  但二十来分钟后,我清缓存重试一个 POST 接口,又 502 了。这次 error.log 换了行:144002 recv() failed (104: Connection reset by peer) while reading response header from upstream。我查 socket 连接状态,netstat -nap | grep php8.2-fpm,发现进程数卡在 max_children=5 满了,且全部 stuck 在 “State: S (sleeping)” 不动弹,连 ps aux 里的 TIME 列都停在 00:00:00.01 不跳。我改 pm.max_children = 20,reload fpm,照样满五就锁死。最后发现是 /etc/php/8.2/fpm/pool.d/www.conf 里 pm.start_servers = 2 这行底下,我手抖多加了半行注释符,变成 “; pm.min_spare_servers = 1”,结果把下一行 “pm.min_spare_servers = 1” 整行吞进注释里——fpm 解析配置时静默忽略,直接 fallback 到默认值 1,而 1 又太小,负载稍一上来,子进程全 hang 在 accept() 上,上游彻底哑火。我删掉那半个分号,重载,一切正常。


  我也不知道为什么 Debian 12 的 php-fpm 默认不校验注释语法,反正它不报错。我同事李敏去年十月提过 PR 想加个 warning,被 maintainer 回复 “Config parsing is line-based and intentionally silent on malformed comments”。我就记得她截图发群里时,右下角时间显示是下午三点零七分,电脑桌面壁纸是她女儿画的歪斜太阳,八条线,三条断的。


  优胜劣汰——不是人淘汰人,是那些你不信它会咬你、但它真就咬一口的配置细节,把人一口一口叼走。有谁碰到过这个吗

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!