Ubuntu 15.04を実行していますが、nginx
(apt-get install nginx
)の標準インストールが実行されています。
すべてが正常に実行されていますが、nginx
ログはローテーションされていますが、nginx
は同じログファイルへの出力を続けています。 /var/log/nginx/error.log
は空ですが、/var/log/nginx/error.log.1
はそれに書き込まれたものを取得しています。
もちろん、nginx
を再起動すると、通常のログファイルに書き込みが開始されます。 logrotate
スクリプトのどこかにバグがありますか?回転時にnginx
を再起動する必要がありますか?
はい、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
サービスは、単純にログを標準エラーに書き込むように指示する必要があります。ボーナスとして、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
nginx
がローテーションされたファイルに書き込んでいる理由は、postrotate
の構成を再ロードするためにlogrotate
のnginx
ファイルにnginx
セクションがないことです。
logrotate
はファイルの名前をすべて変更しましたが、名前の変更はファイル記述子を閉じたり変更したりしません(カーネルはファイルハンドルまたは記述子によって開いているすべてのファイルを示す記述子テーブルを内部的に維持します)。ファイルハンドルは以前と同じままです。 。したがって、nginx
プロセスは、新しく作成されたファイルではなく、同じファイルハンドル(回転したもの)にダンプし続けます。
この問題を解決するには、postrotate
構成ファイルにlogrotate
セクションを追加して、nginx
の構成ファイルを再ロードします。
たとえば、/etc/logrotate.d/Apache2
のpostrotate
セクションは次のとおりです。
postrotate
if /etc/init.d/Apache2 status > /dev/null ; then \
/etc/init.d/Apache2 reload > /dev/null; \
fi;
endscript