0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nginxってなんだ? — 「たった1人で空港を回す」超効率型Webサーバーの全貌と実践ガイド

0
Posted at

この記事の対象読者

  • 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レベルの仕組みがepollLinux)や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か」ではなく、「どちらの設計思想が自分のプロジェクトに合うか」で選ぶのが正解だ。そしてその判断ができるようになるためには、両方を知っておくことが一番の近道だと思う。


参考文献


この記事が役に立ったら「いいね」「ストック」をいただけると、次の記事を書くモチベーションになります。

関連記事


Follow on X

  1. W3Techs - Usage Statistics of Web Servers

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?