サーバの移設中なので、ログに関しての記録を残しています。
概要
Webサーバ全般のメンテナンスで特に必要なのは
「ログを適切に管理する」
です。
- 不審なアクセスの兆候
- 自分のやらかし
を目の当たりにできる手段だからです。(特に後者に助けられたことは幾度となくあります)
そのため、Webサーバ上のログのローテーションを行い、履歴を追いやすくし、更にサーバの容量も削減するログローテーションを行います。
ログローテーションとは
ログファイルが肥大化するのを防ぐために、古いログを一定のルールに基づいて新しいログに切り替えたり、削除したりする仕組みのことです。
hogeサイトのアクセス記録である/var/log/access.log
というファイルは、何も設定していないとログが記録され続けます。これによって以下の問題が起きます。
- ログの肥大化によるサーバ容量の圧迫
- テキストファイルぐらいと思う方がいるかも知れませんが、昨今の不正アクセスやAIサイトのクローラーのアクセス頻度は異常です。個人サイト程度でも一日数十MBはよくあります。
- RedmineのようなWebアプリの場合、そのログは数百MBになります。
- → このため、指定した期間でログを新しいログに差し替え、古いものは削除していくという仕組みを取ります。
- ログの追記によるサーバのリソース増加
- 追記自体の負荷は小さいですが、そのログをgrepなどで分析・検索する際に、巨大な単一ファイルだと非常に多くのメモリとCPUを消費します。
- → ログを適切に分割(ローテーション)しておくことで、日々のログ分析が高速かつ軽量に行えるようになります。
これを行うべきタイミング
「Webサーバに新たなWebサイトやサービスを立ち上げたとき」 です。
試験運用などでもログは問題が起きたときのヒントとなるからです。
環境
- Ubuntu 24.04
- Apache 2.4
apt
(aptitude
)によるパッケージ管理でインストールしているため、Apacheの実行ユーザはwww-data
です。
備考
ディストリビューションが違ってもこの手順は有効ですが、RockyやAlma等のRHEL系のApacheの実行ユーザは通常はapache
であることに注意しましょう。
さっくりとした手順
- (念のため)設定を行うサイトのログを
www-data
に変えます。 - ログローテーションのファイルを作成します。
- ログローテートの設定が有効かを確認します。
ここでは、hogeサイト(/var/log/hoge
)のログをローテーションする方法です。
サイトのログの実行ユーザの変更(所有者変更)
これは、Redmineのlogプラグインのように、Webインタフェース上からログを閲覧できるプラグインがある場合、Apacheを実行しているサービス自体が参照できるようにするためです。
- chownによる所有者変更
sudo chown -R www-data:www-data /var/log/hoge
ログ一式の所有者を変えます。ログファイルの形式は自分の環境に合わせます。
- 所有者変更確認
ls -l /var/log/hoge
ログファイルの所有者とグループがwww-data
であることを確認します。
ログローテーションファイルの作成
ファイル名やログのパスは自分の環境に合わせます。 ここを間違えると元も子もありません。
cat <<- __EOF__ | sudo tee -a /etc/logrotate.d/hoge
/var/log/hoge/*.log {
daily
missingok
rotate 10
compress
copytruncate
notifempty
su www-data www-data
__EOF__
これは、以下を行います。
- daiy
- 1日ごとにローテーション
- missingok
- ログファイルが存在しなくてもエラーにしない
- rotate 10
- 10世代分の古いログファイルを保持する(それ以降は破棄)
- compress
- 古いログファイルをgzipで圧縮する
- copytruncate
- ログをコピーしてから元のファイルを空にする(サービス無停止でログ切替)
- notifempty
- ログファイルが空の場合はローテーションしない
- su www-data www-data
- ローテーション後のファイルの所有者を指定
他、週ごとやログのファイル形式(日付形式)などを設定できます。こちらは運用に合わせてください。
ログローテーションの確認
- 設定確認
sudo logrotate -dv /etc/logrotate.d/hoge
※先ほど作成したファイル名に合わせます。
ここでエラーがなければログローテーションはできています。
- ログローテーションの即時実行
すぐにローテーションを確かめる場合は以下を実行します。強制的にログローテーションを行うコマンドです。
sudo logrotate -f /etc/logrotate.d/hoge
このコマンドを実行後、/var/log/hoge/
ディレクトリ内にaccess.log.1.gz
のようなファイルが作成され、元のaccess.log
が空になっていれば、設定は完璧です。