CentOS - Nginx 日志被删除 - 无法识别的系统重启,为什么?如何预防?

CentOS - Nginx 日志被删除 - 无法识别的系统重启,为什么?如何预防?

我正在使用 CentOS Linux 版本 7.0.1406(核心)。

我最后一次登录服务器的 SSH 是在 4 月 20 日。一切正常。

今天我再次登录,检查我的网站的 error.log 中是否有新内容。我定期这样做。但今天有一个惊喜:

[root@myserver nginx]# ls -la
total 104840
drwx------ 2 nginx nginx     4096 Apr 30 03:19 .
drwxr-xr-x 7 root  root      4096 May  3 03:20 ..
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 access.log
-rw-r--r-- 1 root  root  17956729 Apr 30 03:19 access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 awstats.site1.net.access.log
-rw-r--r-- 1 root  root      5229 Apr  2 14:21 awstats.site1.net.access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 awstats.site1.net.error.log
-rw-r--r-- 1 root  root      4654 Apr  2 14:21 awstats.site1.net.error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 devel.site1.net.access.log
-rw-r--r-- 1 root  root     26082 Apr 20 21:12 devel.site1.net.access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 devel.site1.net.error.log
-rw-r--r-- 1 root  root     46743 Apr 20 21:14 devel.site1.net.error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 devel.site2.pl.access.log
-rw-r--r-- 1 root  root      1652 Apr 24 06:28 devel.site2.pl.access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 devel.site2.pl.error.log
-rw-r--r-- 1 root  root       237 Feb 28 21:32 devel.site2.pl.error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 error.log
-rw-r--r-- 1 root  root    596623 Apr 30 02:38 error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site1.net.access.log
-rw-r--r-- 1 root  root  83764451 Apr 30 03:18 site1.net.access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site1.net.error.log
-rw-r--r-- 1 root  root    147462 Apr 29 21:36 site1.net.error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site3.com-access.log
-rw-r--r-- 1 root  root    177285 Apr 30 03:14 site3.com-access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site3.com-error.log
-rw-r--r-- 1 root  root     27929 Apr 28 23:16 site3.com-error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 panel.site4.com-access.log
-rw-r--r-- 1 root  root      1963 Apr 25 22:22 panel.site4.com-access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 panel.site4.com-error.log
-rw-r--r-- 1 root  root       488 Apr 13 14:21 panel.site4.com-error.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site2.pl.access.log
-rw-r--r-- 1 root  root   4485845 Apr 30 03:12 site2.pl.access.log-20150430.gz
-rw-r--r-- 1 web   nginx        0 Apr 30 03:19 site2.pl.error.log
-rw-r--r-- 1 root  root     61613 Apr 30 01:36 site2.pl.error.log-20150430.gz

如您所见,.log 文件为 0KB!但那里有大量数据。它只是……飞走了。

我还注意到last,出现了一个我不知道的奇怪的重启:

reboot   system boot  2.6.32-042stab08 Wed Apr 29 20:41 - 15:09 (8+18:27)

现在我将所有者/组改回nginx,看起来日志再次填充。

编辑:

Here is my nginx.conf:
user web;
worker_processes 2;
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        multi_accept on;
}

http {
        rewrite_log off;
        ##
        # Basic Settings
        ##
        client_max_body_size 20m;
        sendfile off;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

#       log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
#                          '$status $body_bytes_sent "$http_referer" "$request_time"';

        log_format main     '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';

        include /etc/nginx/mime.types;
        default_type application/octet-stream;



        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;

        fastcgi_buffer_size  16k;
        fastcgi_buffers      16  16k;
        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log main;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##


        gzip             on;
        gzip_disable "msie6";
        gzip_min_length  1000;
        gzip_proxied     expired no-cache no-store private auth;
        gzip_types       text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss;

        ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##
        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

输出如下:ps axu | grep log

root        86  0.0  0.0  34636   848 ?        Ss   Apr29   0:05 /usr/lib/systemd/systemd-logind
root       541  0.0  0.0   9512   588 ?        S    Apr29   0:01 dovecot/log
mysql      593  0.6  5.7 1675596 179496 ?      Sl   Apr29  89:36 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root     30100  0.0  0.0   8988   900 pts/1    S+   20:31   0:00 grep --color=auto log

我有几个问题:

  1. 我不记得是否有 .gz 文件。但现在有了。我如何/在哪里可以检查是否有某条规则规定应该对每个日志文件进行 gzip 压缩?
  2. 您认为发生了什么?我还可以检查其他内容来找出该问题的根本原因吗
  3. 有没有什么办法可以防止将来再次发生这样的事情?
  4. 有没有什么办法可以恢复消失的日志?

答案1

Gzipping 依赖于日志旋转器¹。尽管此链接适用于 Ubuntu,/etc/logrotate.d/nginx 也适用于 CentOS。要查看可能处理日志的内容:

   $ ps axu | grep log

出现的进程之一很可能就是您想要的(例如 rsyslogd)。

发生了什么?根据您的评论,供应商重新启动。要确认:

登录信息(服务提供商可能以 root 身份使用公钥进入)可能会出现在 /var/log 文件中,例如:secure、messages、btmp(使用 lastb 访问)、lastlog(假设您使用不同的帐户,它将显示他们的最后一次登录,否则您将覆盖它)和帐户历史文件可能会显示操作:(~/.bash_history 和其他 ~/.files)。

预防取决于原因。如果是供应商做的,可能不是(但你可以问以后如何得到警告)。

恢复也“可能不会”。我曾见过 nginx 在日志轮换不正确时无法写入日志(日志轮换应包括向 nginx 发送 USR1 信号)。启动时,这可能是初始权限问题。据我所知,默认情况下没有任何东西可以缓冲不可写的日志,它们只是消失了。

¹ 为了方便访问压缩文件:

    $ zcat each_file      # to see one at a time
    $ less *.gz           # less will zcat for you. :n and :p for next/previous file
    $ zcat *.gz | less    # to see all files in one big stream

答案2

问题如下:

user web;

Nginx 需要以用户 nginx 身份运行,所有相关脚本(如 logrotate)也需要这样。除非您确切知道自己在做什么以及所有可能的含义,否则永远不要更改此设置。将其恢复为默认值:

user nginx;

相关内容