1. Nginxとは?
Nginx(「エンジンエックス」と発音)は、Igor Sysoevが2004年に開発した強力でハイパフォーマンスなオープンソースWebサーバーです。もともとC10K問題(1万件の同時接続処理)を解決するために作られ、世界で最も人気のあるWebサーバーの1つになっています。
NginxはWebサーバーだけでなく、以下の役割も担えます:
- リバースプロキシサーバー
- ロードバランサー
- HTTPキャッシュ
- メールプロキシサーバー
- APIゲートウェイ
イベント駆動型とノンブロッキングI/Oアーキテクチャ
Nginxの最大の強みはそのアーキテクチャにあります。従来のモデルとは異なり、Nginxはイベント駆動型かつノンブロッキングI/O(非同期)アーキテクチャを使用しています。
動作の仕組み:
- マスタープロセス:設定を読み込み・評価し、ワーカープロセスを管理する単一プロセス
- ワーカープロセス:実際の接続を処理する複数のプロセス
- イベントループ:各ワーカープロセスはイベントループを使用して何千もの接続を同時に処理する
ノンブロッキングI/Oの意味:
- ワーカープロセスがI/O(ファイル読み込み、DBクエリ、ネットワークリクエスト)を待っているとき「ブロック」されず、他のリクエストを処理できる
- 1つのワーカープロセスが同時に何千もの接続を処理できる
- CPUとRAMリソースを大幅に節約できる
図解:
Apache(ブロッキング): リクエスト1 → スレッド1 → ファイル読み込み待ち(ブロック) → 完了 リクエスト2 → スレッド2 → ファイル読み込み待ち(ブロック) → 完了 リクエスト3 → スレッド3 → ファイル読み込み待ち(ブロック) → 完了 → 3リクエストに3スレッド必要
Nginx(ノンブロッキング): リクエスト1 → ワーカー → I/O待ち → リクエスト2処理 → リクエスト3処理 → リクエスト1完了 リクエスト2 → 同じワーカー リクエスト3 → 同じワーカー → 3リクエストに1ワーカーで十分
2. Nginx vs Apache 比較
| 項目 | Nginx | Apache |
|---|---|---|
| アーキテクチャ | イベント駆動型、非同期 | プロセス/スレッド型 |
| 接続処理 | 1ワーカーが多数の接続を処理 | 接続ごとに1スレッド/プロセス |
| メモリ | 非常に低く、安定している | 接続数に比例して増加 |
| 静的コンテンツ | 非常に高速 | 高速だがNginxより遅い |
| 動的コンテンツ | バックエンドとの連携が必要(PHP-FPM) | 直接処理可能(mod_php) |
| 設定 | 集中型、ファイルベース | 分散型(.htaccess) |
| モジュール | 事前にコンパイル必要 | 動的ロード可能 |
| リライトルール | 独自の形式、よりシンプル | .htaccessで強力 |
| 適した用途 | 高トラフィック、静的コンテンツ、リバースプロキシ | 共有ホスティング、動的コンテンツ処理 |
Nginxを使うべき場合:
- 静的ファイルの配信(HTML、CSS、JS、画像)
- アプリケーションサーバーのリバースプロキシ
- ロードバランシング
- 高い並行性(多数の同時接続)
- 限られたリソースで高いパフォーマンスが必要
Apacheを使うべき場合:
- 共有ホスティング環境
- .htaccessの柔軟性が必要
- 多数の動的モジュール
- Apache固有の機能に依存するレガシーアプリ
現在のトレンド: 多くのシステムが組み合わせを使用しています。Nginxをフロントのリバースプロキシとして、Apacheが背後で動的コンテンツを処理します。
3. Nginxのインストール
3.1. Ubuntu/Debianへのインストール
方法1:デフォルトリポジトリからインストール(最もシンプル)
# パッケージリストを更新 sudo apt updateNginxをインストール
sudo apt install nginx -y
バージョン確認
nginx -v
状態確認
sudo systemctl status nginx
方法2:公式Nginxリポジトリからインストール(最新バージョン)
# 前提パッケージのインストール sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring公式nginx署名キーをインポート
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/nullリポジトリの設定
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
http://nginx.org/packages/ubuntulsb_release -csnginx"
| sudo tee /etc/apt/sources.list.d/nginx.list更新してインストール
sudo apt update sudo apt install nginx -y
3.2. CentOS/RHELへのインストール
方法1:EPELリポジトリから
# CentOS 7 sudo yum install epel-release -y sudo yum install nginx -yCentOS 8 / Rocky Linux / AlmaLinux
sudo dnf install nginx -y
起動と有効化
sudo systemctl start nginx sudo systemctl enable nginx
ファイアウォールを開放
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
方法2:公式Nginxリポジトリから
# リポジトリファイルを作成 sudo tee /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOFインストール
sudo yum install nginx -y
3.3. macOSへのインストール
Homebrewを使用:
# Homebrewをインストール(まだない場合) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Nginxをインストール
brew install nginx
Nginxを起動
brew services start nginx
またはフォアグラウンドで実行
nginx
確認
nginx -v
macOS上のパス:
- 設定:
/usr/local/etc/nginx/nginx.conf - ドキュメントルート:
/usr/local/var/www - ログ:
/usr/local/var/log/nginx
3.4. Windowsへのインストール
ステップ1:ダウンロード
- アクセス先: http://nginx.org/en/download.html
- Windowsバージョン(nginx-x.x.x.zip)をダウンロード
ステップ2:展開して実行
# C:\nginxに展開管理者としてコマンドプロンプトを開く
cd C:\nginx
Nginxを起動
start nginx
または
nginx.exe
Windows上でのNginx管理:
# バージョン確認 nginx -v設定テスト
nginx -t
停止
nginx -s stop
リロード
nginx -s reload
グレースフル終了
nginx -s quit
注意: WindowsではNginxはLinuxほど安定しておらず、本番環境での使用は推奨されません。
4. ディレクトリ構造と基本設定ファイル
4.1. Ubuntu/Debianのディレクトリ構造
/etc/nginx/ ├── nginx.conf # メイン設定ファイル ├── mime.types # MIMEタイプ定義 ├── fastcgi_params # FastCGIパラメーター ├── proxy_params # プロキシパラメーター ├── sites-available/ # 利用可能なサイト設定 │ └── default # デフォルトバーチャルホスト ├── sites-enabled/ # アクティブなサイトへのシンボリックリンク │ └── default -> ../sites-available/default ├── conf.d/ # 追加設定 ├── modules-available/ # 利用可能なモジュール └── modules-enabled/ # 有効なモジュール/var/log/nginx/ ├── access.log # アクセスログ └── error.log # エラーログ
/var/www/html/ # デフォルトドキュメントルート └── index.nginx-debian.html
/usr/share/nginx/html/ # 代替ドキュメントルート
4.2. CentOS/RHELのディレクトリ構造
/etc/nginx/ ├── nginx.conf # メイン設定ファイル ├── mime.types ├── fastcgi_params ├── conf.d/ # バーチャルホスト設定 │ └── default.conf └── default.d//var/log/nginx/ ├── access.log └── error.log
/usr/share/nginx/html/ # ドキュメントルート └── index.html
4.3. 基本的なnginx.conf設定ファイル
# Nginxを実行するユーザー user www-data;ワーカープロセス数(通常はCPUコア数)
worker_processes auto;
PIDファイル
pid /run/nginx.pid;
動的モジュールのロード
include /etc/nginx/modules-enabled/*.conf;
events { # ワーカーあたりの最大接続数 worker_connections 768;
# イベント方式(Linuxではepoll) use epoll;}
http { ## # 基本設定 ## sendfile on; tcp_nopush on; types_hash_max_size 2048;
# MIMEタイプ include /etc/nginx/mime.types; default_type application/octet-stream; ## # ログ設定 ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip設定 ## gzip on; gzip_disable "msie6"; ## # バーチャルホスト設定 ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
}
4.4. サンプルバーチャルホストファイル
server { # リスニングポート listen 80; listen [::]:80;# ドメイン名 server_name example.com www.example.com; # ドキュメントルート root /var/www/example.com; index index.html index.htm; # アクセスログとエラーログ access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; # locationブロック location / { try_files $uri $uri/ =404; } # .htaccessへのアクセスを拒否 location ~ /\.ht { deny all; }
}
5. Nginxの起動・停止・リロード
5.1. systemctlで管理(Linux)
# Nginxを起動 sudo systemctl start nginxNginxを停止
sudo systemctl stop nginx
Nginxを再起動
sudo systemctl restart nginx
設定をリロード(ダウンタイムなし)
sudo systemctl reload nginx
状態確認
sudo systemctl status nginx
起動時の自動起動を有効化
sudo systemctl enable nginx
自動起動を無効化
sudo systemctl disable nginx
5.2. nginxコマンドで管理
# 設定テスト(リロード前に必ず実行) sudo nginx -tテストと設定表示
sudo nginx -T
設定をリロード
sudo nginx -s reload
グレースフル停止(現在のリクエストが完了するまで待機)
sudo nginx -s quit
即時停止
sudo nginx -s stop
ログファイルを再オープン(ログローテーション後)
sudo nginx -s reopen
バージョンとコンパイルオプションを表示
nginx -V
5.3. reload・restart・stopの違い
reload:
- ダウンタイムなし
- Nginxが設定を再読み込み
- 古いワーカープロセスは現在のリクエストを完了後に終了
- 新しいワーカープロセスが新しい設定で作成される
- 使う場面: 設定変更、バーチャルホストの追加・変更時
sudo nginx -s reloadまたは
sudo systemctl reload nginx
restart:
- ダウンタイムあり(短時間)
- 完全に停止してから再起動
- すべての接続が切断される
- 使う場面: 新しいモジュールのインストール、大きな変更時
sudo systemctl restart nginx
stop vs quit:
# 即時停止(接続を切断) sudo nginx -s stopグレースフル終了(リクエスト完了を待つ)
sudo nginx -s quit
5.4. Nginxが動作しているか確認
# プロセス確認 ps aux | grep nginxリスニングポートを確認
sudo netstat -tulpn | grep nginx
または
sudo ss -tulpn | grep nginx
バージョン確認
nginx -v
アクセステスト
curl http://localhost
または
curl -I http://localhost
5.5. 基本的なトラブルシューティング
エラー:nginx.conf テスト失敗
# 詳細エラーを確認 sudo nginx -tエラーログを表示
sudo tail -f /var/log/nginx/error.log
エラー:ポート80がすでに使用中
# ポート80を使用しているプロセスを確認 sudo lsof -i :80または
sudo netstat -tulpn | grep :80
必要ならプロセスをkill
sudo kill -9 <PID>
エラー:Permission denied
# nginx.confのユーザーを確認 grep user /etc/nginx/nginx.confディレクトリのパーミッションを確認
ls -la /var/www/html
オーナーシップを修正
sudo chown -R www-data:www-data /var/www/html
ブラウザでアクセスできない場合:
# ファイアウォール確認(Ubuntu/Debian) sudo ufw status sudo ufw allow 'Nginx Full'ファイアウォール確認(CentOS)
sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
SELinux確認(CentOS)
sudo getenforce sudo setenforce 0 # テスト用に一時的に無効化
6. 演習
演習1:インストールと確認
- お使いのOSにNginxをインストールする
- バージョンと状態を確認する
- http://localhostにアクセスしてデフォルトのウェルカムページを確認する
- access.logファイルを見つけて表示する
演習2:コマンドに慣れる
- 設定テスト:
nginx -t - Nginxをリロードする
- Nginxを停止して再起動する
- 実行中のプロセスを確認する
演習3:ディレクトリ構造を探索する
- nginx.confを開いてディレクティブを読む
- デフォルトバーチャルホストのドキュメントルートを見つける
- ドキュメントルートにシンプルなHTMLファイルを作成する
- ブラウザでファイルにアクセスする
演習4:意図的なエラーの修正
- nginx.confに意図的に不正な構文を追加する
nginx -tを実行してエラーを確認する- エラーを修正して再テストする
まとめ
このレッスンで学んだこと:
- ✅ Nginxとは何か、イベント駆動型アーキテクチャ
- ✅ Nginx vs Apache 比較
- ✅ 複数のOSへのNginxのインストール
- ✅ ディレクトリ構造と設定ファイル
- ✅ 基本的なNginx管理コマンド
次のレッスン: Nginxの設定を深く掘り下げ、コンテキスト・ディレクティブ・バーチャルホスト・静的ファイルの配信について学びます。