结论是必须手动配置nginx+php-fpm+mariadb组合,重点调优php-fpm进程池、修正mariadb bind-address、补全fastcgi_param script_filename,并核对php时区与内存限制等关键参数,否则极易出现502错误或连接失败。

直接上结论:别用一键脚本,也别照抄旧教程里apt install lamp-server^这种模糊包——它会默认装Apache,而你真正需要的是Nginx+PHP-FPM+MariaDB组合,且必须手动配php-fpm池、调max_children、改bind-address,否则上线后502或连接超时是常态。
为什么mysql要换成mariadb,且必须改bind-address
Ubuntu 22.04+ 默认源已移除MySQL官方包,apt install mysql-server实际装的是MariaDB(完全兼容但更活跃)。但默认配置里bind-address = 127.0.0.1会锁死远程数据库访问——哪怕你的PHP和MySQL在同一台机器,Nginx反向代理或Docker容器场景下,PHP进程常走127.0.0.1:3306,而MariaDB监听localhost(Unix socket)或127.0.0.1时行为不一致。
- 检查真实监听地址:
sudo ss -tlnp | grep :3306,若只显示127.0.0.1:3306,说明外部PHP-FPM进程无法通过TCP连接 - 修改
/etc/mysql/mariadb.conf.d/50-server.cnf,把bind-address改成0.0.0.0或删掉这行(MariaDB默认监听所有接口) - 重启服务:
sudo systemctl restart mariadb,再验证mysql -h 127.0.0.1 -u root -p能连上 - 安全补漏:创建专用数据库用户,不用
root连PHP应用,执行CREATE USER 'app'@'localhost' IDENTIFIED BY 'strong-pass'; GRANT ALL ON mydb.* TO 'app'@'localhost';
php-fpm进程池配置不当,90%的502错误根源
Nginx报502 Bad Gateway,八成不是Nginx挂了,而是php-fpm没响应。默认配置用ondemand模式,低流量时worker全停,突发请求来临时启动慢;高并发又可能因max_children太小被拒绝。
- 编辑
/etc/php/8.2/fpm/pool.d/www.conf(版本号按实际调整),关键改三处:pm = static(避免冷启动延迟)pm.max_children = 32(按内存算:每个PHP进程约20–30MB,1GB内存建议≤32)pm.status_path = /status(启用状态页,后续可监控) - 确认socket路径:Ubuntu系默认用
listen = /run/php/php8.2-fpm.sock,Nginx配置里fastcgi_pass必须严格匹配 - 重启服务顺序不能错:
sudo systemctl restart php8.2-fpm→sudo systemctl restart nginx,先起PHP再起Nginx,否则Nginx启动时找不到socket会报错
Nginx转发PHP请求时,fastcgi_param漏写SCRIPT_FILENAME必挂
很多教程复制粘贴Nginx配置,但漏掉fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这一行——没有它,PHP-FPM收到请求后根本不知道该执行哪个文件,直接返回空白或500。
- 在
/etc/nginx/sites-enabled/default或你的站点配置里,location ~ \.php$块内必须包含:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param REQUEST_URI $request_uri;fastcgi_param QUERY_STRING $query_string; - 务必检查
$document_root是否指向真实路径,比如root /var/www/html;,否则$document_root$fastcgi_script_name拼出来是错的 - 测试配置语法:
sudo nginx -t,成功后再sudo systemctl reload nginx,别直接restart
最易被忽略的点:PHP的date.timezone和memory_limit不设,WordPress等程序安装时就卡住;mysqli.default_socket没指向/run/mysqld/mysqld.sock(MariaDB实际socket路径),PDO连本地库会失败。这些不在主流程里,但上线前必须逐项核对phpinfo()输出页。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











