site logo

Keep doing what you want, never give up.

文章配图

为什么你的Nginx按天记录access访问日志无效

Nginx的map指令用于将一个变量的值映射给另外一个变量。它就像是一个“查字典”的工具,根据输入的值来查找和返回对应的输出值,我们可以用它来配置一些复杂的规则以简化Nginx配置的条件判断。 一个典型的map应用案例便是用它按日期(通常是按天)来切割Nginx的访问日志,相关的配置网络上已经有很多说明了,也都一样像下面这样配置即可: # 指定Nginx工作进程的用户或组 user nobody bobody; user nobody; # 定义日志记录的内容格式 log_format main '$remote_addr [$time_iso8601] $request ' '$status $body_bytes_sent $http_referer ' '$http_user_agent $http_x_forwarded_for $request_time'; # 将Nginx内置时间变量 $time_iso8601 的值映射到新定义的 $logday 变量 map $time_iso8601 $logday { '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found'; } # 在日志文件名中加入 $logday 日期 access_log logs/access-$logday.log main; 但不一样的是,可能即使你按照上面的配置修改并重启了nginx,但发现nginx并没有像我们希望的那样按日期生成日志,如果你删除之前logs目录中已存在的日志文件并成功执行nginx -s reload后甚至会出现压根就没有生成任何日志文件。 而之所以出现这种现象的原因其实是因为生成日志的nginx进程权限不够,缺少对logs目录的写权限。 知道了原因,那解决方法也非常简单,给logs目录赋予相应的写权限即可: sudo chown -R nobody:nobody sudo chmod -R 755 logs 有了正确的权限Nginx便能像我们期望的那样按天记录日志了。