Apache和logrotate配置

时间:2014-10-21 09:01:15

标签: apache ubuntu apache2 logrotate

上周我在我的服务器上发现了一个问题,因为磁盘使用率为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哪个用户用于轮换?怎么样?

5 个答案:

答案 0 :(得分:41)

只需将su root adm添加到配置文件中:

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

答案 1 :(得分:28)

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

su <user> <group>

答案 2 :(得分: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.

答案 3 :(得分:0)

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

OR

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

 chmod 755 /var/log/apache2

答案 4 :(得分:0)

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

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

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

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

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

  1. sudo chown gitlab-runner:root
  2. vi /etc/apache2/envvars
  3. 将 Apache2 APACHE_RUN_USER:APACHE_RUN_GROUP 改为 gitlab-runner:gitlab-runner
  4. 在 /etc/logrotate.d/apache2 中设置 su gitlab-runner gitlab-runner
  5. 重启 Apache。

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

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