nginx 的 kill -USR1 "cat ${log_path}/nginx.pid"和直接 reload 的区别?

2017-10-09 10:16:35 +08:00
 mentalidade
nginx 的 access_log 太大了,网上找到很多的方法都是 shell 脚本定时凌晨 mv 到另一个文件里。
然后使用 kill -USR1 "cat ${log_path}/nginx.pid"重新生成新的日志文件。

我的疑问是:
为什么不 reload 呢?貌似 reload 也可以生成新的日志。
求问各位大佬
5551 次点击
所在节点    程序员
17 条回复
holyghost
2017-10-09 10:23:20 +08:00
HUP changing configuration, keeping up with a changed time zone (only for FreeBSD and Linux), starting new worker processes with a new configuration, graceful shutdown of old worker processes

USR1 re-opening log files

如果只是 log rotate 的话,可以,但是不应该
mentalidade
2017-10-09 10:48:26 +08:00
@holyghost 那就是推荐第一种方式了。谢谢大佬
oaix
2017-10-09 11:21:49 +08:00
有种通用的方式清空文件.
echo > 文件名
如果在 linux 上使用 bash, echo 也可以不要.
mentalidade
2017-10-09 11:32:27 +08:00
@oaix 并不是清空,只是把日志按照每天的日期存放在不同的文件,这些日志还有用呢。 不过直接 mv 之后并不会生成新的 access_log 文件,reload 或者第一种方法就可以生成新的 access_log 文件了
0ZXYDDu796nVCFxq
2017-10-09 12:07:44 +08:00
kill -USR1 等于 nginx -s reopen
这个信号量本来就是用于重新读取日志文件的
kill -USR2 等于 nginx -s reload

reload 和 reopen 的行为相差很大,reopen 仅仅检查日志文件,reload 会重载配置,并启动新 worker,关闭旧 worker

具体参考官方文档:
http://nginx.org/en/docs/beginners_guide.html
mentalidade
2017-10-09 12:46:28 +08:00
@gstqc 懂了,非常感谢
ayiis
2017-10-09 14:07:09 +08:00
试试从源头上解决你的问题(按日期生成 log 文件):
```bash
# save as new logfile by date
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}

access_log logs/access.log_$year.$month.$day main;

```
mentalidade
2017-10-09 14:15:21 +08:00
@ayiis 我感觉这种毕竟要修改 nginx.conf 文件,引入变量,性能方面也不知道,这个 mv 文件的没有任何其他的侵入性
lgpqdwjh
2017-10-09 14:15:23 +08:00
@ayiis

这里的 if 是每请求的, 换成 or 来做这样的操作才是合适的。
ryd994
2017-10-09 14:33:06 +08:00
@ayiis 各大发行版都是用 logrotate,你觉得是为什么

if is evil 不解释
0ZXYDDu796nVCFxq
2017-10-09 14:40:44 +08:00
@ayiis 这个效率会非常感人
1. if 效率低,容易出错
2. access_log 的文件名使用变量,无法使用写缓存,而且每次写日志,都会打开文件、关闭文件。就是说,每一个有日志的请求,都会产生打开文件、关闭文件的操作。

合理的做法是每天跑一下 mv 文件,nginx -s reopen
janxin
2017-10-09 14:57:21 +08:00
我用 logrotate
0ZXYDDu796nVCFxq
2017-10-09 14:57:34 +08:00
@gstqc @mentalidade
纠正一下 #5,reload 的信号量是 HUP
USR2 是用于二进制升级的
rainyday031
2017-10-09 16:05:53 +08:00
配置 logrotate,更简单方便
ayiis
2017-10-09 16:18:41 +08:00
@ryd994 用 logrotate 没问题。但 if 只在 location 下有问题,access_log 在 server 里用应该 OK

@gstqc 效率确实是低了点。我们这的每天抗 500w 访问量的 2 核 4G 的服务器 nginx 状态
Reading: 0 Writing: 211 Waiting: 0
还算及格吧,感觉 CPU 还能接受

向各位学习并自我检讨。
mentalidade
2017-10-09 16:32:49 +08:00
@gstqc 收到,
julyclyde
2017-10-09 16:41:05 +08:00
/etc/init.d/nginx reload 等同于 nginx -s reload 就等同于 kill HUP

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX