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 后台操作:

    1. 打开“网站 ➜ 运行环境 ➜ 更多 ➜ 配置 ➜ 容器配置”。
    2. 在“环境变量”面板中新增:
      TZ = Asia/Shanghai
    3. 在“挂载”面板中新增:
      /etc/localtime:/etc/localtime:ro
      /etc/timezone:/etc/timezone:ro
    4. 保存后,1Panel 会自动重启对应容器,无需手动执行 docker restart

    重启完成后,可以在容器里确认:

    docker exec -it php84 date

    输出应为 CST 时间。


  • PHP-FPM 配置 🧩
    即便容器时区正确,PHP-FPM 仍需要显式设置 date.timezone,否则 PHP 的时间函数(Fail2ban 插件也在使用)仍会默认走 UTC。

    在 1Panel 中继续操作:

    1. “网站 ➜ 运行环境 ➜ 更多 ➜ 配置 ➜ FPM 配置文件”。
    2. [www] 区块里添加:
      php_admin_value[date.timezone] = Asia/Shanghai
    3. 保存后 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 的日志分析和自动封禁判断才能真正可信。