コンテンツにスキップ

Nginx

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに[編集]

nginxとは[編集]

nginxは、高性能で軽量なWebサーバーソフトウェアです。2004年にイゴール・シソエフによって開発が始まり、以来、その効率性と柔軟性により世界中で広く採用されています。

nginxの主な特徴:

  • 高いパフォーマンスと低メモリ使用量
  • リバースプロキシ機能
  • ロードバランシング機能
  • 静的ファイルのサービングに優れた効率性
  • 非同期イベント駆動アーキテクチャ

なぜnginxを使うのか[編集]

  1. 高パフォーマンス:多数の同時接続を効率的に処理できます。
  2. 柔軟性:Webサーバー、リバースプロキシ、ロードバランサーとして利用可能です。
  3. 軽量:メモリ消費が少なく、リソースの制約があるシステムでも効果的です。
  4. 設定のしやすさ:シンプルで直感的な設定ファイル構造を持っています。
  5. 豊富な機能:モジュールによる拡張が容易で、多様なニーズに対応できます。

本ハンドブックの目的[編集]

このハンドブックは、nginxの基本から高度な設定まで、実践的な知識を提供することを目的としています。初心者から経験豊富な管理者まで、様々なレベルのユーザーにとって有用な情報を含んでいます。

対象読者[編集]

  • Webサーバー管理者
  • システム管理者
  • DevOpsエンジニア
  • Webアプリケーション開発者
  • nginxに興味を持つ技術者

nginxのインストールと基本設定[編集]

インストール方法[編集]

nginxは様々なオペレーティングシステムにインストールできます。主要なインストール方法を紹介します。

Debian/Ubuntuの場合
sudo apt update
sudo apt install nginx
CentOS/RHELの場合
sudo yum install epel-release
sudo yum install nginx
macOSの場合 (Homebrewを使用)
brew install nginx
ソースからのコンパイル
最新バージョンや特定のモジュールを使用したい場合は、ソースからコンパイルする方法もあります。
wget https://nginx.org/download/nginx-1.22.1.tar.gz
tar zxf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure
make
sudo make install

基本的な設定[編集]

nginxをインストールした後、基本的な設定を行います。

設定ファイルの場所
  • Debian/Ubuntu: /etc/nginx/nginx.conf
  • CentOS/RHEL: /etc/nginx/nginx.conf
  • macOS (Homebrew): /usr/local/etc/nginx/nginx.conf
基本的な設定ファイルの構造
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

nginxの起動と停止[編集]

システムサービスとして管理する場合
  • 起動: sudo systemctl start nginx
  • 停止: sudo systemctl stop nginx
  • 再起動: sudo systemctl restart nginx
  • 設定のリロード: sudo systemctl reload nginx
手動で管理する場合
  • 起動: sudo nginx
  • 停止: sudo nginx -s stop
  • 再起動: sudo nginx -s reload

基本的な動作確認[編集]

  1. nginxを起動します。
  2. ブラウザで http://localhost または http://サーバーのIPアドレス にアクセスします。
  3. "Welcome to nginx!" というページが表示されれば、正常に動作しています。

トラブルシューティング[編集]

  • ログファイルの確認: /var/log/nginx/error.log
  • 設定ファイルの構文チェック: nginx -t
  • ポートの使用状況確認: netstat -tulpn | grep :80

この章では、nginxのインストールと基本的な設定方法を説明しました。次の章では、設定ファイルの詳細な構造について深く掘り下げます。

基本的な設定ファイルの構造[編集]

nginxの設定ファイルは階層的な構造を持ち、ディレクティブとコンテキストで構成されています。この章では、設定ファイルの基本構造と主要な要素について説明します。

設定ファイルの基本構造[編集]

nginxの主要な設定ファイルは通常 nginx.conf という名前で、以下のような構造を持ちます:

# メインコンテキスト
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

# イベントコンテキスト
events {
    worker_connections 1024;
}

# HTTPコンテキスト
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # ログフォーマット
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

    # サーバーブロック
    server {
        listen 80;
        server_name example.com;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }

        # エラーページ
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }

    # 他の設定ファイルのインクルード
    include /etc/nginx/conf.d/*.conf;
}

主要なディレクティブとコンテキスト[編集]

メインコンテキスト
  • user: nginxプロセスが実行されるユーザーを指定します。
  • worker_processes: ワーカープロセスの数を設定します。
  • error_log: エラーログの場所とレベルを指定します。
  • pid: nginxのプロセスIDを保存するファイルを指定します。
イベントコンテキスト
  • worker_connections: 一つのワーカープロセスが同時に処理できる接続数を設定します。
HTTPコンテキスト
  • include: 他の設定ファイルをインクルードします。
  • default_type: デフォルトのMIMEタイプを設定します。
  • log_format: ログのフォーマットを定義します。
  • access_log: アクセスログの場所とフォーマットを指定します。
  • sendfile: ファイル送信の最適化を有効にします。
  • keepalive_timeout: キープアライブ接続のタイムアウトを設定します。
サーバーブロック
  • listen: サーバーがリッスンするポートを指定します。
  • server_name: サーバーのドメイン名を設定します。
  • location: 特定のURLパスに対する設定を行います。
  • root: ドキュメントルートを指定します。
  • index: インデックスファイルを指定します。
  • error_page: エラーページを設定します。

設定ファイルの分割と管理[編集]

大規模な設定を管理しやすくするために、設定を複数のファイルに分割することができます:

  • /etc/nginx/nginx.conf: メインの設定ファイル
  • /etc/nginx/conf.d/: サイト固有の設定ファイルを格納するディレクトリ
  • /etc/nginx/sites-available/: 利用可能なサイト設定
  • /etc/nginx/sites-enabled/: 有効化されたサイト設定(通常は sites-available へのシンボリックリンク)

設定の確認とリロード[編集]

設定を変更した後は、以下のコマンドで構文をチェックし、設定をリロードします:

nginx -t          # 設定ファイルの構文チェック
nginx -s reload   # 設定のリロード

この章では、nginxの設定ファイルの基本構造と主要な要素について説明しました。次の章では、Webサーバーとしてのnginxの具体的な設定方法について詳しく見ていきます。

Webサーバーとしての設定[編集]

この章では、nginxをWebサーバーとして設定する方法について詳しく説明します。

基本的なWebサーバー設定[編集]

以下は、基本的なWebサーバー設定の例です:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}
  • listen: サーバーがリッスンするポートを指定します(通常はHTTP用に80)。
  • server_name: このサーバーブロックが処理するドメイン名を指定します。
  • root: Webサイトのルートディレクトリを指定します。
  • index: インデックスファイルの名前を指定します。
  • location /: ルートURLに対する処理を定義します。

静的ファイルの提供[編集]

静的ファイル(HTML、CSS、JavaScript、画像など)の提供は以下のように設定できます:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

この設定は、指定された拡張子を持つファイルに30日間のキャッシュ期限を設定し、キャッシュ制御ヘッダーを追加します。

PHP処理の設定[編集]

PHPを使用するWebサイトの場合、以下のような設定を行います:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

この設定は、.phpファイルをPHP-FPMに渡して処理させます。

バーチャルホスティング[編集]

複数のWebサイトをホストする場合、バーチャルホスティングを使用します:

server {
    listen 80;
    server_name site1.example.com;
    root /var/www/site1;
    # その他の設定...
}

server {
    listen 80;
    server_name site2.example.com;
    root /var/www/site2;
    # その他の設定...
}

各サーバーブロックは異なるドメインに対応し、それぞれ独立した設定を持ちます。

URLリライティング[編集]

URLの書き換えは以下のように設定できます:

location /old-page {
    rewrite ^/old-page(.*)$ /new-page$1 permanent;
}

この例では、/old-pageで始まるURLを/new-pageにリダイレクトします。

エラーページのカスタマイズ[編集]

カスタムエラーページは以下のように設定できます:

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location = /404.html {
    root /var/www/error_pages;
    internal;
}

location = /50x.html {
    root /var/www/error_pages;
    internal;
}

この設定は、特定のHTTPステータスコードに対してカスタムエラーページを表示します。

アクセス制限[編集]

特定のIPアドレスからのアクセスを制限する例:

location /admin {
    allow 192.168.1.0/24;
    deny all;
}

この設定は、/adminディレクトリへのアクセスを特定のIPアドレス範囲のみに制限します。

gzip圧縮の有効化[編集]

レスポンスの圧縮を有効にして帯域幅を節約します:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

この設定は、指定されたMIMEタイプのレスポンスにgzip圧縮を適用します。

この章では、nginxをWebサーバーとして設定する主要な方法を紹介しました。次の章では、リバースプロキシとしてのnginxの設定方法について説明します。

リバースプロキシとしての設定[編集]

この章では、nginxをリバースプロキシとして設定する方法について説明します。リバースプロキシは、クライアントからのリクエストを受け取り、バックエンドサーバーに転送する役割を果たします。

基本的なリバースプロキシ設定[編集]

以下は、基本的なリバースプロキシ設定の例です:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        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_pass: リクエストを転送するバックエンドサーバーのURLを指定します。
  • proxy_set_header: プロキシヘッダーを設定し、バックエンドサーバーに元のリクエスト情報を渡します。

ロードバランシング[編集]

複数のバックエンドサーバーがある場合、ロードバランシングを設定できます:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

この設定では、リクエストがbackendグループ内のサーバーに分散されます。

SSL終端[編集]

SSL/TLS暗号化をnginxで終端し、バックエンドサーバーへの通信を平文で行う設定:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

キャッシング[編集]

プロキシレスポンスのキャッシングを設定して、パフォーマンスを向上させます:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_cache my_cache;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_cache_valid 200 60m;
        proxy_cache_valid 404 10m;
        proxy_pass http://backend;
    }
}

この設定では、成功したレスポンスを60分間、404エラーを10分間キャッシュします。

バッファリング[編集]

大きなレスポンスのバッファリングを設定して、メモリ使用量を制御します:

location / {
    proxy_pass http://backend;
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 100 8k;
}

タイムアウト設定[編集]

プロキシ接続のタイムアウトを設定します:

location / {
    proxy_pass http://backend;
    proxy_connect_timeout 5s;
    proxy_send_timeout 10s;
    proxy_read_timeout 10s;
}

WebSocketのサポート[編集]

WebSocketプロトコルをサポートするための設定:

location /wsapp/ {
    proxy_pass http://websocket_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

URLリライティングとリダイレクト[編集]

バックエンドサーバーへのリクエストをリライトする例:

location /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://api_backend;
}

この設定は、/api/で始まるリクエストのパスを変更してからバックエンドに転送します。

この章では、nginxをリバースプロキシとして設定する主要な方法を紹介しました。リバースプロキシ機能を使用することで、セキュリティの向上、負荷分散、SSL終端など、多くの利点を得ることができます。

ロードバランサーとしての設定[編集]

この章では、nginxをロードバランサーとして設定する方法について詳しく説明します。ロードバランサーは、トラフィックを複数のサーバーに分散させることで、システムの可用性と性能を向上させます。

基本的なロードバランシング設定[編集]

以下は、基本的なラウンドロビン方式のロードバランシング設定です:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
        }
    }
}

この設定では、リクエストがbackendグループ内のサーバーに順番に分散されます。

重み付けロードバランシング[編集]

サーバーの処理能力に応じて重みを設定できます:

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com weight=1;
}

この設定では、backend1が最も多くのリクエストを受け取り、backend3が最も少なくなります。

IPハッシュによるロードバランシング[編集]

クライアントIPに基づいてサーバーを選択する方法:

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

この方法は、同じクライアントからのリクエストを常に同じサーバーに転送するため、セッション維持に有効です。

最小接続数によるロードバランシング[編集]

現在のアクティブ接続数が最も少ないサーバーにリクエストを転送します:

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

ヘルスチェック[編集]

バックエンドサーバーの健全性をチェックし、障害のあるサーバーを自動的に除外します:

upstream backend {
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;
    server backend3.example.com max_fails=3 fail_timeout=30s;
}

この設定では、30秒以内に3回の失敗が発生したサーバーは、30秒間トラフィックから除外されます。

スティッキーセッション[編集]

特定のセッションを同じサーバーに固定する設定:

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-NginX-Proxy true;
        proxy_cookie_path / "/; HttpOnly; Secure";
    }
}

この設定では、ip_hashディレクティブを使用してセッションの固定を実現しています。

バックエンドサーバーの動的な追加と削除[編集]

動的にバックエンドサーバーを追加・削除するには、nginxのコマーシャル版(NGINX Plus)が必要ですが、以下のような設定が可能です:

upstream backend {
    zone upstream_dynamic 64k;
    server backend1.example.com;
    server backend2.example.com;
}

この設定により、APIを通じてバックエンドサーバーを動的に管理できます。

SSL/TLSの終端[編集]

ロードバランサーでSSL/TLSを終端し、バックエンドへの通信を暗号化しない設定:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate.key;

    location / {
        proxy_pass http://backend;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

この章では、nginxをロードバランサーとして設定する主要な方法を紹介しました。適切なロードバランシング戦略を選択することで、システムの可用性、性能、拡張性を大幅に向上させることができます。

HTTPSとSSL/TLS設定[編集]

この章では、nginxでHTTPSを有効にし、SSL/TLSを適切に設定する方法について説明します。

SSL/TLS証明書の取得[編集]

まず、SSL/TLS証明書が必要です。無料で利用できるLet's Encryptを使用する例を示します:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

これにより、証明書が自動的に取得され、nginxの設定にも適用されます。

基本的なHTTPS設定[編集]

手動で設定する場合、以下のような基本的なHTTPS設定を行います:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # その他の設定...
}

HTTPからHTTPSへのリダイレクト[編集]

HTTPリクエストを自動的にHTTPSにリダイレクトする設定:

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

SSL/TLSプロトコルとサイファースイートの設定[編集]

セキュリティを強化するために、使用するプロトコルとサイファースイートを制限します:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

DHパラメータの設定[編集]

Diffie-Hellmanキー交換のためのパラメータを設定します:

openssl dhparam -out /etc/nginx/dhparam.pem 2048

そして、nginxの設定に追加します:

ssl_dhparam /etc/nginx/dhparam.pem;

HSTS(HTTP Strict Transport Security)の有効化[編集]

ブラウザに対して、常にHTTPSを使用するよう指示します:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

OCSP Stapling[編集]

OCSP(Online Certificate Status Protocol)Staplingを有効にして、証明書の有効性確認を効率化します:

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

セッションの再利用[編集]

SSL/TLSハンドシェイクのオーバーヘッドを削減するために、セッションの再利用を設定します:

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

証明書の自動更新[編集]

Let's Encryptの証明書は90日ごとに更新が必要です。自動更新を設定するには:

sudo crontab -e

そして、以下の行を追加します:

</syntaxhighlight> 0 12 1 * * /usr/bin/certbot renew --quiet </syntaxhighlight>

これにより、毎月1日の12時に証明書の更新チェックが行われます。

TLS 1.3の有効化[編集]

最新のTLS 1.3を有効にするには:

ssl_protocols TLSv1.2 TLSv1.3;

TLS 1.3は、より高速で安全な接続を提供します。

この章では、nginxでHTTPSとSSL/TLSを適切に設定する方法について説明しました。これらの設定を適用することで、Webサイトのセキュリティを大幅に向上させることができます。

パフォーマンスチューニング[編集]

この章では、nginxのパフォーマンスを最適化するための様々な設定と技術について説明します。

ワーカープロセスの最適化[編集]

ワーカープロセスの数を適切に設定することで、CPU利用率を最適化できます:

worker_processes auto;

autoを指定すると、利用可能なCPUコア数に基づいて自動的に設定されます。

ワーカー接続数の調整[編集]

各ワーカープロセスが同時に処理できる接続数を設定します:

events {
    worker_connections 1024;
    use epoll;
}

epollは、Linuxシステムで高効率なイベント処理方式です。

キープアライブ接続の最適化[編集]

クライアントとの接続を維持することで、新しい接続のオーバーヘッドを削減します:

http {
    keepalive_timeout 65;
    keepalive_requests 100;
}

静的ファイルのキャッシング[編集]

ブラウザ側でのキャッシュを有効にして、サーバーの負荷を軽減します:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

Gzip圧縮の有効化[編集]

レスポンスを圧縮することで、ネットワーク帯域幅を節約します:

gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
  application/atom+xml
  application/javascript
  application/json
  application/rss+xml
  application/vnd.ms-fontobject
  application/x-font-ttf
  application/x-web-app-manifest+json
  application/xhtml+xml
  application/xml
  font/opentype
  image/svg+xml
  image/x-icon
  text/css
  text/plain
  text/x-component;

オープンファイルキャッシュの設定[編集]

頻繁にアクセスされるファイルのディスクトリを最適化します:

open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

バッファサイズの最適化[編集]

クライアントリクエストとレスポンスのバッファサイズを調整します:

client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;

タイムアウト設定の最適化[編集]

様々なタイムアウト設定を調整して、リソースの効率的な利用を図ります:

client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;

マイクロキャッシング[編集]

短時間のキャッシュを設定して、同時に多数のリクエストがある場合のパフォーマンスを向上させます:

proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;

server {
    set $no_cache 0;
    
    if ($request_method = POST) {
        set $no_cache 1;
    }
    if ($query_string != "") {
        set $no_cache 1;
    }
    
    location / {
        proxy_cache cache;
        proxy_cache_valid 200 1s;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_cache_bypass $no_cache;
        proxy_no_cache $no_cache;
    }
}

ログの最適化[編集]

ログ記録を最適化して、ディスクI/Oを削減します:

access_log off;
error_log /var/log/nginx/error.log crit;

sendfileの使用[編集]

カーネル空間でのファイル転送を有効にして、効率を向上させます:

sendfile on;
tcp_nopush on;
tcp_nodelay on;

この章では、nginxのパフォーマンスを最適化するための主要な設定と技術について説明しました。これらの設定を適切に組み合わせることで、nginxの処理能力と効率を大幅に向上させることができます。

セキュリティ設定[編集]

この章では、nginxのセキュリティを強化するための重要な設定と best practices について説明します。

サーバー情報の隠蔽[編集]

nginxのバージョン情報を隠すことで、潜在的な攻撃者に情報を与えないようにします:

server_tokens off;

クリックジャッキング対策[編集]

X-Frame-Optionsヘッダーを設定して、クリックジャッキング攻撃を防ぎます:

add_header X-Frame-Options "SAMEORIGIN" always;

XSS保護の有効化[編集]

ブラウザの組み込みXSS保護を有効にします:

add_header X-XSS-Protection "1; mode=block" always;

コンテンツタイプスニッフィングの防止[編集]

ブラウザによるMIMEタイプの推測を防止します:

add_header X-Content-Type-Options "nosniff" always;

リファラポリシーの設定[編集]

リファラ情報の送信を制御します:

add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Content Security Policy (CSP) の設定[編集]

XSSやデータインジェクション攻撃を防ぐためのCSPを設定します:

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; form-action 'self'; frame-ancestors 'self'; base-uri 'self';" always;

SSL/TLSの強化(再掲)[編集]

前章で説明したSSL/TLS設定を再確認し、適用します:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

バッファオーバーフロー攻撃の防止[編集]

クライアントリクエストのサイズを制限します:

client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

シンボリックリンク利用の制限[編集]

ファイルシステムの安全性を高めます:

disable_symlinks on;

不要なHTTPメソッドの制限[編集]

必要なHTTPメソッドのみを許可します:

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
}

ディレクトリリスティングの無効化[編集]

ディレクトリの内容が表示されないようにします:

autoindex off;

バックエンドサーバーの保護[編集]

プロキシ設定でバックエンドサーバーの情報を隠します:

proxy_hide_header X-Powered-By;
proxy_hide_header Server;

rate limitingの設定[編集]

DoS攻撃を緩和するためにリクエスト数を制限します:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
    ...
    location / {
        limit_req zone=one burst=5;
    }
}

モジュールの制限[編集]

必要なモジュールのみを有効にします。コンパイル時に --without-<module-name> オプションを使用して不要なモジュールを除外します。

定期的なセキュリティアップデート[編集]

nginxを最新バージョンに保ち、セキュリティパッチを適用します:

sudo apt update
sudo apt upgrade nginx

この章では、nginxのセキュリティを強化するための主要な設定と best practices について説明しました。これらの設定を適切に実装することで、Webサーバーのセキュリティを大幅に向上させることができます。

ログとモニタリング[編集]

この章では、nginxのログ設定とモニタリングについて説明します。適切なログ設定とモニタリングは、サーバーの健全性維持、問題の早期発見、パフォーマンス最適化に不可欠です。

アクセスログの設定[編集]

基本的なアクセスログの設定:

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
}

エラーログの設定[編集]

エラーログの設定:

error_log /var/log/nginx/error.log warn;

ログレベルは debug, info, notice, warn, error, crit, alert, emerg から選択できます。

条件付きログ[編集]

特定の条件下でのみログを記録:

map $status $loggable {
    ~^[23]  0;
    default 1;
}

access_log /var/log/nginx/access.log main if=$loggable;

この例では、ステータスコードが200番台と300番台の場合はログを記録しません。

ログのローテーション[編集]

logrotateを使用してログのローテーションを設定:

</syntaxhighlight> /var/log/nginx/*.log {

   daily
   missingok
   rotate 52
   compress
   delaycompress
   notifempty
   create 0640 nginx adm
   sharedscripts
   postrotate
       if [ -f /var/run/nginx.pid ]; then
           kill -USR1 cat /var/run/nginx.pid
       fi
   endscript

} </syntaxhighlight>

リアルタイムモニタリング[編集]

ngxtopを使用してリアルタイムのトラフィック監視:

sudo apt install python-pip
sudo pip install ngxtop
ngxtop

ステータスモジュールの有効化[編集]

nginxのステータス情報を取得するためのモジュールを有効化:

location /nginx_status {
    stub_status on;
    allow 127.0.0.1;
    deny all;
}

プロメテウスとGrafanaの統合[編集]

プロメテウスとGrafanaを使用して高度なモニタリングを設定:

  1. nginx-prometheus-exporterをインストール
  2. プロメテウスの設定:
scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']
  1. Grafanaでnginxダッシュボードを作成

ELKスタックの利用[編集]

Elasticsearch, Logstash, Kibanaを使用してログ分析を行う:

  1. Filebeat設定:
filebeat.inputs:
* type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
output.elasticsearch:
  hosts: ["localhost:9200"]
  1. Kibanaでログの視覚化

カスタムログフォーマット[編集]

特定の情報を含むカスタムログフォーマットの作成:

log_format detailed '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '$request_time $upstream_response_time';

サードパーティモニタリングツールの統合[編集]

New Relic, Datadog, Zabbixなどのサードパーティツールとの統合も検討してください。

セキュリティログの強化[編集]

セキュリティ関連のイベントを詳細にログに記録:

log_format security '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '"$http_x_forwarded_for" "$request_body"';

access_log /var/log/nginx/security.log security if=$loggable;

ログの分析[編集]

ログ分析ツール(例:GoAccess)を使用して定期的にログを分析し、トレンドや異常を検出します:

goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html

この章では、nginxのログ設定とモニタリングについて説明しました。適切なログ管理とモニタリングは、サーバーの運用、トラブルシューティング、パフォーマンス最適化において非常に重要です。

トラブルシューティング[編集]

この章では、nginxで発生する可能性のある一般的な問題とその解決方法について説明します。

設定ファイルのテスト[編集]

設定変更後は必ず構文チェックを行います:

nginx -t

エラーがある場合は、詳細な情報が表示されます。

エラーログの確認[編集]

問題が発生した場合、まずエラーログを確認します:

tail -f /var/log/nginx/error.log

接続の問題[編集]

接続できない場合の確認事項:

  1. nginxプロセスが動作しているか確認:
   ps aux | grep nginx
  1. ポートが正しくリッスンしているか確認:
   netstat -tuln | grep :80
  1. ファイアウォールの設定を確認:
   sudo ufw status

502 Bad Gateway エラー[編集]

バックエンドサーバーとの通信に問題がある場合に発生します:

  1. バックエンドサーバーの状態を確認
  2. upstream設定を確認
  3. バックエンドサーバーのログを確認

403 Forbidden エラー[編集]

ファイルのパーミッションやSELinuxの設定が原因の可能性があります:

  1. ファイルのパーミッションを確認:
   ls -l /path/to/your/files
  1. nginxプロセスのユーザー権限を確認
  2. SELinuxの設定を確認(有効な場合)

404 Not Found エラー[編集]

ファイルが見つからない場合に発生します:

  1. ファイルの存在を確認
  2. root ディレクティブの設定を確認
  3. location ブロックの設定を確認

性能の問題[編集]

  1. slow_logを有効にして遅いリクエストを特定:
   http {
       log_format  slow  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" $request_time';

       access_log /var/log/nginx/slow.log slow if=$request_time > 3;
   }
  1. worker_processesとworker_connectionsの設定を確認
  2. キープアライブ設定を確認
  3. 静的ファイルのキャッシュを確認

SSL/TLS の問題[編集]

  1. 証明書の有効期限を確認:
   openssl x509 -in /path/to/certificate.crt -text -noout
  1. 証明書チェーンが正しいか確認
  2. サポートされているプロトコルとサイファーを確認

リダイレクトループ[編集]

リダイレクト設定が無限ループを引き起こしている可能性があります:

  1. リダイレクト設定を確認
  2. サーバーブロックの設定を確認

メモリ使用量の問題[編集]

  1. 現在のメモリ使用量を確認:
   ps aux | grep nginx
  1. worker_processesの数を調整
  2. キャッシュ設定を確認

ディスク容量の問題[編集]

  1. ログファイルのサイズと数を確認
  2. ログローテーションの設定を確認
  3. 不要なファイルを削除

設定の再読み込み失敗[編集]

  1. 設定ファイルの構文エラーを確認
  2. プロセスのパーミッションを確認
  3. シグナルが正しく送信されているか確認

上流サーバーとの通信問題[編集]

  1. upstream サーバーの状態を確認
  2. ネットワーク接続を確認
  3. ファイアウォール設定を確認

デバッグモードの使用[編集]

より詳細な情報を得るためにデバッグモードを使用:

error_log /var/log/nginx/error.log debug;

注意:本番環境では大量のログが生成されるため、短時間の使用にとどめてください。

この章では、nginxで発生する可能性のある一般的な問題とその解決方法について説明しました。効果的なトラブルシューティングには、システムの動作を理解し、適切なツールと手法を使用することが重要です。

高度な設定とモジュール[編集]

この章では、nginxの高度な設定オプションと有用なモジュールについて説明します。

動的モジュール[編集]

nginxバージョン1.9.11以降では、動的モジュールをサポートしています。これにより、再コンパイルすることなくモジュールを追加できます。

動的モジュールを有効にする例:

load_module modules/ngx_http_geoip_module.so;

Lua モジュール (OpenResty)[編集]

OpenRestyを使用することで、Luaスクリプトを直接nginxで実行できます。

インストール:

sudo apt-get install openresty

Luaスクリプトの例:

location /lua_content {
    content_by_lua_block {
        ngx.say("Hello, Lua!")
    }
}

PageSpeed モジュール[編集]

Googleが開発したPageSpeedモジュールを使用して、Webページの最適化を自動化できます。

インストールと基本設定:

sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip
wget https://github.com/apache/incubator-pagespeed-ngx/archive/latest-stable.zip
unzip latest-stable.zip
cd incubator-pagespeed-ngx-latest-stable
./configure --add-module=../incubator-pagespeed-ngx-latest-stable
make
sudo make install

設定例:

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

HTTP/2 プッシュ[編集]

HTTP/2のサーバープッシュ機能を使用して、クライアントからのリクエストを待たずにリソースを送信できます。

location / {
    http2_push /style.css;
    http2_push /script.js;
}

WebSocket プロキシ[編集]

WebSocketプロトコルのプロキシ設定:

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

GeoIP モジュール[編集]

訪問者の地理的位置に基づいてコンテンツをカスタマイズできます。

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    
    server {
        location / {
            if ($geoip_country_code = JP) {
                rewrite ^ /jp$uri last;
            }
        }
    }
}

RTMP モジュール[編集]

ビデオストリーミングのためのRTMP(Real-Time Messaging Protocol)サポート:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
        }
    }
}

Auth Request モジュール[編集]

外部サービスを使用した認証:

location /private/ {
    auth_request /auth;
    auth_request_set $auth_status $upstream_status;
}

location = /auth {
    internal;
    proxy_pass http://auth_server;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

SSL証明書の自動更新(Certbot)[編集]

Let's Encryptを使用してSSL証明書を自動更新:

sudo certbot --nginx -d example.com -d www.example.com

crontabに自動更新ジョブを追加:

0 12 1 * * /usr/bin/certbot renew --quiet

キャッシュパージ[編集]

特定のURLのキャッシュをクリアするモジュール:

location ~ /purge(/.*) {
    allow 127.0.0.1;
    deny all;
    proxy_cache_purge cache_zone $host$1$is_args$args;
}

ヘッダーの変更と追加[編集]

レスポンスヘッダーを変更または追加:

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

リバースプロキシのキャッシュ[編集]

上流サーバーのレスポンスをキャッシュ:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    }
}

この章では、nginxの高度な設定オプションと有用なモジュールについて説明しました。これらの機能を適切に活用することで、より柔軟で強力なWebサーバー環境を構築できます。

外部リンク[編集]

Wikipedia
Wikipedia
ウィキペディアNginxの記事があります。