Назад | Перейти на главную страницу

CentOS - журналы Nginx были удалены - перезагрузка системы неизвестна, почему? Как предотвратить?

Я использую CentOS Linux версии 7.0.1406 (Core).

Последний раз я входил в SSH сервера 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 были размером 0КБ !!! Но данных там было предостаточно. Он просто ... улетел.

Я также заметил, что с 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. Но теперь есть. Как / где я могу проверить, есть ли где-то правило, которое гласит, что каждый файл журнала должен архивироваться?
  2. Как вы думаете, что случилось? Могу ли я еще что-нибудь проверить, чтобы найти основную причину этой проблемы?
  3. Есть ли способ предотвратить подобное в будущем?
  4. Есть ли способ восстановить пропавшие логи?

Вот в чем проблема:

user web;

Nginx ожидает запуска от имени пользователя nginx, и все связанные скрипты, такие как logrotate, также ожидают этого. Это никогда не следует менять, если вы точно не знаете, что делаете и все возможные последствия. Верните его к умолчанию:

user nginx;

Gzip-архивирование зависит от ротатора логов¹. Хотя эта ссылка предназначен для Ubuntu, /etc/logrotate.d/nginx также применяется к CentOS. Чтобы узнать, что, вероятно, обрабатывает журнал:

   $ ps axu | grep log

Вероятно, один из появляющихся процессов - это то, что вам нужно (например, rsyslogd).

Что произошло? В соответствии с вашими комментариями, продавец перезапускается. Чтобы подтвердить:

Информация для входа (поставщики услуг могут входить как root с открытым ключом) может отображаться в файлах / var / log, например: secure, messages, btmp (доступ с lastb), lastlog (если вы используете другую учетную запись, это будет отображать последний вход в систему, иначе вы его перезаписали), а в файлах истории учетных записей могут отображаться действия: (~ / .bash_history и другие ~ / .files).

Профилактика зависит от причины. Если это сделал производитель, вероятно, нет (но вы можете спросить, как получить предупреждение в будущем).

Рекавери тоже "наверное нет". Я видел, что nginx не может записывать свои журналы, когда они не вращаются должным образом (ротация журналов должна включать отправку сигнала USR1 в nginx). При запуске это может быть проблема с исходными разрешениями. Насколько я знаю, по умолчанию незаписываемые журналы ничего не буферизуют, их просто нет.

¹ Для быстрого доступа к сжатым файлам:

    $ 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