rsyslog可通过TLS加密转发Nginx日志实现安全集中管理:Nginx经pipe或syslog输出至本地rsyslog,后者启用gtls模块、证书及6514端口TLS转发,服务端监听并按facility/IP分类存储,需验证模块加载、证书权限、防火墙及时间同步。

rsyslog 可以通过 TLS 加密将 Nginx 日志转发到远程日志服务器,实现安全、集中化的日志管理。关键在于:Nginx 本身不直接支持 TLS 发送日志,需借助 pipe 或 syslog 模块配合 rsyslog 的输入/输出能力完成衔接;加密依赖 rsyslog 的 TLS 配置,中心化则依赖 rsyslog 的转发与接收角色分工。
一、让 Nginx 日志进入 rsyslog 管道
Nginx 支持将 access_log 和 error_log 输出到 syslog 设施(如 local7),但默认不加密。更可控的方式是使用 pipe 将日志行实时喂给 rsyslog 的本地 Unix socket 或 TCP 输入端口。
- 在
/etc/nginx/nginx.conf中配置:
然后创建命名管道并设置权限:
mkfifo /var/run/nginx-logs.pipechown nginx:adm /var/run/nginx-logs.pipe
再配置 rsyslog 从该管道读取(需启用 imfile 模块):
$ModLoad imfile
$InputFileName /var/run/nginx-logs.pipe
$InputFileTag nginx-access:
$InputFileStateFile nginx-access-state
$InputFileSeverity info
$InputFileFacility local7
$InputRunFileMonitor on
二、配置 rsyslog 启用 TLS 加密转发
rsyslog 使用 omfwd 模块 + TLS 参数向远端服务器发送日志。需提前准备证书(CA、客户端证书+私钥)。
- 确保已安装并启用
gtls支持(Debian/Ubuntu 默认含,RHEL/CentOS 可能需rsyslog-gnutls包) - 在转发配置中指定 TLS 参数:
$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/client.crt
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/client.key
*.info;local7.info @@(o)log-server.example.com:6514 # (o) 表示启用 TLS
注意:@@ 是 TCP 协议,@ 是 UDP(不支持 TLS);(o) 是旧语法兼容标记,新版本推荐用 tcp_framing="octet-counted" 配合 tls="on"。
三、中心日志服务器端配置(接收 + 存储)
中心服务器需运行 rsyslog 并启用 TLS 监听,按来源或 facility 分类写入不同文件。
- 加载 TLS 输入模块并监听:
$ModLoad imtcp
$ModLoad gtls
$InputTCPServerRun 6514
# TLS 配置
$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/server.crt
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/server.key
# 允许来自 Nginx 主机的连接(可选 IP 过滤)
$InputTCPServerStreamDriverAuthMode x509/name
$InputTCPServerStreamDriverPermittedPeer nginx-client.example.com
- 按 facility 路由并写入结构化路径(例如按天归档):
template(name="NginxDailyFile" type="string" string="/var/log/central/nginx/%FROMHOST%/%$YEAR%-%$MONTH%-%$DAY%.log")
if $syslogfacility-text == 'local7' then ?NginxDailyFile & stop
四、验证与常见问题处理
调试阶段建议分步确认各环节是否生效:
- 检查 Nginx 是否成功写入管道:
echo "test" > /var/run/nginx-logs.pipe && tail -n1 /var/log/syslog - 查看 rsyslog 是否加载了模块:
rsyslogd -v | grep -i tls - 抓包验证加密:
tcpdump -i any port 6514 -w tls.pcap,用 Wireshark 打开应看不到明文日志 - 若连接被拒绝,检查防火墙、SELinux(RHEL)、服务端证书 CN 是否匹配客户端所连域名
- 时间不同步会导致 TLS 握手失败,确保所有节点 NTP 同步
不复杂但容易忽略:Nginx 的 pipe 写入是阻塞式,若 rsyslog 崩溃或管道未被读取,Nginx 可能卡住 —— 生产环境建议加 buffer 或改用 syslog + omfwd 组合,并监控管道状态。


















