Nginx
はじめに
編集nginxとは
編集nginxは、高性能で軽量なWebサーバーソフトウェアです。2004年にイゴール・シソエフによって開発が始まり、以来、その効率性と柔軟性により世界中で広く採用されています。
nginxの主な特徴:
- 高いパフォーマンスと低メモリ使用量
- リバースプロキシ機能
- ロードバランシング機能
- 静的ファイルのサービングに優れた効率性
- 非同期イベント駆動アーキテクチャ
なぜnginxを使うのか
編集- 高パフォーマンス:多数の同時接続を効率的に処理できます。
- 柔軟性:Webサーバー、リバースプロキシ、ロードバランサーとして利用可能です。
- 軽量:メモリ消費が少なく、リソースの制約があるシステムでも効果的です。
- 設定のしやすさ:シンプルで直感的な設定ファイル構造を持っています。
- 豊富な機能:モジュールによる拡張が容易で、多様なニーズに対応できます。
本ハンドブックの目的
編集このハンドブックは、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
- Debian/Ubuntu:
- 基本的な設定ファイルの構造
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
基本的な動作確認
編集- nginxを起動します。
- ブラウザで
http://localhost
またはhttp://サーバーのIPアドレス
にアクセスします。 - "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を使用して高度なモニタリングを設定:
- nginx-prometheus-exporterをインストール
- プロメテウスの設定:
scrape_configs: - job_name: 'nginx' static_configs: - targets: ['localhost:9113']
- Grafanaでnginxダッシュボードを作成
ELKスタックの利用
編集Elasticsearch, Logstash, Kibanaを使用してログ分析を行う:
- Filebeat設定:
filebeat.inputs: * type: log enabled: true paths: - /var/log/nginx/access.log output.elasticsearch: hosts: ["localhost:9200"]
- 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
接続の問題
編集接続できない場合の確認事項:
- nginxプロセスが動作しているか確認:
ps aux | grep nginx
- ポートが正しくリッスンしているか確認:
netstat -tuln | grep :80
- ファイアウォールの設定を確認:
sudo ufw status
502 Bad Gateway エラー
編集バックエンドサーバーとの通信に問題がある場合に発生します:
- バックエンドサーバーの状態を確認
- upstream設定を確認
- バックエンドサーバーのログを確認
403 Forbidden エラー
編集ファイルのパーミッションやSELinuxの設定が原因の可能性があります:
- ファイルのパーミッションを確認:
ls -l /path/to/your/files
- nginxプロセスのユーザー権限を確認
- SELinuxの設定を確認(有効な場合)
404 Not Found エラー
編集ファイルが見つからない場合に発生します:
- ファイルの存在を確認
- root ディレクティブの設定を確認
- location ブロックの設定を確認
性能の問題
編集- 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; }
- worker_processesとworker_connectionsの設定を確認
- キープアライブ設定を確認
- 静的ファイルのキャッシュを確認
SSL/TLS の問題
編集- 証明書の有効期限を確認:
openssl x509 -in /path/to/certificate.crt -text -noout
- 証明書チェーンが正しいか確認
- サポートされているプロトコルとサイファーを確認
リダイレクトループ
編集リダイレクト設定が無限ループを引き起こしている可能性があります:
- リダイレクト設定を確認
- サーバーブロックの設定を確認
メモリ使用量の問題
編集- 現在のメモリ使用量を確認:
ps aux | grep nginx
- worker_processesの数を調整
- キャッシュ設定を確認
ディスク容量の問題
編集- ログファイルのサイズと数を確認
- ログローテーションの設定を確認
- 不要なファイルを削除
設定の再読み込み失敗
編集- 設定ファイルの構文エラーを確認
- プロセスのパーミッションを確認
- シグナルが正しく送信されているか確認
上流サーバーとの通信問題
編集- upstream サーバーの状態を確認
- ネットワーク接続を確認
- ファイアウォール設定を確認
デバッグモードの使用
編集より詳細な情報を得るためにデバッグモードを使用:
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サーバー環境を構築できます。