直近のプロジェクトにて、Nginxの設定ファイルを修正する機会がありました。その際に学習した基礎知識や設定ファイルの書き方を整理し、実務で役立つTipsとともにまとめました。
1. Nginxの役割とシステムにおける位置づけ
Nginxは単に「Webページを表示する」だけでなく、Webシステム全体の**「優秀な窓口(フロントマン)」**として、以下のような重要な役割を担っています。
[ クライアント (ブラウザ) ]
│ (HTTPS / HTTP)
▼
┌──────────────────────────────────────────────┐
│ Nginx │
│ ① 静的配信 ② リバースプロキシ ③ ロードバランス │
│ ④ SSL/TLS終端 │
└──────────────────┬───────────────────────────┘
│ (HTTP / 内部ネットワーク)
▼
┌──────────────────────────────────────────────┐
│ バックエンド (Node.js / Go / Python など) │
└──────────────────────────────────────────────┘
① 静的コンテンツの高速配信(Webサーバー)
HTML、CSS、JavaScript、画像といった静的ファイルを、イベント駆動型の軽量・非同期アーキテクチャにより高速かつ省メモリで配信します。
② アプリの保護・中継(リバースプロキシ)
外部からのアクセスを最初に受け付け、背後にあるアプリケーションサーバー(Node.js、Python、Go、Rubyなど)へ安全にリクエストを中継します。
バックエンドのIPアドレスや内部ポート番号を外部に晒さずに済むため、セキュリティが向上します。
③ アクセス集中の分散(ロードバランサー)
1台のアプリサーバーにアクセスが集中してダウンしないよう、複数のバックエンドサーバーへ均等(または負荷状況に応じて)にリクエストを振り分けます。
④ 暗号化通信の集約(SSL/TLSアクセラレータ)
常時HTTPSが標準となった現在、暗号化・復号処理はサーバーに一定の計算負荷を与えます。Nginxが最前線でSSL/TLS通信を複合(SSL終端)し、バックエンドへは通常のHTTPで素通しすることで、アプリケーション側の負荷を大幅に軽減できます。
2. nginx.conf の基本構造と記述ルール
Nginxの設定ファイルは、C言語に似たブロック記法とディレクティブ(命令文)で構成されています。
基本的な構文ルール
-
ディレクティブ(命令)の末尾には必ずセミコロン
;を付ける(付け忘れると構文エラーになります)。 -
#以降はコメント行として扱われます。 - 設定は階層関係(コンテキスト)になっており、外側で設定した内容は内側のブロックへ継承されます。
コンテキストの階層構造
# --- main コンテキスト (最上位) ---
user nginx;
worker_processes auto;
http {
# --- http コンテキスト ---
# Web通信全体の共通設定
server {
# --- server コンテキスト ---
# バーチャルホスト(ドメイン・ポート単位の設定)
location / {
# --- location コンテキスト ---
# URLパスごとの個別ルーティング
}
}
}
| コンテキスト | 役割・主な記述内容 |
|---|---|
| main | ファイルの最上位(波括弧の外側)。プロセス数(worker_processes)や実行ユーザー、ログファイルの基本出力先などを設定。 |
| http |
http { ... } のブロック。Web処理全般の基盤となる共通設定(MIMEタイプ、ログフォーマット、タイムアウト時間など)を設定。 |
| server |
server { ... } のブロック。ドメインやポートごとの仮想サーバー(バーチャルホスト)設定。 |
| location |
location { ... } のブロック。URLのパス(URI)に応じたルーティングやファイルマッピングの個別制御。 |
3. サーバー設定ファイル(serverブロック)の具体例
実務で頻繁に利用される「静的サイト配信」と「リバースプロキシ」の2大構成を紹介します。
① 静的ホームページを配信する設定
HTMLや画像などを特定のディレクトリからそのまま配信する、Webサーバーとしての標準的な構成です。
server {
# 1. 待ち受けるポート番号(HTTPの標準は80)
listen 80;
# 2. サービスを提供するドメイン名(複数指定可能)
server_name example.com www.example.com;
# 3. Webサイトのファイルが配置されているディレクトリ(ドキュメントルート)
root /var/www/html;
# 4. ディレクトリ指定(/)でアクセスされた際に探すデフォルトファイル
index index.html index.htm;
# 5. 通常のリクエスト処理
location / {
# 指定されたURIのファイルを探し、なければディレクトリを探し、それでもなければ404を返す
try_files $uri $uri/ =404;
}
# 6. エラーページのカスタム設定
error_page 404 /404.html;
location = /404.html {
root /var/www/error_pages;
internal; # 外部からの直接アクセスを禁止し、内部転送のみ許可
}
}
② バックエンドへ転送する設定(リバースプロキシ)
Node.js、Go、Python(FastAPI/Django)などのAPIサーバーの手前にNginxを置く、最も実務で遭遇しやすい構成です。
server {
listen 80;
server_name api.example.com;
location / {
# 1. 転送先バックエンドサーバーのURL(ポート番号)
proxy_pass http://127.0.0.1:3000;
# 2. クライアントの情報をバックエンドへ引き渡すためのヘッダー設定
# クライアントがアクセスしてきたホスト名をバックエンドへ伝達
proxy_set_header Host $host;
# クライアントの実際のIPアドレスを伝達
proxy_set_header X-Real-IP $remote_addr;
# 経由したプロキシ経路のIP一覧を追記して伝達
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# クライアントが接続してきたプロトコル(http / https)を伝達
proxy_set_header X-Forwarded-Proto $scheme;
# 3. タイムアウト設定(任意)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
ポイント:なぜ
proxy_set_headerが必要なのか?
リバースプロキシを経由すると、バックエンドサーバーから見たアクセス元IPはすべて「NginxのIP(例: 127.0.0.1)」に見えてしまいます。アクセスログの記録や認証処理を正しく行うため、クライアントの本当のIPや接続プロトコルをヘッダーに詰めて後ろへ渡す必要があります。
4. 設定変更時に必須の運用コマンド
Nginxの設定ファイルを編集した後は、即座に再起動してはいけません。記述ミスがあるとWebサーバー全体がダウンしてしまいます。
1. 構文チェックを行う(必須)
設定ファイルを書き換えたら、反映前に必ず構文チェックコマンドを実行します。
sudo nginx -t
文法にエラーがなければ、以下のように successful と出力されます。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
もしセミコロン抜けやパスの誤りがある場合は該当行のエラーが出力されるため、修正してから次に進みます。
2. 設定を安全に再読み込みする(Graceful Reload)
設定反映には restart ではなく reload を使用します。
sudo systemctl reload nginx
-
restart:一度プロセスを完全終了させてから立ち上げ直すため、瞬間的な切断・ダウンタイムが発生します。 -
reload:既存の接続を維持したまま、バックグラウンドで新しいワーカプロセスを立ち上げて設定を適用するため、**ダウンタイムゼロ(無停止)**で反映されます。
5. まとめ
- Nginxの強み:静的配信の高速性だけでなく、リバースプロキシやSSL集約によってバックエンドアプリを保護・軽量化できる点にある。
-
設定ファイルの基本:
main>http>server>locationの入れ子構造を意識し、末尾のセミコロン;を忘れない。 -
運用ルール:本番環境での反映前には必ず
nginx -tでテストを行い、systemctl reload nginxで無停止反映する。