nginx access_log用于记录http请求详情,支持在http、server、location块中配置,优先级为location>server>http,需确保路径可写、格式合法并用nginx -t和-s reload验证生效。

Nginx 的 access_log 用于记录每个 HTTP 请求的详细信息,是排查问题、分析流量和安全审计的基础。配置它不难,但需注意层级关系、权限、格式定义和路径有效性。
确认日志模块已启用
Nginx 默认编译时已包含 ngx_http_log_module,无需额外加载。只要配置语法正确,access_log 就能生效。
在合适的作用域中配置 access_logaccess_log 可出现在 http、server 或 location 块中,优先级由高到低:location > server > http。
例如:
-
全局默认(写入所有虚拟主机):
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; } -
单独为某个域名设置日志文件:
server { server_name example.com; access_log /var/log/nginx/example_access.log main; } -
仅为 API 接口路径单独记日志(不记录静态资源):
location /api/ { access_log /var/log/nginx/api_access.log main; proxy_pass http://backend; }
确保日志路径可写
Nginx 工作进程(通常是 www-data 或 nginx 用户)必须对日志目录有写权限。
检查并修复示例:
sudo mkdir -p /var/log/nginx sudo chown nginx:nginx /var/log/nginx sudo chmod 755 /var/log/nginx
验证配置并重载
修改后务必测试语法,再平滑重载:
nginx -t # 检查配置是否合法 nginx -s reload # 重新加载配置,不中断服务
常见字段说明(供自定义 log_format 时参考)
-
$remote_addr:客户端真实 IP(若前端有代理,需配合$http_x_forwarded_for使用) -
$time_local:请求接收时间(服务器本地时区) -
$request:请求行,如"GET /index.html HTTP/1.1" -
$status:HTTP 状态码,如200、404、502 -
$body_bytes_sent:响应体字节数(不含响应头) -
$http_user_agent:浏览器或客户端标识 -
$http_x_forwarded_for:代理链中真实的客户端 IP(需上游透传)
关闭某处日志也很简单
在 server 或 location 中写:
access_log off;
即可禁用该作用域下的访问日志。
不复杂但容易忽略。











