Nginxの高度な機能設定と運用管理の実践ガイド

サーバーステータスの可視化

Nginxの運用状態をリアルタイムで監視するために、ngx_http_stub_status_moduleモジュールを活用します。このモジュールを使用するには、コンパイル時に--with-http_stub_status_moduleオプションを含める必要があります。設定により、アクティブな接続数やリクエスト処理数などの基本メトリクスをテキスト形式で出力できます。

以下は、特定のIPアドレスからのアクセスのみを許可する設定例です。

server {
    listen 80;
    server_name monitoring.example.com;

    location /nginx_status {
        stub_status;
        allow 192.168.1.0/24;
        deny all;
    }
}

ステータスページの出力項目は以下の通りです。

  • Active connections: 現在処理中のクライアント接続数
  • accepts: 受け入れられた総接続数
  • handled: 処理された総接続数
  • requests: クライアントからの総リクエスト数
  • Reading / Writing / Waiting: リクエストの読み込み、レスポンスの書き込み、Keep-Alive待機中の接続数

サードパーティモジュールの導入とコンパイル

Nginxの機能拡張には、サードパーティ製モジュールの追加が有効です。例として、デバッグや動作確認に便利なecho-nginx-moduleを取り上げます。モジュールを追加するには、ソースコードからの再コンパイルが必要です。

まず、モジュールのソースコードを取得します。

git clone https://github.com/openresty/echo-nginx-module.git

次に、Nginxのコンパイル時に--add-moduleパラメータを使用してモジュールのパスを指定します。

./configure --prefix=/etc/nginx --add-module=/path/to/echo-nginx-module
make
make install

設定ファイル内でechoディレクティブを使用した例を以下に示します。

server {
    listen 80;
    server_name api.example.com;

    location /debug {
        echo "Client IP: $remote_addr";
        echo "Request Time: $time_local";
        echo "User Agent: $http_user_agent";
    }
}

変数の活用と定義

Nginxにはリクエスト処理に利用できる組み込み変数が多数用意されています。これらをログ記録や条件分岐に活用することで、柔軟な設定が可能になります。

主要な組み込み変数

変数名説明
$remote_addrクライアントのIPアドレス
$schemeリクエストのプロトコル(http または https)
$request_uriパラメータを含む完全なリクエストURI
$request_methodHTTPメソッド(GET, POST等)
$http_hostリクエストヘッダーのHostフィールド値
$server_name該当するサーバー名

カスタム変数の定義

setディレクティブを使用して、独自の変数を定義することも可能です。

server {
    listen 80;
    server_name example.com;

    location / {
        set $app_version "v2.0.1";
        add_header X-App-Version $app_version;
        return 200 "App Version Check";
    }
}

ログ設定のカスタマイズ

トラブルシューティングやアクセス分析を効率化するため、ログの出力形式とレベルを調整します。

エラーログのレベル設定

error_logディレクティブでは、記録するログの重要度(レベル)を指定できます。レベルはdebugからemergまであり、指定したレベル以上のエラーが記録されます。

error_log /var/log/nginx/error.log warn;

アクセスログのフォーマット変更

デフォルトのログ形式に加え、JSON形式などの構造化データを出力すると、ログ解析ツールとの連携が容易になります。

http {
    log_format json_log escape=json '{'
        '"time": "$time_iso8601",'
        '"remote_addr": "$remote_addr",'
        '"request": "$request",'
        '"status": "$status",'
        '"body_bytes": "$body_bytes_sent",'
        '"request_time": "$request_time",'
        '"http_referrer": "$http_referer",'
        '"http_user_agent": "$http_user_agent"'
    '}';

    access_log /var/log/nginx/access.log json_log;
}

コンテンツ圧送による帯域削減

ngx_http_gzip_moduleを使用して、レスポンスボディを圧縮し、転送量と帯域幅を削減します。CPUリソースを消費しますが、テキストベースのコンテンツ転送には大きな効果があります。

http {
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
    gzip_static on; # 事前に圧縮されたファイルがあれば優先
}

gzip_static onを有効にすると、.gz拡張子が付いた圧縮済みファイルがサーバー上に存在する場合、リアルタイム圧縮を行わずにそのファイルを転送します。これにより、CPU負荷をさらに軽減できます。

ファビコン(favicon)の取り扱い

ブラウザは自動的に/favicon.icoをリクエストします。ファイルが存在しない場合、エラーログに404エラーが記録され続けるため、これを防ぐ設定が推奨されます。

location = /favicon.ico {
    log_not_found off;
    access_log off;
    expires 30d;
    # ファイルが存在する場合はパスを指定、存在しない場合は204 No Contentを返しても良い
    try_files $uri =204;
}

SSL/TLSによるHTTPS通信の実装

通信の暗号化にはngx_http_ssl_moduleを使用します。自己署名証明書(オレオレ証明書)または認証局(CA)が発行した証明書を用いて設定を行います。

以下は、SSL証明書と秘密鍵を指定してHTTPS通信を有効にする設定例です。

server {
    listen 443 ssl;
    server_name secure.example.com;

    # 証明書と秘密鍵のパス
    ssl_certificate /etc/nginx/ssl/bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;

    # セッションキャッシュとタイムアウト設定
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 推奨されるプロトコルと暗号化スイート
    ssl_protocols TLSv1.2 TLSv1.3;
    
    location / {
        root /usr/share/nginx/html;
    }
}

証明書ファイルの作成手順の一例として、中間CA証明書とサーバー証明書を結合するプロセスは以下の通りです。

# サーバー証明書と中間CA証明書を結合して証明書チェーンを作成
cat server.crt intermediate.crt > bundle.crt

# 秘密鍵の配置を確認
ls -l private.key

設定反映後、ブラウザでHTTPSアクセスを行い、証明書の警告が適切に表示されるか、または正当な証明書であれば安全な通信が確立されているかを確認します。

タグ: nginx Web Server ssl/tls HTTP Compression Access Control

8月3日 08:21 投稿