宝塔网站在纯手工PHP环境中大概率报500或502,因宝塔隐藏了PHP-FPM池配置、Nginx fastcgi_pass地址、open_basedir自动注入、php.ini路径及扩展加载逻辑,剥离后需全部手动复现并校验。

不能直接“平滑”迁移,必须手动重建运行环境、重配服务、逐项验证——宝塔是封装层,剥离后所有依赖都暴露出来,所谓“平滑”只是错觉。
为什么宝塔网站在纯手工 PHP 环境里大概率直接报 500 或 502
宝塔隐藏了大量默认行为:PHP-FPM 池配置(如 www.conf 里的 user/group、listen.owner)、Nginx 的 fastcgi_pass 地址(可能是 127.0.0.1:9000 或 unix:/tmp/php-cgi.sock)、open_basedir 自动注入、以及关键的 php.ini 路径和扩展加载逻辑。一旦脱离宝塔,这些全得你手写、手调、手校验。
常见现象包括:
-
Primary script unknown:Nginx 找不到 PHP 文件路径,本质是root或alias配置没对齐实际目录 -
File not found(无错误日志):PHP-FPM 进程用户(如www-data)对网站目录无读/执行权限 -
Call to undefined function mysqli_connect():系统 PHP 没装php-mysql包,或模块未启用(php -m | grep mysqli返回空) - 伪静态失效:宝塔生成的
rewrite规则被直接复制进 Nginx 配置,但新环境没开ngx_http_rewrite_module或语法版本不兼容
迁移前必须从宝塔里导出的 4 类真实配置
别信“只拷文件+数据库就行”。以下内容必须从宝塔服务器提取,否则还原即失败:
立即学习“PHP免费学习笔记(深入)”;
- 网站根目录下的
.user.ini(含open_basedir、upload_max_filesize等关键限制,纯手工环境需合并进php.ini或 per-dir 配置) - /www/server/panel/vhost/nginx/
your-site.conf(重点看root、index、location ~ \.php$块里的fastcgi_param传递项) - /www/server/php/
X.Y/etc/php.ini(不是系统默认的/etc/php/*/fpm/php.ini,宝塔编译版路径固定,参数差异极大) - 宝塔【PHP 设置】→【禁用函数】列表(如
exec,passthru,shell_exec),这些必须在手工环境的disable_functions里原样复现
手工环境 Nginx + PHP-FPM 启动后必做的 3 个验证动作
启动服务只是第一步,不验证等于没迁:
- 执行
nginx -t确认语法正确,再systemctl reload nginx;别跳过-t,宝塔配置常含include路径,在新环境可能不存在 - 进网站根目录,运行
php -c /path/to/php.ini -v,确认 PHP 版本、Loaded Configuration File路径、以及php -m输出里有mysqli、pdo_mysql、curl等业务必需扩展 - 新建
info.php,内容为<?php phpinfo(); ?>,访问该文件,重点核对:Server API是 FPM/FastCGI、open_basedir值与宝塔一致、Loaded Extensions无缺失、Configuration File (php.ini) Path指向你实际修改的文件
数据库连接失败时最该查的 3 个地方
不是密码错了,而是环境链断了:
- 检查
wp-config.php或其他配置文件里的DB_HOST:宝塔默认用localhost,但手工环境若 MySQL 绑定127.0.0.1,就得改成127.0.0.1(localhost在 MySQL 里走 socket,127.0.0.1才走 TCP) - 确认 MySQL 用户授权语句是否含
IDENTIFIED WITH mysql_native_password:MySQL 8.0 默认用caching_sha2_password,PHP 7.4 以下版本不支持,需执行ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass'; - 查
/var/log/mysql/error.log或journalctl -u mysql,看是否有Can't connect to local MySQL server through socket—— 这说明 PHP-FPM 和 MySQL 的 socket 路径不一致,需统一设为/var/run/mysqld/mysqld.sock并在php.ini里加mysql.default_socket=/var/run/mysqld/mysqld.sock
最易被忽略的是:宝塔里“一键部署”的 PHP 是源码编译版,而系统 apt/yum 安装的是包管理版,二者 extension_dir 路径、模块名(redis.so vs php-redis)、甚至 php-fpm 的 pool.d 加载方式都不同。迁移不是换壳,是重铸底座。



















