生产环境最稳妥的做法是配合系统自带的 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 中的 log 或 log-append 指令,或者检查 systemd 单元文件中的重定向位置。
2. 编写轮转配置:在 /etc/logrotate.d/ 下新建文件。若使用 copytruncate,无需重启服务,但可能有极短时间日志丢失;若使用信号通知,需确保 PID 文件路径正确。
3. 权限检查:确保 logrotate 运行用户有权限读取配置和写入日志目录。
4. 手动测试:使用 logrotate -f /etc/logrotate.d/openvpn 强制执行一次。
怎么验证是否生效
执行手动测试后,检查日志目录。应该看到原日志文件大小归零(copytruncate 模式)或生成新文件(create 模式),同时出现一个压缩的旧日志文件。查看 OpenVPN 进程状态,确认没有意外退出。
常见坑
1. 信号发送失败:如果使用 kill -USR1 通知重启日志,但 PID 文件路径不对,轮转后日志会停止写入。
2. 权限问题:轮转生成的新文件归属可能是 root,导致 OpenVPN 进程无法写入,需配置 create 参数指定用户组。
3. systemd 干扰:如果通过 systemd 管理日志,journalctl 可能已经限制了大小,重复配置文件轮转会导致混乱。