生产环境 OpenVPN 服务端如何配置日志轮转避免磁盘爆满?

文章导读
生产环境最稳妥的做法是配合系统自带的 logrotate 工具,并配置信号通知 OpenVPN 重新打开日志文件,或者直接改用 syslog 统一托管。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

生产环境最稳妥的做法是配合系统自带的 logrotate 工具,并配置信号通知 OpenVPN 重新打开日志文件,或者直接改用 syslog 统一托管。

先说结论:不要依赖 OpenVPN 自身功能,应使用操作系统的 logrotate 机制,并根据日志写入方式选择截断或信号通知。

  • 适合:OpenVPN 配置了本地文件日志且磁盘空间告急的场景
  • 先准备:确认 OpenVPN 日志文件路径及进程 PID 文件位置
  • 验收:手动执行轮转后确认新日志生成且服务无中断

命令速用版

如果你希望立即止血,可以直接创建一个临时的 logrotate 配置文件。以下是一个典型的配置示例,保存为 /etc/logrotate.d/openvpn

/var/log/openvpn.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

如果希望更严谨地通知进程,将 copytruncate 替换为 create 并在 postrotate 中发送信号。

为什么会这样

OpenVPN 服务端启动后会占用日志文件的句柄。如果只通过外部命令删除或移动日志文件,进程仍然握着旧文件的句柄继续写入,磁盘空间不会释放,甚至可能导致写入错误。日志轮转工具需要知道如何安全地切换文件句柄。

分步处理

1. 确认日志路径:查看 server.conf 中的 loglog-append 指令,或者检查 systemd 单元文件中的重定向位置。

2. 编写轮转配置:在 /etc/logrotate.d/ 下新建文件。若使用 copytruncate,无需重启服务,但可能有极短时间日志丢失;若使用信号通知,需确保 PID 文件路径正确。

生产环境 OpenVPN 服务端如何配置日志轮转避免磁盘爆满?

3. 权限检查:确保 logrotate 运行用户有权限读取配置和写入日志目录。

4. 手动测试:使用 logrotate -f /etc/logrotate.d/openvpn 强制执行一次。

怎么验证是否生效

执行手动测试后,检查日志目录。应该看到原日志文件大小归零(copytruncate 模式)或生成新文件(create 模式),同时出现一个压缩的旧日志文件。查看 OpenVPN 进程状态,确认没有意外退出。

常见坑

1. 信号发送失败:如果使用 kill -USR1 通知重启日志,但 PID 文件路径不对,轮转后日志会停止写入。

2. 权限问题:轮转生成的新文件归属可能是 root,导致 OpenVPN 进程无法写入,需配置 create 参数指定用户组。

3. systemd 干扰:如果通过 systemd 管理日志,journalctl 可能已经限制了大小,重复配置文件轮转会导致混乱。