生产环境首选dunglas/frankenphp官方docker镜像,预设php.ini-production、禁用危险函数及调试功能;需固化配置、挂载只读密钥、关闭caddy安全头覆盖,并在worker模式下严格管理pdo持久连接与资源释放。

生产环境安装 FrankenPHP,安全不是附加项,而是起点。核心原则是:最小权限、最小暴露、进程隔离、配置固化。
首选官方 Docker 镜像并禁用调试面
使用 dunglas/frankenphp 镜像是最安全的起点——它预设 php.ini-production、禁用危险函数、关闭 display_errors 和 expose_php。必须做两件事:
- 在容器启动前确保
disable_functions = phpinfo,show_source,exec,system,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,load_extension已生效(可通过frankenphp info验证) - 删除或重命名
public/phpinfo.php等调试文件;若用 CI/CD 构建镜像,应在Dockerfile中显式RUN rm -f /app/public/phpinfo.php
敏感配置必须走只读文件挂载
绝不在环境变量中传递密钥、Token 或数据库密码。进程环境会泄漏到 /proc/[pid]/environ、docker inspect 和错误日志中。
- 宿主机创建
/etc/secrets/app.key,权限设为600,属主root:www-data - Docker 启动时挂载:
-v /etc/secrets/app.key:/run/secrets/app.key:ro - PHP 中用
file_get_contents('/run/secrets/app.key', LOCK_EX)读取,避免缓存或意外 echo
Caddy 层必须关闭默认安全头覆盖
FrankenPHP 的 Caddy 默认启用 security_headers 中间件,会静默覆盖 Symfony/Laravel 设置的 X-Content-Type-Options、X-Frame-Options 等头——这看似加固,实则破坏应用层安全策略的一致性。
- 在
Caddyfile的站点块顶部添加:security_headers off - 确保该行位于
php_server或php指令之前 - 如需
Strict-Transport-Security,由应用层(如 Symfony 的framework.security.headers)或 Caddy 的header指令显式声明
Worker 模式下严防连接与内存残留
启用 worker 后,PDO 连接、Redis 客户端、全局静态变量都会跨请求复用,极易引发连接泄漏、事务未提交、内存缓慢增长。
- PDO 必须启用持久连接:
'options' => [PDO::ATTR_PERSISTENT => true],并禁用框架自动 close - 避免在控制器或服务中直接 new PDO();若必须,用
try/finally显式释放资源 - 监控
memory_get_peak_usage(true)和netstat -an | grep :3306 | wc -l,发现缓慢上涨即定位泄漏点
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











