nginxのアクセスログとエラーログの確認方法【ubuntu】

nginxのアクセスログとエラーログの確認方法【ubuntu】
nginxのアクセスログとエラーログの確認方法【ubuntu】

nginxのログファイルがある場所

デフォルト設定では次の場所にログファイルが保存されます。

項目場所
アクセスログ/var/log/nginx/access.log
エラーログ/var/log/nginx/error.log

access.logの例

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の例:

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
error.logファイルには、404エラーなどが含まれます。

エラーログの整形出力

以下のコマンドは、open() を含むログ行から対象ファイルを抜き出し、重複件数をカウントし、件数の多い順にソートして出力するものです。

bash
grep 'open()' error.log | awk -F'"' '{print $2}' | sort | uniq -c | sort -nr

この方法により、404エラーが多発しているページを一目で確認でき、アクセスの傾向を把握するのに役立ちます。

uniq uniq
sort sort

「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 ファイルを作成し次のとおり記述しておきました。
json
[
    {"user_agent": "prefetch-proxy", "disallow": true}
]

これでエラーログに吐き出されなくなるはずです。

ちなみに、well-known関連のエラーログ抽出方法はこちら:

bash
grep ".well-known" /var/log/nginx/error.log.1 | sed -E 's/.* open\(\) "([^"]+)".*/\1/g' | uniq

不正なアクセス対処(PHP編)

PHPを使用していない環境では、.php拡張子のリクエストが大量に来るのは不要なアクセスですし、ログにも無駄なエントリが残ります。そこで、Nginxの設定でPHPファイルへのアクセスを拒否する方法が有効です。以下の設定を追加することで、.phpリクエストに対してレスポンスを返さず接続を切断する(444エラーを返す)ようにできます。

nginx
location ~ \.php$ {
    return 444;
}

ここで使用している「444」は、Nginx独自のステータスコードで、クライアントに対して何も返さずに接続を強制的に切断するという意味です。この方法により、PHPを使っていない場合の不要なアクセスを効果的にブロックし、ログの無駄な記録も防ぐことができます。

以下は、Nginxの用語を用いた修正版です。

カスタム404ページへのリダイレクト設定

リクエストされたリソースが存在しない場合に、404エラーを検知して指定の404.htmlへ内部リダイレクトするため、serverブロック内に以下のディレクティブを追加します。

nginx
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(永久)リダイレクトします。

nginx
location ^~ /somewhere/ {
    rewrite ^/somewhere/(.*)$ https://example.com/$1 permanent;
}

別ファイルで管理する場合

リダイレクト定義が大量にある場合、設定ファイルを分割して管理することで、メインの設定ファイルがスッキリし、メンテナンスもしやすくなります。
例えば、リダイレクト設定を /etc/nginx/redirects.conf にまとめ、メインの server ブロック内で include します。

nginx
server {
    listen 443 ssl http2;
    server_name example.com;
    # SSL設定など他のディレクティブ

    include /etc/nginx/redirects.conf;

    # その他の設定
}

これにより、リダイレクトルールを別ファイルで管理できるため、必要に応じて個別に編集や追加がしやすくなります。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事