最清晰可靠的方式是在每个server块中配置独立的access_log路径;Nginx不内置按天建新文件功能,需结合动态路径与logrotate等外部工具实现日志轮转。

直接在每个 server 块里配独立的 access_log 路径,是最清晰、最可靠的方式。Nginx 本身不内置“按天自动建新文件”的能力,所谓“自动分割”实际是靠路径动态化 + 外部轮转工具(如 logrotate)或 Nginx 自身变量配合预建目录来实现的。
为每个域名配置专属日志文件
这是基础且必须的第一步。只要 server_name 不同,就分别写明日志路径:
- 确保每个
server块有明确、唯一的server_name,比如www.example.com和api.example.com - 在该
server块内直接写:access_log /var/log/nginx/www.example.com.access.log main; - 路径务必用绝对路径,避免因工作目录变化导致写入失败
- 若需统一格式并带域名上下文,可在
http块定义:log_format domain_log '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent';,然后各server中引用:access_log /var/log/nginx/www.example.com.access.log domain_log;
让日志路径包含日期(如 daily)
Nginx 支持用内置时间变量构造动态路径,但不能执行 shell 命令(如 $(date +%Y%m%d) 无效)。正确做法是用 $time_iso8601 配合 map 提取年月日:
- 在
http块顶部添加:map $time_iso8601 $log_date { ~^(\d{4})-(\d{2})-(\d{2}) "$1$2$3"; } - 在对应
server块中写:access_log /var/log/nginx/www.example.com/access_$log_date.log main; - 注意:目录需提前创建(如
/var/log/nginx/www.example.com/),且 Nginx 工作进程(如 www-data 或 nginx 用户)要有写权限
按年/月/日分层建目录(可选进阶)
如果希望路径像 /var/log/nginx/example.com/2026/07/21/access.log,可用多个 map 拆解时间:
map $time_iso8601 $log_year { ~^(\d{4})-\d{2}-\d{2} "$1"; }map $time_iso8601 $log_month { ~^\d{4}-(\d{2})-\d{2} "$1"; }map $time_iso8601 $log_day { ~^\d{4}-\d{2}-(\d{2}) "$1"; }access_log /var/log/nginx/example.com/$log_year/$log_month/$log_day/access.log main;- 同样要预先建好父级目录,并设好权限;建议搭配
open_log_file_cache减少频繁打开文件的开销
必须配合 logrotate 实现真正“自动切割”
仅靠变量动态路径,只是让每天写入不同文件;要压缩、保留天数、清理旧日志,得靠 logrotate:
- 新建
/etc/logrotate.d/nginx-example,内容示例:
/var/log/nginx/www.example.com/*.log {<br> daily<br> rotate 30<br> compress<br> missingok<br> notifempty<br> create 0640 www-data adm<br> sharedscripts<br> postrotate<br> if [ -f /var/run/nginx.pid ]; then<br> kill -USR1 `cat /var/run/nginx.pid`<br> fi<br> endscript<br>}- 其中
USR1信号会通知 Nginx 重新打开日志文件,无需重启服务 - 确保
logrotate已安装并默认启用(多数系统已自带)


















