在 CentOS 上部署 ThinkPHP 项目,说难不难,但总有一些坑会反复出现。尤其是从 Windows 开发环境切换到 Linux 生产环境时,路径大小写、权限、SELinux 这些问题,很容易让人抓狂。下面这份排查清单,就是针对这些高频问题整理的,希望能帮你少走弯路。
环境兼容性与依赖
首先,PHP 版本必须对得上。ThinkPHP 8.1+ 要求 PHP 8.0 及以上,如果版本低了,直接报语法错误或者类找不到,运行都跑不起来。用 php -v 确认一下,如果需要升级,推荐通过 EPEL + Remi 仓库安装对应的 PHP 8.x 版本,同时把 CLI 和 FPM 都装上。
扩展方面,php-mysqlnd、php-mbstring、php-xml、php-curl、php-gd、php-bcmath 这些是标配。如果 Web 服务器是 Nginx,那 php-fpm 也必须安装。
依赖管理走 Composer。在项目根目录执行 composer install,必要时再用 composer dump-autoload -o 优化一下。如果 Composer 下载太慢,可以换国内镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/。
遇到版本不匹配或者自动加载报错,第一件事就是核对框架和 PHP 的版本兼容矩阵,然后执行 composer install/update 和 dump-autoload。千万别在生产环境用 --ignore-platform-reqs 来掩盖问题,后患无穷。
目录权限与 SELinux
Web 根目录建议指向 public/(ThinkPHP 5/6/8 都推荐这么做),这样应用代码就不会直接暴露在外部。
运行时可写目录必须设置好。确保 runtime/(以及日志、缓存、会话等子目录)对 Web 服务运行用户可写。比如:chown -R nginx:nginx runtime && chmod -R 755 runtime。不要图省事用 777,安全风险太大。如果运行用户是 apache,那就改成 apache:apache。
另外,CentOS 默认开启 SELinux,它经常会拦截文件读写。先检查状态 sestatus,如果发现 403 或读写失败,可以按需调整策略,或者把项目目录加入允许列表。具体怎么配,取决于你的安全策略,但不要直接关掉 SELinux。
路由重写与 PHP-FPM 连通
路由失效或者入口 404 是最常见的。Nginx 需要支持 PATH_INFO,在 location / 里加上 try_files $uri $uri/ /index.php?$query_string;。
PHP 解析配置要注意几个细节:
- 使用 Unix Socket 时,
fastcgi_pass unix:/run/php-fpm/www.sock;(具体路径以www.conf为准)。 - 使用 TCP 时,
fastcgi_pass 127.0.0.1:9000;。 - 必须设置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,同时配合fastcgi_split_path_info和PATH_INFO,否则会出现空白页或 404。
502 Bad Gateway 出现时,先检查 PHP-FPM 是否运行(systemctl status php-fpm),再核对监听地址和 Nginx 配置是否一致,最后看看 SELinux 或防火墙有没有阻断。
如果是 Apache 环境,需要启用 mod_rewrite,并允许 .htaccess 覆盖(AllowOverride All)。
配置文件与错误日志定位
数据库配置是另一个容易翻车的地方。检查 .env 或 config/database.php 中的 DB_HOST、DB_NAME、DB_USER、DB_PASS、DB_PORT 是否都正确,同时确保数据库服务已启动且可连接。
调试时,可以在入口或公共引导处临时设置 APP_DEBUG = true,获取完整堆栈信息。生产环境务必关闭。
日志是排查问题的利器。三个地方要重点看:
- Web 服务器日志:
/var/log/nginx/error.log或/var/log/httpd/error_log - PHP-FPM 日志:
/var/log/php-fpm/error.log - ThinkPHP 日志:
runtime/log/
一些常见错误关键词及处理方式:
- “open_basedir restriction in effect”:在 FPM 或虚拟主机配置中,将项目根目录加入
PHP_ADMIN_VALUE "open_basedir=...",或者在面板里加入白名单。 - “scandir() has been disabled for security reasons”:编辑
php.ini,从disable_functions中移除scandir等被禁函数,然后重启 PHP-FPM。 - “模板不存在”:Linux 对文件名大小写敏感,检查控制器方法和模板文件名的大小写是否一致。
生产环境安全与性能
上线前,务必关闭调试和错误显示。在 .env 中设置 APP_DEBUG=false,php.ini 中设置 display_errors=Off,只记录错误日志。
敏感文件要保护起来。限制对 .env、runtime/ 的访问。Nginx 可以添加 location ~ /\.env { deny all; }。
性能优化方面,开启 OPcache,会话存储改用 Redis,合理使用缓存减少数据库压力。这些措施能显著提升响应速度。
安全加固不能马虎:输入过滤与验证、使用查询构造器或参数绑定防止 SQL 注入、限制上传文件类型和大小,并对上传文件做安全检查。细节决定成败,别等到出问题了才后悔。