生产环境配置核心是切断调试通道、锁死敏感路径、隔离配置来源;须关闭APP_DEBUG与PHP错误显示,禁止Web访问.env及app/config等目录,数据库密码等敏感信息不得硬编码,runtime目录权限须设为750且禁用模板自动编译。

生产环境配置不是“改几个开关”就能完事的,核心是切断调试通道、锁死敏感路径、隔离配置来源。硬编码数据库密码、留着 .env 文件可读、APP_DEBUG 没关——这三样只要中一个,就不算进入生产状态。
关闭调试模式与错误显示
ThinkPHP 的调试模式一旦开启,会暴露路由映射、SQL 语句、变量堆栈甚至文件路径。生产环境必须确保两处同时生效:
-
APP_DEBUG环境变量设为false(不能只靠配置文件覆盖,优先走环境变量) - PHP 配置中
display_errors = Off,且error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT - 检查
runtime/log/目录权限是否为750或更严,禁止 Web 用户直接读取日志文件
分离并保护环境配置
开发时用 .env 方便,但生产环境必须做到:配置不落地、不混入代码库、不被 Web 访问到。
-
.env文件必须出现在.gitignore中,且 Nginx/Apache 已配置禁止访问:location ~ /\.env { deny all; } - 数据库密码、Redis 密码、第三方 API Key 等绝不能写在
config/database.php这类 PHP 配置里 - 推荐用系统级环境变量注入(如 Docker 的
environment:或 systemd 的EnvironmentFile=),再通过env('DB_PASSWORD', '')读取,默认值留空而非占位符
限制入口与静态资源处理
ThinkPHP 的 public/ 是唯一合法 Web 入口,其他目录一旦被暴露,源码或配置可能直接下载。
立即学习“PHP免费学习笔记(深入)”;
- Nginx 必须配置敏感路径拦截:
location ~ ^/(app|config|database|runtime|vendor)/ { deny all; } - 静态资源(
.js、.css、.png)要加expires 1y和Cache-Control: public, immutable,避免每次请求都进 PHP - 确保
public/index.php是唯一执行入口,index.php不得出现在其他目录下;若用 Apache,确认.htaccess生效且重写规则未被覆盖
运行时目录权限与缓存策略
runtime/ 是 ThinkPHP 的命门——日志、缓存、模板编译全在这里生成,权限失控等于后门敞开。
-
runtime/及其子目录(log/、cache/、temp/)属主应为 Web 进程用户(如www-data),权限设为750,禁止组外可写 - 禁用模板自动编译(
'auto_cache' => false),上线前手动执行php think optimize:template - 缓存驱动优先选
redis而非file,避免多节点部署时缓存不一致;若必须用 file,确保runtime/cache/不在 Web 可访问路径下
最容易被忽略的是:Nginx 的 fastcgi_pass 指向的 PHP-FPM 实例,其 open_basedir 必须精确限定到项目根目录和系统临时目录,否则攻击者可能绕过 deny all 规则读取任意文件。



















