Apache 和 logrotate 配置

Posted

技术标签:

【中文标题】Apache 和 logrotate 配置【英文标题】:Apache and logrotate configuration 【发布时间】:2014-12-16 10:42:30 【问题描述】:

上周我在我的服务器上发现了一个问题,因为磁盘使用率为 100%,我发现 apache 创建了一个 60GB 的巨大 error.log 文件。然后我将 LogLevel 更改为 emerg,但一周后又是 1.3GB,这绝对是太多了。

此外,我有一个 6MB 的 access.log 和一个 167MB 的 other_vhosts_access.log。所以我发现问题可能是 logrotate 不起作用。 实际上,日志的 gzip 文件有一个非常旧的日期(2 月 23 日)。

所以我首先尝试更改 apache2 的 logrotate 文件的配置,为文件添加最大大小,现在看起来像这样:

/var/log/apache2/*.log 
    weekly
    size 500M
    missingok
    rotate 20
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
                if /etc/init.d/apache2 status > /dev/null ; then \
                    /etc/init.d/apache2 reload > /dev/null; \
                fi;
    endscript
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi; \
    endscript

在此之后,我尝试手动强制 logrotate 为 apache 运行特定配置

logrotate -f /etc/logrotate.d/apache2

我得到了这个错误:

error: skipping "/var/log/apache2/access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
error: skipping "/var/log/apache2/error.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
error: skipping "/var/log/apache2/other_vhosts_access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

奇怪的是,它以某种方式运行轮换,创建了一个空的 error.log 文件,但具有与旧文件不同的权限,并且不压缩现有的 error.log。

查看apache日志目录,现在是这样的:

-rwxrwxrwx  1 root           adm            6.3M Oct 21 10:54 access.log
-rwxrwxrwx  1 root           adm             22K Feb 18  2014 access.log.1
-rwxrwxrwx  1 root           adm            7.0K Feb 16  2014 access.log.2.gz
-rwxrwxrwx  1 root           adm            4.0K Feb  9  2014 access.log.3.gz
-rw-------  1 amministratore amministratore    0 Oct 21 10:32 error.log
-rw-r--r--  1 root           root           1.3G Oct 21 10:57 error.log.1
-rwxrwxrwx  1 root           adm            167M Oct 21 10:57 other_vhosts_access.log
-rwxrwxrwx  1 root           adm            225K Feb 23  2014 other_vhosts_access.log.1
-rwxrwxrwx  1 root           adm             16K Feb 15  2014 other_vhosts_access.log.2.gz
-rwxrwxrwx  1 root           adm            3.2K Feb  8  2014 other_vhosts_access.log.3.gz

那么正确的方法是什么?

我应该更改 /var/log/apache2 目录的权限吗? (现在是777)我没有设置这些权限,也不知道对不对。

或者我应该告诉 logrotate 使用哪个用户进行轮换?怎么做?

【问题讨论】:

尊敬的访问者,Apache 配置在 Stack Overflow 上是题外话。请访问unix.stackexchange.com,那里有话题。 @peterh Apache 配置问题在这里是题外话,这根本不是真的。 Stack Overflow 上有数千个。见What topics can I ask about here?。在其他 SE 站点上询问有关特定配置问题(例如安全性或性能)的一些问题可能(或可能不)更合适,但在这里断言所有配置问题都无关紧要是荒谬的。您的声明也是不诚实的,因为您选择编辑问题并告诉所有人这是题外话! @peterh 如果您真的担心 Stack Overflow 上 Apache 配置问题的有效性,请在 Stack Overflow Meta 上提出问题以进行澄清。.. 【参考方案1】:

只需在配置文件中添加su root adm

/var/log/apache2/*.log 
    # …
    su root adm

【讨论】:

su 后面的用户名和组必须匹配日志文件。就我而言,我必须添加:su syslog adm 我不明白为什么 logrotate 关心这个? 答案没有给出任何背景为什么这是一个问题以及解决它的其他方法(也许权限是一个问题!)。不酷。 @Pete,这不是真的。用户/组只需要足够的权限来重命名/截断日志文件并创建新文件。 此答案假定用户和组,并且仅对某些设置的某些用例有效。【参考方案2】:

按照网站的说明,我刚刚更改了 logrotate 配置文件,添加了请求的 su 指令,如下所示,现在它以正确的方式旋转。

su <user> <group>

【讨论】:

刚刚给了你+1。我在一段令人尴尬的时间里遇到了麻烦,想知道为什么我的 anacron logrotate 不起作用。我的日志目录归我所有。在这种情况下,logrotate 需要所有者是 root。所以我将日志目录设置为 root 并将su root me 添加到 logrotate 配置文件中。感谢您发布您的解决方案。 如果链接停止工作,您能总结一下说明吗? 好吧,链接停止工作了!我认为当您在配置文件中指定su &lt;user&gt; &lt;group&gt; 时,logrotate 将作为指定的用户和组运行。 IE。将使用这些权限创建新文件 请尽量避免发布外部链接。链接现已断开。惊喜,惊喜.. 有没有其他方法可以解决这个问题?我们有一个带有动态扩展虚拟主机的网络服务器,我不希望每个站点都有一个 logrotate 配置,但仍想轮换他们的日志。如果logrotate能拿到当前的权限就好了。【参考方案3】:

我在尝试强制轮换系统日志时遇到“父目录的权限不安全”。 以下是我的解决方法:

cat /etc/logrotate.conf
    ...
    # use the syslog group by default, since this is the owning group
    # of /var/log/syslog.
    su root syslog

vim /etc/logrotate.d/rsyslog
    # Add to top:
    su root syslog

logrotate -f /etc/logrotate.d/rsyslog
    # No errors now, log is rotated.

【讨论】:

【参考方案4】:

您可以在 logrotate 配置文件中添加“su”

将父目录的权限更改为 755。在您的情况下:

 chmod 755 /var/log/apache2

【讨论】:

您所做的只是重复几年前在此处发布的其他几个答案中提供的信息,但没有任何细节或解释。在发布之前,您应该检查您不只是在现有答案中重复信息。【参考方案5】:

所有这些答案如何解决logrotate 本身报告的问题? 它说:"...因为父目录具有不安全的权限(它是世界可写或可由非“root”的组写入)。"

我不明白为什么使用su user group 会修复父文件夹权限。而且它不在我的生产系统上(我是后者的管理员)。

这就是我在 1 小时前修复它的方法:制作快乐的 logrotate、webapp 和持续部署。请注意,如果您只想轮换 apache2 日志,则可能不需要这样做,但如果您的日志位于特定的日志文件夹中,它会有所帮助。

假设对于这个用例,出于 CD 权限策略的原因,您的日志文件夹必须归 gitlab-runner 所有,并且您需要保留 Apache 在同一文件夹中创建应用程序日志文件的能力:

这就是诀窍:让您的网络服务器进程能够创建新的应用程序日志文件,同时使该文件夹“可旋转”:

    sudo chown gitlab-runner:root vi /etc/apache2/envvars 将 Apache2 APACHE_RUN_USER:APACHE_RUN_GROUP 更改为 gitlab-runner:gitlab-runner 在 /etc/logrotate.d/apache2 中设置 su gitlab-runner gitlab-runner 重新启动 Apache。

嗯,这是我发现的唯一让所有这些过程都满意的解决方法。 在 logrotate 配置文件中使用 su 本身并没有这样做,因为父文件夹组仍然不是 root。我发现这是一个荒谬的要求。

同样,这个用例是一个更具体的用例,其中 Apache 日志与应用程序日志位于同一日志文件夹中,以试图集中它们。我认为我概述了文件夹组要求:“root”可能会有所帮助。

【讨论】:

以上是关于Apache 和 logrotate 配置的主要内容,如果未能解决你的问题,请参考以下文章

debian apach2 wsgi 自定义log logrotate 之后无权限访问

rsyslog及logrotate小结

linux下logrotate 配置和理解

linux logrotate 配置说明

linux logrotate 配置说明

logrotate配置和使用