1Panel PHP 时区排障记录:Typecho 日志超前 8 小时的修复过程🛠️
🔍 最近在排查 Typecho 站点的安全策略时,发现一个异常情况:Access 与 Fail2ban 的日志时间比实际时间快了整整 8 小时,在追踪这个问题的过程中,依次确认了宿主机、容器以及 PHP-FPM 的配置,最终才让日志时间回到正常值。记录如下,方便后续快速复盘。
- 前情提要 🧭
Typecho 后台的 Fail2ban 控制台显示“最后检测”时间比真实时间快 8 小时,同时 Nginx access 日志也是“未来时间”。这意味着从宿主、容器到 PHP-FPM 的时区设置没有统一,导致日志和监控数据失真。
- 宿主机设置 🌏
首先确认 1Panel 所在宿主机的时区已经切换为北京时间:timedatectl status timedatectl set-timezone Asia/Shanghai timedatectl status如果宿主环境不支持 systemd(极简容器),可以直接软链接并写入
/etc/timezone:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone date验证
date已输出 CST,说明宿主时区正常。
-
PHP Docker 容器时区映射 📦
宿主时间正确之后,还要确保 1Panel 管理的 PHP 容器同步到同一时区。我们直接在 1Panel 后台操作:- 打开“网站 ➜ 运行环境 ➜ 更多 ➜ 配置 ➜ 容器配置”。
- 在“环境变量”面板中新增:
TZ = Asia/Shanghai - 在“挂载”面板中新增:
/etc/localtime:/etc/localtime:ro /etc/timezone:/etc/timezone:ro - 保存后,1Panel 会自动重启对应容器,无需手动执行
docker restart。
重启完成后,可以在容器里确认:
docker exec -it php84 date输出应为 CST 时间。
-
PHP-FPM 配置 🧩
即便容器时区正确,PHP-FPM 仍需要显式设置date.timezone,否则 PHP 的时间函数(Fail2ban 插件也在使用)仍会默认走 UTC。在 1Panel 中继续操作:
- “网站 ➜ 运行环境 ➜ 更多 ➜ 配置 ➜ FPM 配置文件”。
- 在
[www]区块里添加:php_admin_value[date.timezone] = Asia/Shanghai - 保存后 1Panel 会自动重载 FPM。
最后验证:
docker exec -it php84 php -r "echo date_default_timezone_get(), PHP_EOL; echo date('Y-m-d H:i:s'), PHP_EOL;"输出应是
Asia/Shanghai和正确的本地时间。
经过以上三步,Typecho 中 “Fail2ban 最后检测时间” 与 Access 日志的时间戳不再超前 8 小时。👍 至此,Fail2ban 的日志分析和自动封禁判断才能真正可信。
版权属于:一名宅。
本文链接:https://zhaiyiming.com/archives/1panl-php-timezone-1.html
转载时须注明出处及本声明