Nginx 設定ジェネレーター

Nginx設定を生成

Nginx の設定をゼロから書くには、proxy_set_header の一行一行や gzip で圧縮する MIME タイプをすべて覚えたうえで、try_files $uri/ /index.php?$args と、ルーティングを静かに壊してしまう書き方との違いまで把握しておく必要があります。このジェネレーターはドメイン、アップストリーム、PHP ハンドラー、SSL ファイルのパスを尋ね、TLS・HTTP/2・静的ファイルのキャッシュ・圧縮に適切な初期値を設定した server block を出力します。

server block を生成する手順

  1. 1

    プリセットを選ぶ

    静的サイト、PHP-FPM(Laravel、WordPress)、Node.js のリバースプロキシ、または単純な 301 リダイレクトから選びます。

  2. 2

    ドメインを入力する

    server_name の一覧を記載します。通常は www ありと www なしの両方を含めます。

  3. 3

    SSL の情報を設定する

    fullchain と privkey のファイルを指定します。HTTP のみで運用する場合はスキップして構いません。

  4. 4

    アップストリームを調整する

    proxy_pass を使う場合のポート、ソケットのパス、またはバックエンドの URL を指定します。

  5. 5

    コピーして反映する

    出力を /etc/nginx/sites-available に置き、nginx -t を実行してから Nginx を reload します。

良い server block の構成

最近の Nginx のバーチャルホストは、たいてい次の要素で構成されています。

構成要素 役割
listen 443 ssl http2 HTTP/2 を有効にしたまま HTTPS を受け付ける
ssl_certificate + ssl_certificate_key TLS の証明書と秘密鍵のファイルを指定する
ssl_protocols TLSv1.2 TLSv1.3 古い TLS のバージョンを切り捨てる
gzip on + タイプの一覧 テキスト/HTML/JSON/JS/CSS を配信時に圧縮する
静的ファイル向けの expires ヘッダー 再訪問者からの重複リクエストを減らす
try_files フロントコントローラー(PHP、Laravel など)へ渡す
HSTS + セキュリティヘッダー ブラウザに TLS を使い続けさせる

リバースプロキシの要点

Nginx の背後で動く Node.js、Python、Ruby のアプリケーションでは次のように書きます。

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

X-Forwarded-For を書き忘れることは、アプリのログから本当のクライアント IP が消えてしまう典型的な原因です。

よくある失敗

  • server_name のフォールバックがない。 どの名前にも一致しない場合、Nginx は最初の server block を既定として使います。Host ヘッダーを悪用した攻撃を避けるため、444 を返すキャッチオールの server_name _ ブロックを置きましょう。
  • 証明書の順序が誤っている。 ssl_certificate のファイルはリーフ証明書だけでなく、フルチェーン(fullchain:リーフ + 中間証明書)である必要があります。
  • キャッシュが効きすぎている。 /index.htmlexpires 1y を付けると、以後のデプロイが反映されなくなります。代わりに静的ファイルの URL にバージョンを付けてください。
  • テストせずに reload する。 systemctl reload nginx の前に必ず nginx -t を実行してください。構文エラーが一つあるだけでサイトは停止します。

よくある質問

HTTP/2 は安定しており、Nginx 1.25 以降で広くサポートされています。HTTP/3(QUIC)も Nginx 1.25 以降で利用できますが、まだ実験的な位置づけです。いま本番用の設定を組むなら HTTP/2 を有効にし、必要に応じて http3quic のディレクティブで HTTP/3 を追加してください。

慣例として、公開される証明書チェーンは /etc/ssl/certs/ に、秘密鍵は /etc/ssl/private/ に置きます。Let’s Encrypt はすべてを /etc/letsencrypt/live/domain/ の下に配置します。更新ツールが前提としている場所に合わせてください。

ほとんどのサイトでは必要です。301 https://$host$request_uri を返すポート 80 用の server block を別に追加してください。HSTS と組み合わせれば、最初のリクエスト以降この HTTP ブロックが使われることはほとんどありません。

sudo nginx -t を実行すると、reload せずに設定を解析できます。“syntax is ok” と “test is successful” が表示されたら sudo systemctl reload nginx で反映します。本番環境で restart を使ってはいけません。reload ならサービスを止めずに切り替えられます。

関連ツール

このツールは他の言語でも利用できます