環境
Docker: 4.20.1
Nginx: 1.23
記事の要約
パフォーマンスチューニングを行うためにalpというツールを用いてaccess logを解析してエンドポイントごとの実行時間を測ろうとしていたが、Nginxの.confのlog出力先を変更しても保存されずに四苦八苦した話。結論としては、Dockerのデフォルト設定でNginxのlogファイルにシンボリックリンクが設定されており、シンボリックリンクを解除したところ正常に保存される様になった。
目次
Nginxのaccess_logの出力先の変更
シンボリックの削除
Nginxのaccess_logの出力先の変更
Nginxの設定はetc/nginx/nginx.confで変更できる。
下記の様に変更することでlogの出力先を変更可能。(一般的な保存先は /var/log/nginx/access.log)
http{
access_log <File PATH>;
}
保存先を変更して実行し直してみてもファイルに保存されずに標準出力に出てきてしまっている...?
Docker Desktopで該当ファイルを探して ls -l してみたところ、-> /dev/stdoutとなっていることが確認できた。
# ls -l var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 May 23 08:51 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 May 23 08:51 error.log -> /dev/stderr
}
この矢印こそがシンボリックリンクが設定されているという表示らしい。シンボリックリンクは他の記事でさまざま説明があるので詳細は割愛するが、ポインタの様なものらしい。
つまり、出力先がリンクされてしまっているせいで、/var/log/nginx/access.log に出力してもsdtoutに横流しされる設定になっているということだ。
シンボリックの削除
シンボリックリンクの編集の記事を参考にした。
どうやら unlink <ファイル名> で削除できるらしいので早速やってみた。(cdコマンドで階層移動していることに注意)
# unlink access.log
# ls -l
total 0
lrwxrwxrwx 1 root root 11 May 23 08:51 error.log -> /dev/stderr
unlinkによってシンボリックリンクの設定が削除されたことが確認できる。
これでDocker image(このあたりの用語にあまり詳しくないのですが、Containerから再構築する必要はないはず)を再起動すればlogが保存される様になっているはず!!
終わりに
今回はDocker環境におけるNginxのlog保存周りについて調査を行った。
Docker難しい...。