linux上线php项目需四步闭环:web服务器正确转发请求、php被准确调用、项目public目录安全暴露、权限与用户配置严格对齐;任一缺失即导致502或file not found。

直接上结论:Linux上线PHP项目不是“装完就跑”,而是四步闭环——Web服务器必须能转发请求、PHP必须能被正确调用、项目入口必须暴露且安全、权限与配置必须匹配运行身份。漏掉任何一环,502 Bad Gateway或File not found就会立刻出现。
Web服务器怎么让PHP脚本真正被执行
Apache和Nginx处理PHP的方式完全不同,不能混用配置。Apache靠libapache2-mod-php模块内联执行,Nginx则必须通过FastCGI把请求甩给php-fpm进程。
- Apache用户确认
a2enmod php8.1(版本号要对)已执行,且/etc/apache2/mods-enabled/php8.1.load存在 - Nginx用户必须检查
location ~ \.php$块里有没有fastcgi_pass,值必须和php-fpm实际监听地址一致——常见错误是写成127.0.0.1:9000但php-fpm只监听unix:/run/php/php8.1-fpm.sock - Ubuntu/Debian默认用
www-data用户跑服务,CentOS/RHEL默认用nginx或apache用户,php-fpm池配置里的user、group、listen.owner、listen.group四项必须全部对齐,否则socket拒绝连接
PHP-FPM监听配置为什么总出错
php-fpm不启动或启动后Nginx连不上,90%是因为监听路径权限或用户组没配对。它不是“装了就能用”的服务,而是一个需要显式绑定身份的守护进程。
- 先查监听地址:
sudo grep "^listen =" /etc/php/*/fpm/pool.d/www.conf,确认是unix:/run/php/php8.1-fpm.sock还是127.0.0.1:9000 - 若用Unix socket,检查文件是否存在:
ls -l /run/php/php8.1-fpm.sock,权限应为srw-rw----,属主属组必须和Nginx运行用户一致(如www-data:www-data) - 若用TCP端口,确认
netstat -tlnp | grep :9000能看到php-fpm在监听,且防火墙没拦(sudo ufw status或sudo firewall-cmd --list-all) - 改完配置必须
sudo systemctl restart php-fpm,仅reload不够——socket文件会残留旧权限
项目public目录为什么不能直接放/var/www/html
现代PHP框架(Laravel、ThinkPHP等)强制要求Web根目录为public/子目录,否则app/、config/、.env等敏感路径会被直接HTTP访问,这是严重安全隐患。
- Nginx配置中
root指令必须指向项目public目录,例如root /var/www/myapp/public;,不是/var/www/myapp - Apache需配合
.htaccess重写,但更稳妥的是用DocumentRoot直指public,并确保AllowOverride All开启 - 上传代码后,立刻执行
sudo chown -R www-data:www-data /var/www/myapp(Ubuntu)或sudo chown -R nginx:nginx /var/www/myapp(CentOS),再sudo chmod -R 755 /var/www/myapp/public,避免open_basedir报错
php.ini调参哪些项真会影响上线表现
开发时开display_errors = On很爽,上线必须关;但有些参数关了反而出问题,比如opcache不开,性能直接打五折。
- 必改项:
display_errors = Off、log_errors = On、error_log = /var/log/php/error.log、date.timezone = Asia/Shanghai - 性能关键项:
opcache.enable = 1、opcache.memory_consumption = 256(单位MB)、opcache.validate_timestamps = 0(上线后设为0,否则每次请求都检查文件修改时间) - 上传限制项:
upload_max_filesize和post_max_size必须同时调大,且post_max_size≥upload_max_filesize,否则表单提交直接失败 - 改完
php.ini后,CLI和FPM用的是不同配置文件:php --ini看CLI路径,php-fpm -i | grep "Loaded Configuration File"看FPM路径,别改错地方
最常被跳过的动作是验证php-fpm监听用户和Nginx运行用户的gid/uid是否一致——哪怕名字一样,如果没在同一个组里,socket权限照样拒绝。上线前用ps aux | grep php-fpm和ps aux | grep nginx比对用户字段,比猜强得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











