nginxでヘルスチェックのアクセスログを出力させない設定

おはようございます。インフラの宮下です。
今回はnginxのログ関連の設定になります。


目次

  1. はじめに
  2. ngx_http_geo_moduleについて
  3. nginxへの設定
  4. 参考サイト

はじめに

apacheで良く実施する、setenvの定義を利用して特定NWから来るログを出力しないような設定をnginxでも実施したかったのですが同じ機能が無かったので調べてみました。 使い道としては、ロードバランサーのヘルスチェックや監視サーバからの接続など、ログに出力しない方が都合が良い時に利用できます。 解析するには不要ですし、余計なDISK I/Oも抑えられます。

ngx_http_geo_moduleとは

公式ドキュメント

ドキュメントの通りIPアドレスを変数としてセットできます。
一般的に使われるのは、特定の国のNWは接続拒否するような時にこのモジュールを使う事が多いようです。 そのような場合は、includeして大量に登録された別ファイルで管理する事も可能です。

nginxへの設定

nginx.confに設定します。
[shell]# vi nginx.conf http { include mime.types; (中略) # not access_log IP’s geo $no_log { default 0; 172.0.1.0/24 1; } server { (中略) location / { root /var/www/html; index index.cgi index.php index.html index.htm; if ($no_log) { access_log off; } } }[/shell]

基本構文は、geo [$address] $variable { … } となります。 「default」は条件に含まれない全てでこれを「0」として指定のIPを「1」としています。 制限をかけたい階層のlocationに、 if ($variable) { access_log off; }と記述すると「1」 に該当するログは出力されなくなります。

最後にnginxを再起動します。

[shell]# /etc/init.d/nginx restart[/shell]
これでaccess_logには172.0.1.0/24からの接続ログは出なくなりました。
apacheのようにserenvでもできるそうですが、enginxならこの方が簡単でした。

参考Site

ngx_http_geo_module モジュール nginxのgeoモジュールが便利すぎる