Nginx完全ガイド:設定・リバースプロキシ・性能チューニングからセキュリティ・移行までの実践ノウハウ

Nginx とは(概要)

Nginx(エンジンエックス)は高性能なHTTPサーバ/リバースプロキシ/ロードバランサとして広く使われているオープンソースのソフトウェアです。ロシアのエンジニア Igor Sysoev により開発が始まり、2004年に最初の公開リリースが行われました。軽量で高並列性に優れる設計により、静的ファイル配信、プロキシング、SSL/TLS終端、WebSocketやHTTP/2の処理など、モダンなWebインフラでの用途が幅広く、商用版の NGINX Plus を含めて企業でも多く採用されています。

設計とアーキテクチャの特徴

Nginx の大きな特徴は「イベント駆動・非同期・ノンブロッキング」なアーキテクチャです。マスタープロセスと複数のワーカープロセスで構成され、各ワーカはイベントループ(Linux では epoll、BSD 系では kqueue などの効率的なI/O多重化機構を利用)によって多くのコネクションを少数のスレッドで処理します。これにより接続数や同時接続処理性能で優れたスケーラビリティを発揮します。

主な機能と利用シーン

  • 静的コンテンツ配信:軽量で高スループットな静的ファイル配信が得意。
  • リバースプロキシ:バックエンドのアプリケーションサーバ(uWSGI、FastCGI/PHP-FPM、HTTPアプリ)へのプロキシとしてよく使われる。
  • ロードバランシング:ラウンドロビン、least_conn、ip_hash 等のアルゴリズムで負荷分散が可能。
  • キャッシュ機能:proxy_cache によるリバースプロキシキャッシュやマイクロキャッシュが可能で、レスポンス性能を大幅に改善できる。
  • SSL/TLS 終端:TLS 終端(証明書管理、OCSP ステープリング等)や HTTP/2 のサポート。
  • セキュリティ/制限:アクセス制御、レート制限(limit_req / limit_conn)、バッファ制御など。

設定の基本(nginx.conf の構成)

典型的な Nginx の設定は /etc/nginx/nginx.conf(ディストリビューションによって異なる)に書かれ、main(global) -> http -> server -> location という階層でディレクティブを記述します。外部ファイルを include してサイト毎に分割することが一般的です。設定の検証は「nginx -t」、設定反映は「nginx -s reload」または systemd の再起動で行います。

簡単な設定例(リバースプロキシ)

<!-- WordPress 投稿エディタに貼るとそのまま表示されます -->
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_upstream;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

パフォーマンス最適化のポイント

  • worker_processes を auto に設定し CPU コア数に合わせる。
  • worker_connections を適切に設定して同時接続数を確保する。
  • keepalive_timeout, sendfile, tcp_nopush, tcp_nodelay 等のネットワークパラメータを調整する。
  • proxy_cache の活用や gzip 圧縮で帯域とレスポンス時間を削減する。マイクロキャッシュ(数秒〜数十秒の短時間キャッシュ)は動的サイトの負荷緩和に有効。

モジュールと拡張性

Nginx はコア機能に加え、多数のモジュールで機能拡張できます。公式モジュールのほかサードパーティ製のモジュールも豊富ですが、歴史的にはモジュールはビルド時に組み込む必要がありました。最近は動的モジュールをサポートしており、柔軟性が増しています。なお、商用の NGINX Plus は追加の機能(高度なロードバランシング、ヘルスチェック、監視ダッシュボード等)を提供します。

観測性と運用管理

  • アクセスログ・エラーログをカスタムフォーマットで出力し、ログ解析や可観測性ツール(ELK/EFK、Fluentd など)と組み合わせる。
  • stub_status モジュールで接続数やリクエスト数などの簡易メトリクス取得が可能。詳細なメトリクスは Prometheus エクスポーターなど外部ツールを使う。
  • 無停止での設定反映(graceful reload)、設定テスト(nginx -t)など運用機能が充実。

セキュリティの考慮点

  • server_tokens を off にしてバージョン情報を隠蔽する。
  • TLS 設定は脆弱な暗号やプロトコルを無効化し、OCSP ステープリングや HSTS を適切に設定する。
  • リクエストボディサイズ(client_max_body_size)やバッファを制限して DoS 対策を行う。
  • 外部からのプロキシヘッダやリダイレクトに注意し、ヘッダの正規化やアクセス制御を行う。

Apache からの移行時の注意点

Apache の .htaccess を多用している場合、Nginx は .htaccess をサポートしないため、設定を Nginx の server/location ブロックに移行する必要があります。モジュールや動作(例:URL 書き換え、認証、アクセス制御)を調査し、同等のディレクティブや外部ツールで代替する作業が必要です。

運用上のよくある落とし穴

  • 設定ミスによるループ(proxy_pass の誤設定など)。検証(nginx -t)と段階的デプロイが重要。
  • ログローテーションと権限管理を怠るとディスクが埋まる。
  • 古い TLS 設定やライブラリを使うとセキュリティリスクになるため、定期的なアップデートが必要。
  • Windows版は機能制限と性能差があるため、Linux系の利用が推奨されることが多い。

まとめ

Nginx は高い並列処理能力と軽量性、豊富な機能群を併せ持つため、フロントエンドのWebサーバ/リバースプロキシ/ロードバランサとして広く採用されています。導入前にはアーキテクチャ特性を理解し、設定やチューニング、セキュリティ対策を適切に行うことで、効率的かつ安全な運用が可能です。

参考文献