Nginx日志路径可自定义:全局配置在http块中,server块可覆盖;需确保目录存在且Nginx用户有写权限;配合logrotate实现轮转,用USR1信号重开日志;修改后需nginx -t验证并reload生效。

默认情况下,Nginx 的 access_log 和 error_log 会写入系统预设路径(如 /var/log/nginx/access.log 和 /var/log/nginx/error.log),但你完全可以自定义它们的存储位置——只需在配置文件中明确指定路径和可选参数即可。
指定全局日志路径(推荐用于统一管理)
在 nginx.conf 的 http 块中设置,会影响所有 server 块(除非被局部覆盖):
http {
# 全局访问日志:路径 + 日志格式(需提前定义 log_format)
access_log /data/logs/nginx/access.log main;
<pre class="brush:php;toolbar:false;"># 全局错误日志:路径 + 日志级别(debug/info/notice/warn/error/crit/alert/emerg)
error_log /data/logs/nginx/error.log warn;
# (可选)自定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';}
注意:
- 路径必须是 Nginx 工作进程有写权限的目录(通常为 www-data 或 nginx 用户);
- 若目录不存在,需手动创建并赋权,例如:sudo mkdir -p /data/logs/nginx && sudo chown nginx:nginx /data/logs/nginx;
- error_log 级别设为 warn 可减少冗余信息,调试时可临时改为 info 或 debug(需编译时启用 debug 日志支持)。
为特定站点单独配置日志路径
在某个 server 块内覆盖全局设置,实现按域名或应用隔离日志:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 单独的访问日志(关闭该站点的访问日志可设为 off)
access_log /data/logs/example_com/access.log main;
# 单独的错误日志(不继承 http 块的 error_log,仅记录本 server 的 error 级别以上事件)
error_log /data/logs/example_com/error.log error;
location / {
root /var/www/example;
}}
说明:
- 多个 server 块可各自使用不同路径,便于运维排查;
- 若某站点无需记录访问日志,直接写 access_log off; 即可;
- error_log 在 server 块中只影响该虚拟主机的 *error* 及更高级别错误(如 connection refused、upstream timeout),底层核心错误仍记在全局 error_log 中。
启用日志分割与自动轮转(避免单文件过大)
Nginx 本身不内置日志轮转,需配合外部工具(如 logrotate)或通过信号重开日志文件:
- 用
logrotate配置示例(/etc/logrotate.d/nginx):
/data/logs/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 nginx nginx
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}关键点:
- kill -USR1 是 Nginx 的“重新打开日志文件”信号,收到后会关闭旧文件、打开新文件;
- create 确保轮转后新建的日志文件权限正确;
- 不要用 kill -HUP(重载配置),它不保证日志文件立即切换。
验证配置并生效
修改完成后务必检查语法并重载服务:
-
sudo nginx -t—— 检查配置是否合法; -
sudo nginx -s reload或sudo systemctl reload nginx—— 平滑重载,不中断请求; - 访问对应站点后,执行
ls -l /data/logs/nginx/确认日志文件已生成且大小非零; - 用
tail -f /data/logs/nginx/access.log实时观察新请求是否写入。
若日志无内容,常见原因包括:路径权限不足、父目录不存在、SELinux/AppArmor 限制、或配置未被实际加载(检查是否编辑了错误的 conf 文件)。


















