この記事の対象読者
- Apacheは触ったことがあるが、Nginxは「名前だけ知っている」状態の方
- 「Nginxの方が速いらしい」とは聞くけど、なぜ速いのか説明できない方
- リバースプロキシやロードバランサーとしてNginxを導入したいが、設定ファイルの書き方がわからない方
この記事で得られること
- Nginxの設計思想とイベント駆動アーキテクチャが「空港」のたとえで直感的にわかる
- Apacheとの根本的な設計思想の違いを「ホテル vs 空港」で整理できる
- 開発・ステージング・本番の3環境向け設定ファイルがコピペで手に入る
- 「502 Bad Gateway」「permission denied」等の典型トラブルを自力で解決できるようになる
この記事で扱わないこと
- Nginx PlusおよびNGINX Management Suite(商用版の機能は対象外)
- OpenRestyやTengineなどのNginx派生ディストリビューション
- HTTP/3(QUIC)の詳細な設定(それだけで1記事になるため)
1. はじめに — 「C10K問題」から生まれた異端児
2002年、インターネットに激震が走った。C10K問題(クライアント1万台同時接続問題)だ。
当時主流だったApacheは、リクエスト1つにつきプロセスまたはスレッドを1つ割り当てる設計だった。前回の記事のホテル比喩でいえば「受付係1人が客1人を専任で対応する」スタイル。宿泊客が100人なら受付係も100人必要になる。1万人来たら...? そう、ホテルが人件費で破産する。
この問題に正面から挑んだのが、ロシアのエンジニア Igor Sysoev(イゴール・シソエフ) だった。彼は2004年、全く異なる発想のWebサーバーをリリースする。
「受付係は少数精鋭でいい。ただし、全員が同時に数千人の客を捌ける超人にする」
それがNginx(エンジンエックス)だ。
2024年のW3Techsの調査では、Nginxは全Webサイトの約34%で使われており、Apacheの約30%を追い抜いて世界シェアNo.1に立っている1。「後発の異端児」が「30年の老舗」を超えた瞬間だ。
この記事では、Nginxを「最新鋭の自動化空港」にたとえながら、その仕組みを基礎から実践まで解説する。前回のApache記事では「老舗ホテル」比喩を使った。対比しながら読むと、両者の設計思想の違いがクリアに見えてくるはずだ。
次のセクションでは、Nginxを理解するための前提知識を「空港」のたとえで整理する。この比喩は記事全体を通じて使うので、ここでしっかり押さえておこう。
2. 前提知識 — 空港比喩で押さえる基本用語
Apacheを「老舗の高級ホテル」にたとえたように、Nginxは「最新鋭の自動化空港」にたとえる。少ない管制官が、大量の航空機を同時に捌く。その秘密は「イベント駆動」という設計思想にある。
空港比喩マップ
| 空港の世界 | Nginxの世界 | Apacheのホテル比喩では |
|---|---|---|
| 空港全体 | Nginx | ホテル全体 |
| 管制塔 | Master Process | ホテル本部 |
| 管制官 | Worker Process | 受付係(ただし1人で数千機を同時管理) |
| レーダー画面 | Event Loop | 該当なし(Apacheにはない概念) |
| 搭乗ゲート | server ブロック | VirtualHost |
| 乗り継ぎカウンター | リバースプロキシ | コンシェルジュ |
| 複数の滑走路 | upstream(負荷分散先) | 該当なし |
| 自動販売機 | 静的ファイル配信 | ルームサービスの定番メニュー |
| パイロットへの指示 | ディレクティブ | ディレクティブ |
ホテル vs 空港 — 設計思想の根本的な違い
Apacheのprefork MPMでは「1リクエスト = 1プロセス」。ホテルの受付係が客1人に張り付く。10,000人来たら10,000人の受付係が必要だ。
Nginxは違う。管制官(Worker Process)が1人で、レーダー画面(Event Loop)を眺めながら数千機の航空機を同時に管理する。「着陸許可を出したら、次の機体の離陸指示へ」「応答が来たらまた戻る」。待ち時間にボーッとしないのがNginxの強さの源泉だ。
Apacheにもevent MPM(非同期対応)があるが、これは「ホテルが空港の真似をした」ような立ち位置だ。Nginxはゼロから空港として設計されている。
空港の全体像がつかめたところで、次はこの空港がどのように建設され、世界のシェアNo.1にまで成長したかを振り返る。
3. Nginxの歴史 — ロシア発、世界制覇への軌跡
3.1 誕生の背景
Igor Sysoevは当時、ロシアの大手ポータルサイト Rambler のシステム管理者だった。膨大なアクセスを捌く必要に迫られ、C10K問題を根本から解決するWebサーバーを独自に開発した。2004年にオープンソースとして公開。名前の「Nginx」は「Engine X」の短縮形だ。
3.2 成長の軌跡
3.3 なぜNginxが勝てたのか
NginxがApacheを追い抜いた決定的な要因は3つある。
1. メモリ効率の圧倒的な差
Apacheのpreforkがリクエストごとにプロセスを立ち上げる(1プロセス数MB)のに対し、Nginxは固定数のWorker Processで全てを捌く。同時10,000接続時のメモリ使用量は、Apache(prefork)の約1/10と言われている。
2. 静的ファイル配信の速さ
空港の自動販売機と同じで、人を介さずにコンテンツを返せる。HTML、CSS、画像ファイルの配信速度はNginxの独壇場だ。
3. リバースプロキシとしての優秀さ
Nginxは「空港の乗り継ぎカウンター」として設計段階から最適化されている。バックエンドのNode.jsやGoやPythonアプリへの転送が、設定数行で完了する。
Nginxがなぜ強いのかがわかったところで、いよいよ内部構造に踏み込む。管制官がレーダー画面でどのように数千機を同時に捌いているのか、その仕組みを見てみよう。
4. 核心 — Nginxのアーキテクチャを理解する
4.1 Master Process と Worker Process — 管制塔と管制官
Nginxのプロセスモデルは極めてシンプルだ。
| プロセス | 空港比喩 | 役割 | 数 |
|---|---|---|---|
| Master Process | 管制塔の塔長 | 設定の読み込み、Workerの起動・監視・シグナル処理 | 1 |
| Worker Process | 管制官 | 実際のリクエスト処理を担当。1人で数千接続を同時管理 | CPUコア数と同数が推奨 |
worker_processes auto;と設定すると、NginxがCPUコア数を自動検出して最適なWorker数を起動する。筆者のIntel Core Ultra 9 285K(24コア)環境では、Worker Processが24個立ち上がった。壮観...! だが、通常のWebサーバー用途なら4〜8で十分だ。
4.2 Event Loop — レーダー画面の正体
Nginxの速さの核心がイベントループだ。これは管制官の手元にある「レーダー画面」にあたる。
Apacheのprefork方式(ホテルの受付):
客A到着 → 受付係Aが専任対応 → 客Aの処理完了を「待つ」 → 次の客へ
この「待つ」時間が問題だ。ディスクI/Oやネットワーク応答を待っている間、受付係は何もできない。
Nginxのイベントループ方式(空港の管制):
機体Aが着陸要求 → 「着陸許可」を出す → 待たずに機体Bの離陸指示へ
→ 機体Aが滑走路に到着 → 「ゲート3へ」と指示 → すぐ機体Cの対応へ
「待たない」 のだ。I/O操作(ファイル読み込み、バックエンドへのプロキシ転送など)を開始したら、その完了を待たずに次のリクエストの処理に移る。完了通知が来たら、そのタイミングで戻って続きを処理する。
これを支えるOSレベルの仕組みがepoll(Linux)やkqueue(FreeBSD/macOS)だ。
4.3 設定ファイルの構造 — フライトプラン
Nginxの設定ファイルはApacheと大きく異なる。XMLライクなApacheに対し、NginxはC言語風の構造化ブロックを採用している。
# nginx.conf の基本構造
# 管制塔の基本方針(メインコンテキスト)
worker_processes auto;
events {
# 管制官1人あたりの同時対応数
worker_connections 1024;
}
http {
# HTTP通信の全般設定
server {
# 搭乗ゲート1(= サイトA)
listen 80;
server_name example.com;
location / {
# ゲート内のルール
root /var/www/html;
}
location /api {
# 乗り継ぎカウンター(リバースプロキシ)
proxy_pass http://backend_servers;
}
}
server {
# 搭乗ゲート2(= サイトB)
listen 80;
server_name blog.example.com;
# ...
}
}
| 設定ブロック | 空港比喩 | 役割 |
|---|---|---|
| メインコンテキスト | 空港全体の運営方針 | Worker数、ログパスなどの全体設定 |
events |
管制官の勤務体制 | 同時接続数の上限設定 |
http |
旅客ターミナル全体 | HTTPプロトコルに関する設定の親ブロック |
server |
搭乗ゲート | VirtualHostに相当。ドメインごとのルール |
location |
ゲート内のエリア | URLパスごとの処理ルール |
upstream |
複数の滑走路 | ロードバランサーの転送先定義 |
NginxにはApacheの.htaccessに相当する機能がない。「部屋ごとのルール」は全てnginx.conf(またはsites-available/配下のファイル)に集中管理する。レンタルサーバーでNginxが採用されにくい最大の理由がこれだ。
アーキテクチャの全体像が見えてきた。次は実際に手を動かしてNginxを起動してみよう。
5. ハンズオン — Nginxを動かしてみよう
5.1 インストール
Ubuntu / Debian系
# パッケージリストの更新
sudo apt update
# Nginxのインストール
sudo apt install nginx -y
# 起動確認
sudo systemctl status nginx
CentOS / RHEL / Amazon Linux系
# Nginx公式リポジトリを追加(最新版が欲しい場合)
sudo dnf install nginx -y
# 起動 + 自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx
Docker(推奨: 環境を汚さない)
# 公式イメージで起動
docker run -d --name my-nginx -p 8080:80 nginx:stable
# ブラウザで http://localhost:8080 にアクセス
# → "Welcome to nginx!" が表示される
ブラウザでhttp://localhostにアクセスして「Welcome to nginx!」が表示されれば成功。空港のターミナルが開業した。
筆者のWSL2環境ではapt installから「Welcome to nginx!」表示まで約10秒。Apacheの15秒より速かった。パッケージサイズがApacheの約半分なので当然と言えば当然だが、この「軽さ」がNginxの哲学を体現している。
5.2 ディレクトリ構成を理解する
Nginxのディレクトリ構成は、空港のフロアマップだ。Apacheと構造が似ているが、よりシンプル。
/etc/nginx/ ← 空港管理本部
├── nginx.conf ← 空港全体の運営方針(メイン設定)
├── sites-available/ ← 建設済みだが未開業のゲート
│ └── default ← デフォルトのゲート
├── sites-enabled/ ← 営業中のゲート(シンボリックリンク)
│ └── default -> ../sites-available/default
├── conf.d/ ← 追加設定置き場
├── snippets/ ← 使い回す設定の部品
│ ├── fastcgi-php.conf ← PHP連携用のテンプレ
│ └── self-signed.conf ← 自己署名SSL用テンプレ
├── mime.types ← ファイル種別とContent-Typeの対応表
└── modules-enabled/ ← 有効なモジュール
Apacheのa2ensite/a2dissiteに相当するコマンドはNginxにはない。代わりに手動でシンボリックリンクを作成・削除する。
# ゲートを開業(サイトを有効化)
sudo ln -s /etc/nginx/sites-available/my-site /etc/nginx/sites-enabled/
# ゲートを閉鎖(サイトを無効化)
sudo rm /etc/nginx/sites-enabled/my-site
5.3 serverブロックを設定してみる
「空港に新しい搭乗ゲートを追加する」作業をやってみよう。
serverブロック設定ファイルの例
# /etc/nginx/sites-available/my-app
server {
listen 80;
server_name myapp.example.com www.myapp.example.com;
# コンテンツの場所
root /var/www/myapp/public;
index index.html index.htm;
# アクセスログ・エラーログ
access_log /var/log/nginx/myapp-access.log;
error_log /var/log/nginx/myapp-error.log;
# 静的ファイルの配信(自動販売機)
location / {
try_files $uri $uri/ =404;
}
# APIへのリバースプロキシ(乗り継ぎカウンター)
location /api {
proxy_pass http://127.0.0.1:8000;
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;
}
}
# シンボリックリンクでゲートを開業
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
# 設定ファイルの文法チェック(超重要)
sudo nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# Nginxをリロード(ダウンタイムなし!)
sudo systemctl reload nginx
nginx -tは必ずreloadの前に実行すること。文法エラーがあるとreloadが失敗し、既存の接続には影響しないが新しい設定も反映されない。Apacheのapachectl configtestと同じ役割だ。
基本セットアップができたところで、次は実戦で使える3環境分の設定ファイルを用意する。
6. 環境別コンフィグ — コピペで使える3環境分
6.1 開発環境(ローカル開発用)
dev.conf — 開発環境用serverブロック
# /etc/nginx/sites-available/dev.conf
# 開発環境: デバッグ情報最大、アクセス制限なし
server {
listen 80;
server_name dev.myapp.local;
root /var/www/myapp/public;
index index.html;
# デバッグ用: 詳細ログ
access_log /var/log/nginx/dev-access.log;
error_log /var/log/nginx/dev-error.log debug;
# ディレクトリ一覧表示を許可(開発時は便利)
autoindex on;
# キャッシュ無効化(変更が即時反映される)
add_header Cache-Control "no-store, no-cache, must-revalidate";
location / {
try_files $uri $uri/ =404;
}
# Python(FastAPI/Django)バックエンドへのプロキシ
location /api {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# WebSocket対応(開発時のHot Reload用)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Node.jsフロントエンド開発サーバーへのプロキシ
location /app {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
6.2 ステージング環境(本番に近い検証用)
staging.conf — ステージング環境用serverブロック
# /etc/nginx/sites-available/staging.conf
# ステージング: 本番に近い設定 + IP制限
server {
listen 80;
server_name staging.myapp.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name staging.myapp.example.com;
root /var/www/myapp/public;
index index.html;
# SSL設定
ssl_certificate /etc/letsencrypt/live/staging.myapp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/staging.myapp.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# ログ: 本番レベル + 少し詳細
access_log /var/log/nginx/staging-access.log;
error_log /var/log/nginx/staging-error.log warn;
# IP制限(社内ネットワークのみ)
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
# 基本的なセキュリティヘッダー
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
location / {
try_files $uri $uri/ =404;
}
location /api {
proxy_pass http://127.0.0.1:8000;
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;
}
}
6.3 本番環境(プロダクション)
production.conf — 本番環境用serverブロック
# /etc/nginx/sites-available/production.conf
# 本番環境: セキュリティ最優先 + パフォーマンスチューニング
# ロードバランサー(複数の滑走路に航空機を分散)
upstream backend_pool {
least_conn; # 接続数が最も少ないサーバーへ振り分け
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
keepalive 32;
}
# HTTPはHTTPSへリダイレクト
server {
listen 80;
server_name myapp.example.com www.myapp.example.com;
return 301 https://myapp.example.com$request_uri;
}
# wwwありをwwwなしにリダイレクト
server {
listen 443 ssl;
server_name www.myapp.example.com;
ssl_certificate /etc/letsencrypt/live/myapp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myapp.example.com/privkey.pem;
return 301 https://myapp.example.com$request_uri;
}
# メインサーバーブロック
server {
listen 443 ssl http2;
server_name myapp.example.com;
root /var/www/myapp/public;
index index.html;
# SSL設定(TLS 1.2以上のみ)
ssl_certificate /etc/letsencrypt/live/myapp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myapp.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# セキュリティヘッダー
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'" always;
# Nginxバージョン情報を隠す
server_tokens off;
# ログ: 最小限
access_log /var/log/nginx/production-access.log;
error_log /var/log/nginx/production-error.log error;
# gzip圧縮
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1000;
gzip_vary on;
# 静的ファイル(長期キャッシュ)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# メインコンテンツ
location / {
try_files $uri $uri/ /index.html;
}
# APIへのリバースプロキシ(ロードバランサー経由)
location /api {
proxy_pass http://backend_pool;
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_http_version 1.1;
proxy_set_header Connection "";
# タイムアウト設定
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 30s;
}
# ヘルスチェックエンドポイント
location /health {
access_log off;
return 200 "OK\n";
add_header Content-Type text/plain;
}
}
本番環境ではautoindex on;を絶対に設定しないこと。ディレクトリの中身が丸見えになり、セキュリティリスクになる。開発環境でのみ使用すること。
設定ファイルが揃ったところで、次は「設定したのに動かない!」というよくあるトラブルへの対処法をまとめる。
7. トラブルシューティング — よくあるエラーと対処法
現場で遭遇頻度の高いエラーを、空港比喩と共に整理した。
| 症状 | 空港比喩 | 原因 | 対処法 |
|---|---|---|---|
| 502 Bad Gateway | 「乗り継ぎ先の航空会社が応答しない」 | バックエンドサーバーが起動していない or ポート番号が間違い |
proxy_passのURLとバックエンドの起動状態を確認 |
| 403 Forbidden | 「このゲートは立入禁止です」 | ファイルのパーミッション不足 or deny allの設定 |
chmod 755でディレクトリ権限を確認。設定にallowがあるか確認 |
| 404 Not Found | 「そのゲートは存在しません」 |
rootのパスが間違い or try_filesの設定ミス |
ファイルの実在確認 + rootパスの見直し |
nginx: [emerg] bind() to 0.0.0.0:80 failed |
「その滑走路は別の航空会社が使用中」 | ポート80がApache等に占有されている |
sudo lsof -i :80で競合プロセスを特定して停止 |
| 413 Request Entity Too Large | 「手荷物がサイズオーバーです」 | アップロードファイルがデフォルト上限(1MB)を超えた |
client_max_body_size 100m;をserverブロックに追加 |
connect() failed (111: Connection refused) |
「乗り継ぎカウンターが閉まっている」 |
proxy_pass先のアプリが落ちている |
バックエンドアプリの起動状態を確認 |
| SSL証明書エラー | 「セキュリティチェックで引っかかった」 | 証明書のパスが間違い or 期限切れ |
openssl x509 -dates -in cert.pemで有効期限を確認 |
環境診断スクリプト
Nginx環境チェックスクリプト(コピペ用)
#!/bin/bash
# Nginx環境診断スクリプト
echo "===== Nginx 環境診断 ====="
echo ""
echo "--- Nginxバージョン ---"
nginx -v 2>&1
echo ""
echo "--- 稼働状態 ---"
systemctl is-active nginx
echo ""
echo "--- プロセス状態 ---"
ps aux | grep nginx | grep -v grep
echo ""
echo "--- 設定ファイルの文法チェック ---"
sudo nginx -t 2>&1
echo ""
echo "--- 有効なserverブロック ---"
ls -la /etc/nginx/sites-enabled/ 2>/dev/null || \
echo "sites-enabledディレクトリが存在しません(conf.d/を確認してください)"
echo ""
echo "--- ポート使用状況 ---"
sudo lsof -i :80 -i :443 2>/dev/null | head -20
echo ""
echo "--- 最新のエラーログ(直近10行) ---"
sudo tail -10 /var/log/nginx/error.log 2>/dev/null
echo ""
echo "--- Worker Process数 ---"
grep worker_processes /etc/nginx/nginx.conf 2>/dev/null
echo ""
echo "--- worker_connections ---"
grep worker_connections /etc/nginx/nginx.conf 2>/dev/null
echo ""
echo "===== 診断完了 ====="
トラブル対処の武器を手に入れたところで、次は「実際にどんな場面でNginxが使われているのか」を見ていこう。
8. ユースケース — Nginxが真価を発揮する場面
8.1 リバースプロキシ — 最も多い使い方
Nginxの最も一般的な使い方は「空港の乗り継ぎカウンター」としてのリバースプロキシだ。フロントに立って静的ファイルをさばきつつ、動的リクエストはバックエンドに転送する。
ブラウザ → Nginx → Python(FastAPI/Django) / Node.js / Go
→ 静的ファイルはNginxが直接返す
# 典型的なリバースプロキシ構成
location / {
# SPAの静的ファイルを配信
try_files $uri $uri/ /index.html;
}
location /api {
# PythonバックエンドのFastAPIに転送
proxy_pass http://127.0.0.1:8000;
}
8.2 ロードバランサー — 複数の滑走路に分散
大量のトラフィックを複数のバックエンドサーバーに分散する「複数滑走路」の構成。Nginx単体でロードバランサーが実現できるのは大きな強みだ。
upstream backend_pool {
# 分散アルゴリズムを選択
least_conn; # 接続数が最も少ないサーバーへ
# ip_hash; # 同じIPからのリクエストは同じサーバーへ
# round_robin; # デフォルト: 順番に振り分け
server 127.0.0.1:8001 weight=3; # 3倍の重み(高性能サーバー)
server 127.0.0.1:8002;
server 127.0.0.1:8003 backup; # 他が全滅したときだけ使用
}
8.3 静的ファイルサーバー — 自動販売機としての実力
CDN的に静的ファイルを高速配信する用途。Dockerコンテナのフロントエンドとして、ReactやVueのビルド済みSPAを配信するケースが非常に多い。
Dockerfile: フロントエンド配信用Nginx
# マルチステージビルド: フロントエンドのビルド + Nginx配信
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:stable-alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
8.4 SSL終端 — セキュリティチェックの最前線
HTTPS通信のSSL/TLS処理をNginxが引き受け、バックエンドにはHTTPで転送するパターン。バックエンドアプリがSSLを意識しなくてよくなるので、構成がシンプルになる。
ブラウザ --[HTTPS]--> Nginx --[HTTP]--> バックエンドアプリ
暗号化通信 Nginxが復号 平文通信(内部ネットワーク)
ユースケースを一通り見てきた。最後に「ここからどう学びを深めていくか」のロードマップを示す。
9. 学習ロードマップ — 次に何を学ぶべきか
| レベル | やること | おすすめリソース |
|---|---|---|
| ビギナー | この記事の内容を手を動かして再現 | Nginx公式 Beginner's Guide |
| 中級者 | Let's EncryptでHTTPS化 + リバースプロキシ構成 | DigitalOcean のNginxチュートリアル群 |
| 上級者 | rate limiting + HTTP/2有効化 + Kubernetes Ingress Controller | Nginx公式Admin Guide |
まとめ
Nginxは、2002年のC10K問題に対する「設計からやり直す」というアプローチから生まれた。Apacheが「老舗ホテル」なら、Nginxは「最新鋭の自動化空港」。少ない管制官(Worker Process)がイベントループという名のレーダー画面を駆使して、数千の航空機(接続)を同時に捌く。
筆者がNginxの設定を初めて触ったとき、正直Apacheの.htaccess的な「とりあえずここに書けば動く」感がなくて面食らった。しかしnginx.confの構造化されたブロック構文に慣れてくると、何がどこに書いてあるかが一目瞭然で、むしろApacheより管理しやすいと感じるようになった。.htaccessは便利だが、「どこに何が書いてあるかわからなくなる」という分散管理の闇がある。Nginxの集中管理はその点で潔い。
「ApacheかNginxか」ではなく、「どちらの設計思想が自分のプロジェクトに合うか」で選ぶのが正解だ。そしてその判断ができるようになるためには、両方を知っておくことが一番の近道だと思う。
参考文献
この記事が役に立ったら「いいね」「ストック」をいただけると、次の記事を書くモチベーションになります。
関連記事
-
W3Techs - Usage Statistics of Web Servers ↩