nginxのアクセスログとエラーログの確認方法【ubuntu】
nginxのログファイルがある場所
デフォルト設定では次の場所にログファイルが保存されます。
項目 | 場所 |
---|---|
アクセスログ | /var/log/nginx/access.log |
エラーログ | /var/log/nginx/error.log |
access.logの例
220.213.212.146 - - [23/Oct/2022:21:42:52 +0900] "GET /images_small/niku-udon/eyecatch.jpg HTTP/2.0" 200 23571 "https://k.araisun.com/noodles/teuchi-udon.html" "Mozilla/5.0 (Linux; Android 4.4.2; LaVieTab PC-TE510S1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
...
error.logの例:
2022/10/23 07:33:12 [crit] 52949#52949: *2381 SSL_do_handshake() failed (SSL: error:0A00006C:SSL routines::bad key share) while SSL handshaking, client: 154.89.5.78, server: 0.0.0.0:443
エラーログの整形出力
以下のコマンドは、open() を含むログ行から対象ファイルを抜き出し、重複件数をカウントし、件数の多い順にソートして出力するものです。
grep 'open()' error.log | awk -F'"' '{print $2}' | sort | uniq -c | sort -nr
この方法により、404エラーが多発しているページを一目で確認でき、アクセスの傾向を把握するのに役立ちます。
「SSL_do_handshake() failed」とは?
ところで、エラーログを見ていて気になったのが SSL_do_handshake() failed というエラーです。
こちらの記事 によりますと、サイバー攻撃されて失敗したログのようです。エラーになっているのでセキュリティ的には安心して良いようです。SSLプロトコルの SSLv2、SSLv3、TLSv1 はバージョンが古くて脆弱性があるため使わないようにします。 TLSv1.2 以降が望ましいとのこと。
「.well-known/traffic-advice」とは?
.well-known/traffic-advice はGoogle Chromeブラウザの先読み機能によるアクセスです。先読み機能を使っておらず禁止させたいので、.well-known/traffic-advice ファイルを作成し次のとおり記述しておきました。[
{"user_agent": "prefetch-proxy", "disallow": true}
]
これでエラーログに吐き出されなくなるはずです。
ちなみに、well-known関連のエラーログ抽出方法はこちら:
grep ".well-known" /var/log/nginx/error.log.1 | sed -E 's/.* open\(\) "([^"]+)".*/\1/g' | uniq
不正なアクセス対処(PHP編)
PHPを使用していない環境では、.php拡張子のリクエストが大量に来るのは不要なアクセスですし、ログにも無駄なエントリが残ります。そこで、Nginxの設定でPHPファイルへのアクセスを拒否する方法が有効です。以下の設定を追加することで、.phpリクエストに対してレスポンスを返さず接続を切断する(444エラーを返す)ようにできます。
location ~ \.php$ {
return 444;
}
ここで使用している「444」は、Nginx独自のステータスコードで、クライアントに対して何も返さずに接続を強制的に切断するという意味です。この方法により、PHPを使っていない場合の不要なアクセスを効果的にブロックし、ログの無駄な記録も防ぐことができます。
以下は、Nginxの用語を用いた修正版です。
カスタム404ページへのリダイレクト設定
リクエストされたリソースが存在しない場合に、404エラーを検知して指定の404.htmlへ内部リダイレクトするため、serverブロック内に以下のディレクティブを追加します。
error_page 404 /404.html;
location = /404.html {
root /somewhere/example.com/public;
}
error_page 404 /404.html; の設定は、クライアントからのリクエストに対して404エラーが発生した場合、内部リダイレクトで /404.html を返します。
location = /404.html { ... } の設定は、/404.html に対するリクエストに対して、指定ディレクトリ(/somewhere/example.com/public)からファイルを提供します。
この設定により、存在しないリソースへのアクセス時にカスタム404ページが適切に表示されます。
リダイレクトしたい
基本的なリダイレクトの設定は、以下のように書きます。 この例では、/somewhere/ 以下のリクエストをキャプチャして、https://example.com/ 以下に301(永久)リダイレクトします。
location ^~ /somewhere/ {
rewrite ^/somewhere/(.*)$ https://example.com/$1 permanent;
}
別ファイルで管理する場合
リダイレクト定義が大量にある場合、設定ファイルを分割して管理することで、メインの設定ファイルがスッキリし、メンテナンスもしやすくなります。
例えば、リダイレクト設定を /etc/nginx/redirects.conf にまとめ、メインの server ブロック内で include します。
server {
listen 443 ssl http2;
server_name example.com;
# SSL設定など他のディレクティブ
include /etc/nginx/redirects.conf;
# その他の設定
}
これにより、リダイレクトルールを別ファイルで管理できるため、必要に応じて個別に編集や追加がしやすくなります。