PHP-FPM监听方式必须与Nginx的fastcgi_pass严格匹配:先查/etc/php/*/fpm/pool.d/www.conf中listen路径(如/run/php/php8.1-fpm.sock)和listen.owner(Ubuntu为www-data,RHEL为nginx),再确认Nginx配置中fastcgi_pass unix:/run/php/php8.1-fpm.sock;路径一致、带unix:前缀、无多余空格,最后验证socket文件存在且权限正确。

PHP在Linux上跑不起来,90%不是版本问题,而是Web服务器和PHP-FPM没对上路——尤其是socket路径、用户权限、配置生效顺序这三处,错一个就502。
怎么确认PHP-FPM监听方式是否匹配Nginx
PHP-FPM默认用Unix socket,但Nginx配置里写成TCP(或反过来),直接导致502 Bad Gateway。不能只看php-fpm.conf,重点查pool配置文件里的listen和listen.owner。
- Ubuntu/Debian:检查
/etc/php/*/fpm/pool.d/www.conf,确认listen = /run/php/php*-fpm.sock(注意通配符*实际对应你装的版本,比如php8.1-fpm.sock) - RHEL/CentOS:检查
/etc/php-fpm.d/www.conf,listen.owner必须是nginx,user/group也得设为nginx(Apache系才是www-data) - 验证socket是否存在:
ls -l /run/php/,如果看不到.sock文件,说明PHP-FPM根本没启动成功,先sudo systemctl status php-fpm - Nginx配置里
fastcgi_pass必须严格匹配这个路径,比如fastcgi_pass unix:/run/php/php8.1-fpm.sock;,多一个空格或少一个分号都报错
为什么phpinfo()能访问但项目路由404
这是框架部署最典型的陷阱:Nginx把请求转发给了PHP-FPM,但没把URL重写规则给到框架的入口文件(如public/index.php),导致Laravel/Symfony这类框架的路由机制失效。
- 别只配
location ~ \.php$,必须加location /块处理所有非静态资源请求 - Laravel示例关键段:
try_files $uri $uri/ /index.php?$query_string;——这行必须存在,且放在location /里 -
root指令必须指向public/目录,不是项目根目录;否则app/、config/可能被直接暴露 - 检查
index指令是否包含index.php,缺了它,访问/会返回403而不是进路由
PHP扩展装了却显示“Call to undefined function”
php -m看到扩展名,不代表它真在Web上下文里生效——CLI和FPM用的是两套php.ini,改错地方等于白改。
立即学习“PHP免费学习笔记(深入)”;
- 查CLI用的配置:
php --ini→ 看Loaded Configuration File - 查Web用的配置:在
info.php里调phpinfo(),搜索Loaded Configuration File,路径通常类似/etc/php/8.1/fpm/php.ini - 常见翻车点:
opcache扩展只在FPM里开才有效,CLI里开了没用;pdo_mysql在CLI里加载了,但FPM的php.ini里没开,框架连不上数据库 - 改完FPM的
php.ini后,必须sudo systemctl restart php*-fpm,nginx reload无效
部署后上传文件失败或session丢失
表面是PHP配置问题,根子在用户权限和session存储路径。Web服务器进程(nginx/apache)和PHP-FPM进程必须以同一用户身份读写临时目录。
-
upload_tmp_dir和session.save_path在FPM的php.ini里设成绝对路径,比如/var/lib/php/sessions - 确保该路径存在且权限正确:
sudo chown -R www-data:www-data /var/lib/php/sessions(Ubuntu)或sudo chown -R nginx:nginx /var/lib/php/sessions(RHEL) - 检查SELinux是否拦截(RHEL系):
sudo setsebool -P httpd_can_network_connect 1,否则curl或数据库连接会静默失败 - 上传限制不止
upload_max_filesize,post_max_size必须≥前者,否则大文件提交直接卡在Nginx层,连PHP都收不到
真正卡住人的从来不是“怎么装”,而是“哪个配置文件管哪块、谁在用它、改完要不要重启哪个服务”。FPM的socket路径、Nginx的try_files、两套php.ini、session目录权限——这四个点串起来,才是生产环境不崩的最小闭环。



















