• 微信
    咨询
    微信在线咨询 服务时间:9:00-18:00
    纵横数据官方微信 使用微信扫一扫
    马上在线沟通
  • 业务
    咨询

    QQ在线咨询 服务时间:9:00-18:00

    选择下列产品马上在线沟通

    纵横售前-老古
    QQ:519082853 售前电话:18950029581
    纵横售前-江夏
    QQ:576791973 售前电话:19906048602
    纵横售前-小李
    QQ:3494196421 售前电话:19906048601
    纵横售前-小智
    QQ:2732502176 售前电话:17750597339
    纵横售前-燕子
    QQ:609863413 售前电话:17750597993
    纵横值班售后
    QQ:407474592 售后电话:18950029502
    纵横财务
    QQ:568149701 售后电话:18965139141

    售前咨询热线:

    400-188-6560

    业务姚经理:18950029581

  • 关注

    关于纵横数据 更多优惠活动等您来拿!
    纵横数据官方微信 扫一扫关注官方微信
  • 关闭
  • 顶部
  • 您所在的位置 : 首页 > 新闻公告 > 重庆云主机Nginx日志轮转如何配置?

    重庆云主机Nginx日志轮转如何配置?

    Nginx默认不会自动切割日志文件,这一点很多运维新手容易忽略。一台重庆云主机上的Nginx跑上大半年没人管,access.log一个文件就能膨胀到几十GB,直接把系统盘撑满,导致网站无法访问、SSH登录都变得卡顿。日志轮转就是解决这个问题的核心手段,它能自动将旧日志归档、压缩、清理,确保磁盘空间始终可控。下面从工具选型到完整配置,一步步讲清楚怎么做。

    一、为什么必须做日志轮转

    Nginx的访问日志和错误日志会随着请求量持续增长,如果不加干预,一个日均百万PV的网站,单月access.log就能轻松超过10GB。日志文件过大会带来三个直接问题:第一,磁盘空间被持续蚕食,最终导致系统盘满、服务崩溃;第二,用grep、awk等工具检索超大日志文件时速度极慢,排查线上问题效率大打折扣;第三,日志文件过大时,Nginx写入日志的I/O开销也会增加,影响整体性能。

    日志轮转的本质就是给日志建立一套"生命周期管理机制",定期将当前日志重命名归档,创建新的空日志文件继续写入,同时对过期归档进行压缩或清理。

    二、选择logrotate:Linux自带的日志管理利器

    Linux系统自带的logrotate是管理Nginx日志轮转的最佳选择,绝大多数发行版都已经预装。它的优势在于配置简单、运行稳定、支持按时间或文件大小触发轮转,并且内置了压缩、权限设置、自定义脚本等实用功能。

    先确认系统是否已安装logrotate,执行以下命令:

    logrotate --version

    如果输出了版本信息,说明已经就绪。如果没有安装,Ubuntu或Debian系统执行sudo apt install -y logrotate,CentOS或RHEL系统执行sudo yum install -y logrotate。

    三、编写Nginx日志轮转配置文件

    logrotate的应用级配置统一放在/etc/logrotate.d/目录下,每个服务一个独立文件。创建Nginx的轮转配置文件:

    sudo nano /etc/logrotate.d/nginx

    写入以下内容:

    /var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
    if [ -f /var/run/nginx.pid ]; then
    kill -USR1 cat /var/run/nginx.pid
    fi
    endscript
    }

    下面逐行解释每个参数的作用。

    /var/log/nginx/*.log是匹配规则,表示对Nginx日志目录下的所有.log文件执行轮转。如果你的Nginx日志路径不同,需要相应修改。

    daily表示每天执行一次轮转。也可以替换为weekly(每周)、monthly(每月),或者使用size 100M表示当日志文件达到100MB时触发轮转。对于流量较大的网站,建议用size参数替代daily,避免单天内日志量过大来不及切割。

    missingok表示如果日志文件不存在,直接跳过不报错,避免在某些特殊情况下轮转任务中断。

    rotate 30表示保留最近30份归档日志,超过30份的最旧归档会被自动删除。这个数值根据你的磁盘空间和合规留存要求来定,一般14到30天足够日常排查使用。

    compress表示对归档日志使用gzip压缩,一个几百MB的日志文件压缩后通常只有几十MB,大幅节省磁盘空间。

    delaycompress表示延迟一次压缩,最近一次轮转产生的归档文件暂不压缩,等到下一次轮转时再压缩。这样做的好处是,如果你需要查看昨天的日志,可以直接打开未压缩的文件,不用先解压。

    notifempty表示如果日志文件为空,则跳过轮转,避免产生一堆无意义的空归档文件。

    create 0640 nginx adm表示轮转后创建新的日志文件,权限设为0640,属主为nginx,属组为adm。这里的用户名和组名需要根据你实际的Nginx运行用户来调整,比如Ubuntu系统下Nginx默认以www-data用户运行,就应该写成create 0640 www-data www-data。

    sharedscripts表示当匹配到多个日志文件时,postrotate脚本只执行一次,而不是每个文件都执行一次。这对于Nginx来说很重要,因为只需要给Nginx进程发一次信号就够了。

    postrotate和endscript之间包裹的是轮转完成后要执行的脚本。核心操作是kill -USR1向Nginx主进程发送USR1信号,通知它重新打开日志文件。这一步至关重要,因为轮转只是把旧日志文件重命名了,Nginx进程仍然持有旧文件的文件描述符,如果不发信号让它重新打开,Nginx会继续往已经被重命名的旧文件里写数据,新的access.log就不会有任何内容。USR1信号触发的是优雅重开操作,不会中断当前正在处理的请求,对线上服务零影响。

    四、一个真实案例:从磁盘告警到自动轮转

    某团队在重庆云主机上部署了一套API网关服务,Nginx作为统一入口,后端对接多个微服务。上线初期没有配置日志轮转,运营三个月后某天凌晨收到云监控告警,系统盘使用率达到100%。登录服务器执行df -h查看,发现根分区已经满了,再用du -sh /var/log/nginx/*排查,发现access.log一个文件就占了23GB。

    紧急处理方式是先手动执行echo "" > /var/log/nginx/access.log清空日志释放空间,恢复服务。但这种方式治标不治本,清空操作会导致正在写入的日志丢失,而且文件描述符没有释放,磁盘空间实际上并没有完全回收,需要重启Nginx才能真正释放。

    按照上述方案配置好logrotate后,将轮转策略设为daily、保留30天、开启压缩。一个月后查看/var/log/nginx/目录,旧的日志文件被自动命名为access.log.1、access.log.2.gz等格式,最大的单个文件不超过500MB,磁盘占用从原来的20多GB降到了不到2GB,问题彻底解决。

    五、按文件大小轮转:应对突发流量的策略

    如果你的网站流量波动较大,纯按天轮转可能不够灵活。比如大促期间一天的日志量可能超过10GB,而平时只有几百MB。这时可以改用按大小触发的方式:

    /var/log/nginx/*.log {
    size 500M
    rotate 10
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
    if [ -f /var/run/nginx.pid ]; then
    kill -USR1 cat /var/run/nginx.pid
    fi
    endscript
    }

    size 500M表示当日志文件达到500MB时立即触发轮转,不受时间周期限制。这种方式能确保单个日志文件永远不会过大,特别适合流量不可预测的场景。

    六、测试与验证

    配置完成后,先用调试模式检查配置是否有语法错误:

    sudo logrotate -d /etc/logrotate.d/nginx

    -d参数表示调试模式,它会模拟执行轮转过程并输出详细的操作日志,但不会真正执行任何文件操作。如果输出中没有报错信息,说明配置正确。

    确认无误后,可以强制执行一次轮转来验证效果:

    sudo logrotate -f /etc/logrotate.d/nginx

    -f参数表示强制执行,忽略时间或大小条件,立即执行轮转。执行后查看/var/log/nginx/目录,应该能看到旧的日志文件被重命名,同时生成了新的空日志文件。再用curl访问一下网站,检查新的access.log中是否有新的请求记录,确认Nginx已经正确切换到新文件写入。

    七、常见坑位提醒

    第一个坑是轮转后日志不写入新文件。原因几乎都是因为postrotate脚本没有正确执行,或者Nginx的PID文件路径不对。不同发行版的Nginx PID文件位置可能不同,常见路径有/var/run/nginx.pid和/run/nginx.pid,需要根据实际情况调整。

    第二个坑是create指令中的用户名和权限不匹配。如果Nginx以www-data用户运行,但create指令写的是nginx用户,新创建的日志文件Nginx进程没有写入权限,会导致500错误或日志丢失。

    第三个坑是在Docker容器环境中,宿主机的logrotate无法直接向容器内的Nginx发送信号。这种情况下建议将Nginx的access_log指向stdout,由Docker的日志驱动来管理轮转,通过docker run时的--log-opt max-size和--log-opt max-file参数来控制日志大小和数量。

    总结

    重庆云主机上Nginx的日志轮转配置,核心就是利用Linux自带的logrotate工具,在/etc/logrotate.d/nginx中编写轮转规则。关键配置包括轮转周期或大小阈值、归档保留数量、gzip压缩、以及轮转后通过USR1信号通知Nginx重新打开日志文件。这套方案配置一次即可永久生效,由系统cron自动触发执行,不需要人工干预,是保障Nginx长期稳定运行的基础运维操作。

    纵横云服务器租赁,欢迎随时联系,客服联系方式:QQ3494196421,手机微信19906048601。



    最新推荐


    微信公众帐号
    关注我们的微信