nginx通过原生syslog模块将脱水后的安全日志(仅含高危路径与关键状态码组合)发送至本地rsyslog,再分流落盘+异地转发,实现秒级、不丢、可筛选的备份。

直接把 Nginx 的 access_log 推给本地 Syslog 服务,实现秒级、不丢、可筛选的异地脱水备份,关键不在“怎么连”,而在“连得准、筛得细、传得稳”。下面分四块说清楚:
一、先让 Nginx 支持原生 Syslog 输出
确认你的 Nginx 编译时启用了 --with-http-syslog-module:
nginx -V 2>&1 | grep syslog
没输出?得重编译或换发行版(如 OpenResty 默认带)。
有输出,才能在 server 块里写:
access_log syslog:server=127.0.0.1:514,facility=local6,tag=nginx_sec,severity=info;
注意:server=127.0.0.1 是指本地 Syslog 服务(如 rsyslog),不是远程;tag 用于后续分流识别。
二、只录核心安全路径与关键状态码(脱水第一步)
别全量打日志。用 map 提前标记高危行为,再用 if 控制是否记录:
# 在 http 块中定义
map $request_uri $is_sec_path {
~*/admin/|/api/v1/user/login|/wp-login.php "1";
default "0";
}
map $status $is_alert_code {
~^(403|404|500|502|503)$ "1";
default "0";
}
# 定义一个复合条件变量
map "$is_sec_path:$is_alert_code" $log_sec {
"1:1" "1"; # 同时命中路径+状态码才记
"1:0" "0";
"0:1" "0";
default "0";
}
然后在 server 块中启用条件日志:
access_log syslog:server=127.0.0.1:514,facility=local6,tag=nginx_sec,severity=info if=$log_sec;
这样只有 /admin/ 返回 500,或 /wp-login.php 返回 403 这类组合才会进 Syslog——真正实现“脱水”。
通过 yarn-threads-cli 与 Threads(Meta)交互。当用户想要阅读首页动态、点赞、收藏的帖子或特定帖子时使用;查看...
三、本地 Syslog 服务(如 rsyslog)精准分流与落地
确保 rsyslog 启用了 UDP/TCP 监听(/etc/rsyslog.conf):
module(load="imudp") input(type="imudp" port="514") module(load="imtcp") input(type="imtcp" port="514")
再建规则文件 /etc/rsyslog.d/20-nginx-sec.conf:
# 匹配 nginx_sec 标签 + local6 设施的日志
if $syslogtag == 'nginx_sec:' and $syslogfacility-text == 'local6' then {
# 写入独立文件(带时间戳滚动)
action(type="omfile" file="/var/log/nginx/sec_access_$(date -d @%timereported:date-hour%).log"
template="RSYSLOG_FileFormat")
# 同时转发到远端 Kafka 或 Loki(异地备份)
action(type="omkafka" topic="nginx_sec" broker=["192.168.100.20:9092"])
stop
}
这样既本地落盘(小时级切片),又实时发往异地分析平台,双保险。
四、验证与防丢保障
-
防丢:Syslog TCP 比 UDP 更可靠,建议把
access_log改为syslog:server=127.0.0.1:514,tcp,...;rsyslog 端加RebindInterval="60"防连接中断。 -
验证:手动触发一次
/admin/403,立刻查:tail -f /var/log/nginx/sec_access_$(date +%Y%m%d-%H).log # 或查 rsyslog 转发是否成功 journalctl -u rsyslog | grep nginx_sec
-
压测兜底:单 IP 短时请求超 100 次/秒时,Nginx 自身 buffer 可能溢出,建议加:
access_log ... buffer=64k flush=1s;
避免 burst 流量冲垮缓冲。
不复杂但容易忽略。










