web-dev-qa-db-ja.com

Nginx logrotateログ

Ubuntu 15.04を実行していますが、nginxapt-get install nginx)の標準インストールが実行されています。

すべてが正常に実行されていますが、nginxログはローテーションされていますが、nginxは同じログファイルへの出力を続けています。 /var/log/nginx/error.logは空ですが、/var/log/nginx/error.log.1はそれに書き込まれたものを取得しています。

もちろん、nginxを再起動すると、通常のログファイルに書き込みが開始されます。 logrotateスクリプトのどこかにバグがありますか?回転時にnginxを再起動する必要がありますか?

6
willwade

Ubuntuバージョン15を実行しています。

はい、logrotateと他の回答のようにスクリプトスニペットをいじることができます。しかし、Ubuntuバージョン15を実行しています。オペレーティングシステムでは、systemdの下でサービスが実行され、デフォルトでは標準エラーとsyslog出力がキャプチャされ、ロギングが処理されます。そもそもnginxがそのerror.logファイルに書き込む必要はありません。 logrotateはまったく必要ありません

他の回答とその下のコメントにより、おそらく/etc/init.d/nginxが表示される場合があります。しないでください。そのファイルは無関係です。 Ubuntuバージョン15を実行しています。 Ubuntu nginx-commonパッケージですぐに提供される関連ファイルは/lib/systemd/system/nginx.serviceです。これはsystemdが使用するもので、適切な/etc/init.d/nginxファイルによって完全に上書きされる古いファイルを完全に無視しますsystemdサービスユニットファイル。

他の回答では、/etc/logrotate.d/nginxも参照する必要があります。 そこにはっきりと見えるもの 、非標準のinvoke-rc.dサブコマンドを使用して古いSystem 5 rcスクリプトを実行しようとすることと、postrotateがないという主張との矛盾に戸惑うかもしれませんスタンザ。しかし、繰り返しますが、単にしないでください。そもそもこれらのlogrotate制御スタンザに焦点を合わせないでください。 Ubuntuバージョン15を実行しており、システムユニットが既にあり、オペレーティングシステムでSystem 5 rcスクリプトとサービスを使用していないパッケージでサービス出力を記録するマネージャー。

Systemdの方法で物事を行うための2つのステップ:

Nginxをより適切に構成します。

nginxサービスは、単純にログを標準エラーに書き込むように指示する必要があります。ボーナスとして、syslog経由でジャーナルにアクセスログを送信できます。これはsystemdもインターセプトします。

これは、 nginxグローバル設定ディレクティブ およびhttpモジュールディレクティブで行われます。具体的には:

  • error_log stderr ;
  • access_log syslog:server=unix:/dev/log ;

nginx.confファイルを this person のように変更するか、Alexander Kuznecov did here を実行してnginx.service unitファイルを変更しますnginxコマンドラインで(グローバル)ディレクティブを渡します:

Type = forking 
 PIDFile =/run/nginx.pid 
 ExecStart =/usr/bin/nginx -g 'デーモンオン; error_log stderr; master_process on; '

logrotateを完全に忘れてください。

systemdは、すべてのサービスの標準出力と標準エラーをそのジャーナルに書き込みます。ジャーナルファイル自体のローテーションを処理します。シグナルはなく、nginxサービスのリロードも一切ありません。サービスに関連するジャーナルの最後のいくつかのエントリを読み取ることができます(スーパーユーザーまたはadmユーザーとして実行)

systemctl status nginx.service
journalctl -u nginx.service -b
5
JdeBP

nginxがローテーションされたファイルに書き込んでいる理由は、postrotateの構成を再ロードするためにlogrotatenginxファイルにnginxセクションがないことです。

logrotateはファイルの名前をすべて変更しましたが、名前の変更はファイル記述子を閉じたり変更したりしません(カーネルはファイルハンドルまたは記述子によって開いているすべてのファイルを示す記述子テーブルを内部的に維持します)。ファイルハンドルは以前と同じままです。 。したがって、nginxプロセスは、新しく作成されたファイルではなく、同じファイルハンドル(回転したもの)にダンプし続けます。

この問題を解決するには、postrotate構成ファイルにlogrotateセクションを追加して、nginxの構成ファイルを再ロードします。

たとえば、/etc/logrotate.d/Apache2postrotateセクションは次のとおりです。

    postrotate
            if /etc/init.d/Apache2 status > /dev/null ; then \
                /etc/init.d/Apache2 reload > /dev/null; \
            fi;
    endscript
1
heemayl