Chuyển đến nội dung chính

第1課:Nginxの紹介とインストール

Nginxのイベント駆動型アーキテクチャを紹介し、Ubuntu/CentOS/macOS/Windowsへのインストール手順、 ディレクトリ構造、start・stop・reloadなどの基本管理コマンドを解説します。 NginxとApacheの違いを理解し、よくあるエラーのトラブルシューティング方法を学びます。

🔒 DevSecOps — 第1課 第1課:Nginxの紹介とインストール

Nginxの基礎から応用まで

第1部:基礎

xdev.asia

1. Nginxとは?

Nginx(「エンジンエックス」と発音)は、Igor Sysoevが2004年に開発した強力でハイパフォーマンスなオープンソースWebサーバーです。もともとC10K問題(1万件の同時接続処理)を解決するために作られ、世界で最も人気のあるWebサーバーの1つになっています。

NginxはWebサーバーだけでなく、以下の役割も担えます:

  • リバースプロキシサーバー
  • ロードバランサー
  • HTTPキャッシュ
  • メールプロキシサーバー
  • APIゲートウェイ

イベント駆動型とノンブロッキングI/Oアーキテクチャ

Nginxの最大の強みはそのアーキテクチャにあります。従来のモデルとは異なり、Nginxはイベント駆動型かつノンブロッキングI/O(非同期)アーキテクチャを使用しています。

動作の仕組み:

  1. マスタープロセス:設定を読み込み・評価し、ワーカープロセスを管理する単一プロセス
  2. ワーカープロセス:実際の接続を処理する複数のプロセス
  3. イベントループ:各ワーカープロセスはイベントループを使用して何千もの接続を同時に処理する

ノンブロッキング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 update

Nginxをインストール

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/ubuntu lsb_release -cs nginx"
| 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 -y

CentOS 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:ダウンロード

ステップ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 nginx

Nginxを停止

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:インストールと確認

  1. お使いのOSにNginxをインストールする
  2. バージョンと状態を確認する
  3. http://localhostにアクセスしてデフォルトのウェルカムページを確認する
  4. access.logファイルを見つけて表示する

演習2:コマンドに慣れる

  1. 設定テスト:nginx -t
  2. Nginxをリロードする
  3. Nginxを停止して再起動する
  4. 実行中のプロセスを確認する

演習3:ディレクトリ構造を探索する

  1. nginx.confを開いてディレクティブを読む
  2. デフォルトバーチャルホストのドキュメントルートを見つける
  3. ドキュメントルートにシンプルなHTMLファイルを作成する
  4. ブラウザでファイルにアクセスする

演習4:意図的なエラーの修正

  1. nginx.confに意図的に不正な構文を追加する
  2. nginx -tを実行してエラーを確認する
  3. エラーを修正して再テストする

まとめ

このレッスンで学んだこと:

  • ✅ Nginxとは何か、イベント駆動型アーキテクチャ
  • ✅ Nginx vs Apache 比較
  • ✅ 複数のOSへのNginxのインストール
  • ✅ ディレクトリ構造と設定ファイル
  • ✅ 基本的なNginx管理コマンド

次のレッスン: Nginxの設定を深く掘り下げ、コンテキスト・ディレクティブ・バーチャルホスト・静的ファイルの配信について学びます。