必须单独配置nginx的access_log与error_log路径、格式及开关状态;在server块顶层声明日志路径,在http块定义含$request_time和$upstream_response_time的laravel_format,php location中关闭access_log,配置logrotate实现每日轮转。

要让Laravel项目在Nginx上运行时能准确记录访问行为、便于后续分析真实请求路径和错误来源,必须单独配置access_log与error_log的输出位置、格式及开关状态,不能依赖Nginx全局默认设置。
明确日志路径与权限归属
进入Nginx站点配置文件(如/etc/nginx/sites-available/myapp),在server块顶层添加两行日志声明:
access_log /var/log/nginx/myapp_access.log laravel_format;
error_log /var/log/nginx/myapp_error.log warn;
这两行必须写在location块外部,否则会被子块继承覆盖。日志目录/var/log/nginx/需确保Nginx工作用户(通常是www-data或nginx)有写入权限,执行sudo chown www-data:www-data /var/log/nginx/可修正归属。
定义Laravel专用日志格式
在/etc/nginx/nginx.conf的http块内(非server或location),插入自定义格式声明:
log_format laravel_format '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
这个格式比默认combined多出$request_time(Nginx处理总耗时)和$upstream_response_time(PHP-FPM响应耗时),是定位Laravel慢请求的关键依据。漏掉$upstream_response_time会导致无法区分是Nginx卡顿还是PHP执行缓慢。
关闭不必要的日志写入
在location ~ \.php$块中显式关闭access_log,避免PHP脚本调用被重复记录:
location ~ \.php$ {
access_log off;
# 其余fastcgi参数保持不变
}
【必须关闭】否则每个AJAX接口、图片上传、甚至favicon.ico的PHP处理都会在access_log里生成一条冗余记录,导致日志体积暴增且干扰真实用户行为分析。
按日期自动切割日志文件
创建日志轮转配置文件/etc/logrotate.d/nginx-myapp:
/var/log/nginx/myapp_*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
这一步确保每天0点自动归档旧日志,保留最近30天压缩文件。不配postrotate里的kill -USR1,Nginx会继续往已重命名的旧文件里写,造成日志丢失。
验证日志是否生效
方法一:重启Nginx并触发一次页面访问
sudo nginx -t && sudo systemctl reload nginx → curl -I http://localhost
方法二:直接检查日志文件是否产生新内容
sudo tail -n 1 /var/log/nginx/myapp_access.log
若看到类似127.0.0.1 - - [27/Aug/2026:17:34:05 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.81.0" 0.012 0.011的条目,说明Laravel专用日志已正常捕获请求。注意末尾两个时间值不为零,证明$upstream_response_time已成功注入。











