🧑‍💻

Webサーバーソフトウェアとnginx(エンジンエックス)

2024/10/26に公開

Webサーバーソフトウェアとは

Webサーバーソフトウェアとは、インターネットからのアクセスを受け付けて、適切に処理を振り分けるソフトウェアです。現代のWeb運用において中核を担う重要なコンポーネントです。その中の一つが、今回解説するnginxです。

歴史的背景と進化

  1. 初期(1990年代)

    • Apache HTTP Serverが主流
    • HTTPによる単純な通信が標準
    • 小規模なWebサイト運用が中心
  2. 転換期(2000年代前半)

    • Webサイトの大規模化
    • C10K問題(1万以上の同時接続)への対応が課題に
    • HTTPSの必要性が増加(ECサイトの普及)
    • nginxの登場で効率的な処理が可能に
  3. 現代(2015年以降)

    • HTTPSの一般化(Let's Encrypt登場)
    • 同時接続数の更なる増加
    • クラウド・コンテナ環境の普及

Webサーバーソフトウェアが解決する主要な課題

  1. パフォーマンスの課題

    • 大量の同時接続処理
    • 効率的なリソース使用
    • 高速なレスポンス
  2. プロトコルの課題

    • HTTP/HTTPS双方への対応
    • 適切なリダイレクト処理
    • SSL/TLS終端処理
  3. システム構成の課題

    • リバースプロキシ
    • ロードバランシング
    • マイクロサービス間の通信

nginxが選ばれる理由

  1. 技術的優位性

    • イベント駆動型による効率的な処理
    • 少ないメモリでの動作
    • 高い安定性
  2. 運用上の利点

    • シンプルな設定
    • 柔軟なルーティング
    • 効率的なSSL/TLS処理

実際の使用例

  1. 基本的なWebサーバーとして

    • 静的コンテンツの配信
    • HTTPSへの自動リダイレクト
    • SSL/TLS証明書の管理
  2. リバースプロキシとして

    • 複数バックエンドの集約
    • 内部サービスの保護
    • トラフィックの制御
  3. ロードバランサーとして

    • トラフィックの分散
    • ヘルスチェック
    • セッション永続性の管理

ディレクトリ構造

/etc/nginx/
├── nginx.conf          # メインの設定ファイル
├── conf.d/             # 追加の設定ファイルディレクトリ
│   └── *.conf          # 追加の設定ファイル
├── sites-available/    # 利用可能なサイト設定を格納
│   ├── default         # デフォルトサイトの設定
│   └── example.com     # 特定のドメインの設定
├── sites-enabled/      # 有効なサイト設定(シンボリックリンク)
│   └── default -> ../sites-available/default
├── modules-available/  # 利用可能なnginxモジュールの設定
├── modules-enabled/    # 有効化されたモジュール(シンボリックリンク)
└── snippets/           # 再利用可能な設定スニペットを格納            # Nginxの実行中プロセスIDを格納
                                # システムがNginxプロセスを管理するのに使用

OSにインストールしたときに下記のようにディレクトリが追加される。(Linuxの場合)

/
├── etc/
│   └── nginx/           # nginxの設定ファイルディレクトリ
│       ├── nginx.conf   # メイン設定ファイル
│       ├── conf.d/      # 追加の設定ファイル
│       └── sites-available/  # 利用可能なサイト設定
├── var/
│   ├── log/
│   │   └── nginx/       # nginxのログファイルディレクトリ
│   │       ├── access.log
│   │       └── error.log
│   └── www/
│       └── html/        # デフォルトのWebコンテンツディレクトリ
├── usr/
│   ├── sbin/
│   │   └── nginx        # nginxの実行ファイル
│   └── share/
│       └── nginx/       # 共有データファイル(デフォルトのhtml等)
└── run/
    └── nginx.pid        # 実行中のnginxプロセスIDファイル

サーバーブロックとは

サーバーブロックは、nginxの設定の基本単位となるブロックです。Webサイトやアプリケーションの振る舞いを定義します。上記の*.confの中に記述します。
複数のサーバーブロックを設定することで、1台のサーバーで複数のWebサイトを運用することも可能です(これをバーチャルホストと呼びます)。

基本的な設定例

最もシンプルなサーバーブロックの例を見てみましょう:

server {
   listen 80;                  # 待ち受けるポート
   server_name example.com;    # ドメイン名

   root /var/www/html;        # ドキュメントルート
   index index.html;          # デフォルトファイル

   # URLパスごとの設定
   location / {
       try_files $uri $uri/ =404;
   }
}

HTTPSの設定例

SSL/TLSを使用したHTTPS通信の設定例です:

nginxCopyserver {
    listen 443 ssl;               # HTTPSポート
    server_name example.com;

    # BASIC認証
    auth_basic "Restricted Access";
    auth_basic_user_file "/home/somoething/.htpasswd";

    # SSL証明書の設定
    ssl_certificate     /etc/nginx/ssl/cert.pem;     # 証明書
    ssl_certificate_key /etc/nginx/ssl/private.key;  # 秘密鍵

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

プロキシ設定の例

バックエンドのアプリケーションサーバーへリクエストを転送する設定例です:

nginxCopyserver {
    listen 80;
    server_name example.com;

    # バックエンドへ転送
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

バーチャルホストの設定例

1台のサーバーで複数のWebサイトを運用する設定例です:

nginxCopy# メインサイト用の設定
server {
    listen 80;
    server_name example.com;
    root /var/www/main;
}
# サブドメイン用の設定
server {
    listen 80;
    server_name blog.example.com;
    root /var/www/blog;
}

よく使う設定オプション

基本設定

listen: ポート指定
server_name: ドメイン名
root: ドキュメントルート
index: デフォルトファイル

location ディレクティブ

location /: URLパスごとの設定
try_files: ファイル探索順
proxy_pass: プロキシ先指定
return: リダイレクト

ログ設定

nginxCopyserver {
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
}

HTTPからHTTPSへのリダイレクト設定

セキュリティ向上のためによく使用される設定例です:

nginxCopyserver {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

以上です。

テクシア テックブログ

Discussion