Nginx 记录到 access.log.1 而不是 access.log
Nginx logging to access.log.1 instead of access.log
我知道之前有人问过这个问题,但我相信这是一个不同的问题。
Nginx 在 www-data
:
下运行
$ ps -eo "%U %G %a" | grep nginx
root root nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data www-data nginx: worker process
/var/log/nginx/*
拥有正确的权限:
$ ls -lah /var/log/nginx/
total 291M
drwxr-x--- 2 www-data adm 4.0K Jul 25 06:25 .
drwxrwxr-x 14 root syslog 4.0K Aug 28 06:25 ..
-rw-r----- 1 www-data adm 12K Aug 28 19:03 access.log
-rw-r----- 1 www-data adm 250M Aug 28 18:50 access.log.1
Logrotate 创建具有正确权限的日志文件:
/var/log/nginx/*.log {
( ... )
create 0640 www-data adm
Nginx 在重新启动时记录到 access.log
,但在 logrotate 第一次运行后移动到 access.log.1
。之后,始终记录到 access.log.1
,之后日志文件不再轮换。
编辑:已在评论中指出,您看到 access.log
比 access.log.1
晚访问的原因是因为我在这样做之前重新启动了 nginx ls
,只是为了在此处发帖之前为自己确认,确实重启 nginx 解决了问题(直到下一次 logrotate)。但在此之前 ls
nginx 已经登录到 access.log.1
大约 3 周...
EDIT2:这里是 /etc/nginx/nginx.conf
,提到日志记录的头和位
user www-data;
worker_processes auto;
pid /run/nginx.pid;
( ... )
http {
( ... )
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
( ... )
已解决。
我的问题几乎与 this 相似,但又不完全相同。在那一个中,作者最终解决了问题并说问题是 "nginx was not releasing the file handle to the log file upon receiving the -USR1 signal from kill. Long story short, the reason it was not reloading the log files was because the /var/log/nginx folder was not owned by the same user as the nginx worker processes (owned by www-data, running under web)." 如我们所见,那不是我的问题,因为我的权限是正确的。但是,我去将我的 logrotate 日志与那个问题的日志进行了比较,并发现了一些东西。在那个问题上,kill
信号成功终止,但由于权限原因,nginx 未释放文件句柄。在我的例子中,invoke-rc.d
命令没有成功终止。 nginx 的 logrotate 配置如下:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
注意 postrotate 脚本,这是告诉 nginx 做它的事情的命令,对于另一个线程的作者来说是 kill
信号。在我的 logrotate 日志中,我收到以下错误(顺便说一句,您可以通过执行 sudo logrotate -f -v /etc/logrotate.d/nginx
来强制执行 logrotate):
( last two lines ... )
running postrotate script
error: error running shared postrotate script for '/var/log/nginx/*.log '
当我使用您在 logrotate/nginx 配置中看到的 postrotate 脚本并手动执行它时,出现错误:
$ invoke-rc.d nginx rotate
initctl: invalid command: rotate
Try `initctl --help' for more information.
invoke-rc.d: initscript nginx, action "rotate" failed.
这是 nginx 中的 bug。所以我所做的就是用另一个线程上的人正在使用的命令替换该命令。所以现在我在配置文件上的 logrotate/nginx 后旋转脚本是
postrotate
kill -USR1 `cat /run/nginx.pid`
endscript
这解决了问题。
这里有一些更好的解决方案
https://unix.stackexchange.com/questions/186807/what-does-nginx-s-reopen-do
所以:
postrotate
invoke-rc.d nginx -s reopen >/dev/null 2>&1
endscript
我知道之前有人问过这个问题,但我相信这是一个不同的问题。
Nginx 在 www-data
:
$ ps -eo "%U %G %a" | grep nginx
root root nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data www-data nginx: worker process
/var/log/nginx/*
拥有正确的权限:
$ ls -lah /var/log/nginx/
total 291M
drwxr-x--- 2 www-data adm 4.0K Jul 25 06:25 .
drwxrwxr-x 14 root syslog 4.0K Aug 28 06:25 ..
-rw-r----- 1 www-data adm 12K Aug 28 19:03 access.log
-rw-r----- 1 www-data adm 250M Aug 28 18:50 access.log.1
Logrotate 创建具有正确权限的日志文件:
/var/log/nginx/*.log {
( ... )
create 0640 www-data adm
Nginx 在重新启动时记录到 access.log
,但在 logrotate 第一次运行后移动到 access.log.1
。之后,始终记录到 access.log.1
,之后日志文件不再轮换。
编辑:已在评论中指出,您看到 access.log
比 access.log.1
晚访问的原因是因为我在这样做之前重新启动了 nginx ls
,只是为了在此处发帖之前为自己确认,确实重启 nginx 解决了问题(直到下一次 logrotate)。但在此之前 ls
nginx 已经登录到 access.log.1
大约 3 周...
EDIT2:这里是 /etc/nginx/nginx.conf
,提到日志记录的头和位
user www-data;
worker_processes auto;
pid /run/nginx.pid;
( ... )
http {
( ... )
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
( ... )
已解决。
我的问题几乎与 this 相似,但又不完全相同。在那一个中,作者最终解决了问题并说问题是 "nginx was not releasing the file handle to the log file upon receiving the -USR1 signal from kill. Long story short, the reason it was not reloading the log files was because the /var/log/nginx folder was not owned by the same user as the nginx worker processes (owned by www-data, running under web)." 如我们所见,那不是我的问题,因为我的权限是正确的。但是,我去将我的 logrotate 日志与那个问题的日志进行了比较,并发现了一些东西。在那个问题上,kill
信号成功终止,但由于权限原因,nginx 未释放文件句柄。在我的例子中,invoke-rc.d
命令没有成功终止。 nginx 的 logrotate 配置如下:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
注意 postrotate 脚本,这是告诉 nginx 做它的事情的命令,对于另一个线程的作者来说是 kill
信号。在我的 logrotate 日志中,我收到以下错误(顺便说一句,您可以通过执行 sudo logrotate -f -v /etc/logrotate.d/nginx
来强制执行 logrotate):
( last two lines ... )
running postrotate script
error: error running shared postrotate script for '/var/log/nginx/*.log '
当我使用您在 logrotate/nginx 配置中看到的 postrotate 脚本并手动执行它时,出现错误:
$ invoke-rc.d nginx rotate
initctl: invalid command: rotate
Try `initctl --help' for more information.
invoke-rc.d: initscript nginx, action "rotate" failed.
这是 nginx 中的 bug。所以我所做的就是用另一个线程上的人正在使用的命令替换该命令。所以现在我在配置文件上的 logrotate/nginx 后旋转脚本是
postrotate
kill -USR1 `cat /run/nginx.pid`
endscript
这解决了问题。
这里有一些更好的解决方案
https://unix.stackexchange.com/questions/186807/what-does-nginx-s-reopen-do
所以:
postrotate
invoke-rc.d nginx -s reopen >/dev/null 2>&1
endscript