V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mentalidade
V2EX  ›  程序员

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

  •  
  •   mentalidade · 2017-10-09 10:16:35 +08:00 · 5537 次点击
    这是一个创建于 2607 天前的主题,其中的信息可能已经有所发展或是发生改变。
    nginx 的 access_log 太大了,网上找到很多的方法都是 shell 脚本定时凌晨 mv 到另一个文件里。
    然后使用 kill -USR1 "cat ${log_path}/nginx.pid"重新生成新的日志文件。
    
    我的疑问是:
    为什么不 reload 呢?貌似 reload 也可以生成新的日志。
    求问各位大佬
    
    17 条回复    2017-10-09 16:41:05 +08:00
    holyghost
        1
    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
        2
    mentalidade  
    OP
       2017-10-09 10:48:26 +08:00
    @holyghost 那就是推荐第一种方式了。谢谢大佬
    oaix
        3
    oaix  
       2017-10-09 11:21:49 +08:00
    有种通用的方式清空文件.
    echo > 文件名
    如果在 linux 上使用 bash, echo 也可以不要.
    mentalidade
        4
    mentalidade  
    OP
       2017-10-09 11:32:27 +08:00
    @oaix 并不是清空,只是把日志按照每天的日期存放在不同的文件,这些日志还有用呢。 不过直接 mv 之后并不会生成新的 access_log 文件,reload 或者第一种方法就可以生成新的 access_log 文件了
    0ZXYDDu796nVCFxq
        5
    0ZXYDDu796nVCFxq  
       2017-10-09 12:07:44 +08:00   ❤️ 8
    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
        6
    mentalidade  
    OP
       2017-10-09 12:46:28 +08:00 via Android
    @gstqc 懂了,非常感谢
    ayiis
        7
    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
        8
    mentalidade  
    OP
       2017-10-09 14:15:21 +08:00
    @ayiis 我感觉这种毕竟要修改 nginx.conf 文件,引入变量,性能方面也不知道,这个 mv 文件的没有任何其他的侵入性
    lgpqdwjh
        9
    lgpqdwjh  
       2017-10-09 14:15:23 +08:00
    @ayiis

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

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

    合理的做法是每天跑一下 mv 文件,nginx -s reopen
    janxin
        12
    janxin  
       2017-10-09 14:57:21 +08:00 via iPhone
    我用 logrotate
    0ZXYDDu796nVCFxq
        13
    0ZXYDDu796nVCFxq  
       2017-10-09 14:57:34 +08:00   ❤️ 1
    @gstqc @mentalidade
    纠正一下 #5,reload 的信号量是 HUP
    USR2 是用于二进制升级的
    rainyday031
        14
    rainyday031  
       2017-10-09 16:05:53 +08:00
    配置 logrotate,更简单方便
    ayiis
        15
    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
        16
    mentalidade  
    OP
       2017-10-09 16:32:49 +08:00
    @gstqc 收到,
    julyclyde
        17
    julyclyde  
       2017-10-09 16:41:05 +08:00
    /etc/init.d/nginx reload 等同于 nginx -s reload 就等同于 kill HUP
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3160 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:37 · PVG 22:37 · LAX 06:37 · JFK 09:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.