PHP 8.4 FPM 在 Kubernetes 中必须通过 Unix socket(而非 TCP)与 Nginx 通信,因 Pod 内容器共享网络命名空间,监听 0.0.0.0:9000 会引发 IP 冲突且无实际意义;Unix socket 更安全、零网络开销,需配置 listen=/run/php/php8.4-fpm.sock、一致用户权限、共享 emptyDir 卷及正确 fastcgi_pass 路径。

直接上结论:PHP 8.4 FPM 应用在 Kubernetes 上不能裸跑 php-fpm 进程,必须配合 Nginx(或 Apache)反向代理,且 php-fpm 容器需监听 127.0.0.1:9000 或 Unix socket,**绝不能绑定 0.0.0.0** —— 否则会因 Pod 网络模型冲突导致 502 或连接拒绝。
为什么 PHP-FPM 必须用 Unix socket 而不是 TCP?
Kubernetes Pod 内多个容器共享网络命名空间,php-fpm 若监听 127.0.0.1:9000,Nginx 容器可通过 localhost 访问;但若监听 0.0.0.0:9000,会与 Pod IP 冲突,且暴露端口无意义(外部无法直连 FPM)。Unix socket 更安全、零网络开销,是生产首选。
-
php-fpm.conf中必须设listen = /run/php/php8.4-fpm.sock,而非127.0.0.1:9000 -
listen.owner和listen.group需设为www-data(或 Nginx 容器中运行用户一致) - Nginx 配置里对应 upstream 必须用
fastcgi_pass unix:/run/php/php8.4-fpm.sock;,不能写127.0.0.1:9000 - Pod 中两个容器需挂载同一 emptyDir volume 到
/run/php/,确保 socket 文件可互通
PHP 8.4 镜像构建时的三个关键陷阱
官方 php:8.4-fpm-alpine 镜像默认不带 opcache、mbstring、pdo_mysql 等扩展,直接运行 Laravel 或 ThinkPHP 会报 Class not found。别信“基础镜像开箱即用”。
- 必须显式安装扩展:
docker-php-ext-install opcache mbstring pdo_mysql gd zip,不能只靠apk add php84-opcache(Alpine 的包名不统一) -
opcache.enable=1和opcache.memory_consumption=128要写进/usr/local/etc/php/conf.d/opcache.ini,否则 Docker 启动后仍不生效 - PHP 8.4 已移除
mysql扩展(仅保留mysqli和pdo_mysql),代码里若还有mysql_connect()会直接 fatal error
ConfigMap 挂载 php.ini 为何经常失效?
ConfigMap 挂载到 /usr/local/etc/php/php.ini 会被 PHP 启动时忽略——因为 php-fpm 实际读取的是 /usr/local/etc/php-fpm.d/www.conf 里指定的 php_admin_value[error_log] 等,而全局配置由 php.ini 控制,但路径优先级混乱。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法:把自定义 ini 文件(如
app.ini)挂载到/usr/local/etc/php/conf.d/目录下,文件名必须以.ini结尾 - 避免覆盖默认
php.ini,Kubernetes ConfigMap 挂载时设subPath指向单个文件,而非整个目录 - 验证是否生效:进 Pod 执行
php --ini看扫描路径,再执行php -r "echo ini_get('opcache.enable');"确认值
Service 和 Pod 就绪探针怎么写才不误杀?
用 curl http://localhost:9000 做 liveness 探针是典型错误——php-fpm 不提供 HTTP 服务,该请求永远超时,导致反复重启。
- livenessProbe 应检查 FPM master 进程是否存在:
cat /proc/1/status | grep -q 'Name:.*php-fpm' - readinessProbe 推荐用
ss -tln | grep -q ':9000'(TCP)或ls /run/php/php8.4-fpm.sock && stat /run/php/php8.4-fpm.sock(socket) - PHP 8.4 默认关闭
ping.path,若要启用健康端点,需在www.conf加ping.path = /ping和ping.response = pong,再配 Nginx location 转发
最易被忽略的一点:PHP 8.4 的 opcache.preload 在容器里几乎无效——预加载文件路径硬编码,而镜像构建时的绝对路径和运行时挂载的代码路径不一致,强行启用会导致启动失败。线上环境建议关掉它,专注用 opcache.validate_timestamps=0 + 构建时生成 opcode 缓存。



















