AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1031715
Accepted
x3nr0s
x3nr0s
Asked: 2020-08-28 02:23:03 +0800 CST2020-08-28 02:23:03 +0800 CST 2020-08-28 02:23:03 +0800 CST

NGINX 服务轮换不使用新的日志文件

  • 772

我对任何告诉 nginx 使用新日志文件的命令都有问题。我正在使用 Ubuntu 18.04、nginx/1.14.0、logrotate 3.11.0

如果我手动或通过 logrotate 在 /var/log/nginx 中创建新文件access.log或error.log文件,它们不会被使用,而是服务使用旧的日志文件(我已将其重命名为access.log.1用于此测试,模拟 logrotate 的作用。)

我已经尝试了以下命令(单独)。它们都不会产生任何错误消息,它们都会产生预期的输出。但是 nginx 拒绝停止使用旧日志。

service nginx rotate

invoke-rc.d nginx rotate

kill -USR1 `cat /var/run/nginx.pid`

我还验证了上述.pid文件在正确的位置。

我能够让日志轮换工作的唯一方法是通过 a service nginx reload,它可以完成这项工作,但也会重新加载配置文件。我知道重新加载没有停机时间,但我仍然希望尽可能少地重新加载,这就是我想要开始service nginx rotate工作的原因。

我几乎可以肯定这是由于/var/log. 最近我们设置了一个 cronjob 来确保日志文件具有安全的权限。这是为了进行审计,因为这家渗透测试公司就日志记录提出了各种安全措施。我们设置的 cronjob 在启动时运行:

#!/bin/bash
  
setfacl -Rm u::rwx,g::r--,o::--- /var/log
find /var/log -type f -exec chmod g-wx,o-rwx "{}" + -o -type d -exec chmod g-w,o-rwx "{}" +
chmod g+wx /var/log

chown -R www-data:adm /var/log/nginx

下面是运行cronjob后相关目录和文件的权限:

/var/log 目录本身:

drwxrwx--- 14 root syslog  4096 Aug 27 10:01 log

/var/log/nginx 目录本身:

drwxr-----  2 www-data  adm               4096 Aug 24 02:25  nginx

以及 /var/log/nginx 的内容(我们在 nginx conf 中使用自定义命名日志):

-rwxr----- 1 www-data adm     0 Aug 24 02:24 access.log
-rwxr----- 1 www-data adm   108 Aug 24 02:24 error.log
-rwxr----- 1 www-data adm 49317 Aug 27 10:11 x3nr0s.access.log
-rwxr----- 1 www-data adm   798 Aug 27 10:02 x3nr0s.error.log

如果我们运行logrotate --force /etc/logrotate.d/nginx -v(详细),甚至是手动touch创建新文件,它们会被创建为 640 权限(根据 logrotate 的配置文件)。根据我的阅读,640 就足够了:

-rwxr----- 1 www-data adm     0 Aug 24 02:24 access.log
-rw-r----- 1 www-data adm     0 Aug 27 10:13 error.log
-rwxr----- 1 www-data adm  1972 Aug 27 10:13 error.log.1
-rw-r----- 1 www-data adm     0 Aug 27 10:13 x3nr0s.access.log
-rwxr----- 1 www-data adm 51521 Aug 27 10:13 x3nr0s.access.log.1
-rw-r----- 1 www-data adm     0 Aug 27 10:13 x3nr0s.error.log
-rwxr----- 1 www-data adm   798 Aug 27 10:02 x3nr0s.error.log.1

如您所见,新文件保持为空,并且日志记录继续到旧文件。我还验证了详细的 logrotate 输出,关于 postrotate 部分似乎一切正常。(运行invoke-rc.d nginx rotate。正如我之前提到的,这个命令似乎没有旋转任何东西......)

作为最后一个测试,我尝试授予用户对新文件的执行权限,并执行了service nginx rotate. 尽管如此,nginx 仍然使用旧文件。其他一些答案提到检查磁盘空间是否已满。它不是。

非常感谢您的帮助!谢谢。

更多信息

这是我的 /etc/logrotate.d/nginx 配置:

/var/log/nginx/*.log {
        daily
        missingok
        rotate 14
        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
}

如上所述,我让 logrotate 和 nginx 正确处理新日志文件的唯一方法是将postrotate部分替换为service nginx reload.

这是输出ps -ef | grep nginx:

root      1367     1  0 10:45 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  1368  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1369  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1370  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1371  1367  0 10:45 ?        00:00:00 nginx: worker process
root     15247 14835  0 11:19 pts/0    00:00:00 grep --color=auto nginx

这是getfacl/var/log 上的:

# file: var/log
# owner: root
# group: syslog
user::rwx
group::rwx
other::---

这是getfacl/var/log/nginx 上的:

# file: var/log/nginx
# owner: www-data
# group: adm
user::rwx
group::r--
other::---
linux ubuntu nginx logrotate
  • 1 1 个回答
  • 3730 Views

1 个回答

  • Voted
  1. Best Answer
    Déjà vu
    2020-08-28T05:18:00+08:002020-08-28T05:18:00+08:00

    这/etc/logrotate.d/nginx是默认的,应该可以工作。

    但是,更改postrotate.d命令,强制 nginx 重新加载其配置(并使用新的日志文件)

      service nginx reload >/dev/null 2>&1
    

    可能是一个快速修复。

    通常,当正常工作的服务无法创建/打开/重命名/更改文件时,会涉及访问权限。

    此处访问已更改(为了安全起见),但默认 acl 也应该可以工作/安全,不涉及哪个功能强大,但在使用默认选项setfacl时不会立即出现。ls

    默认 acl 是,对于/var/log

    drwxrwxr-x 18 root syslog 4096 Aug 27 07:25 /var/log/
    

    而默认的 nginx(实际上)是

    drwxr-x--- 2 www-data adm 4096 Aug 27 07:25 /var/log/nginx/
    

    nginx很好,/var/log可能会更紧一点

    drwxrwx--x 18 root syslog 4096 Aug 27 07:25 /var/log/
    

    允许others访问目录(及以下)但阻止他们列出内容。

    至于 facl,该getfacl命令将列出为 和 实际添加的 ACL ,/var/log这可能会揭示问题。/var/log/nginx/var/log/nginx/*

    顺便说一句,也做一个

    dpkg-statoverride --list
    

    检查安装程序在更新或安装后将设置哪些 ACL,并在必要时更改或添加一行(man dpkg-statoverride)

    • 3

相关问题

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve