Nginxは高性能なWebサーバーとして人気ですが、設定ファイルの書き方が独特で、最初は戸惑うことが多いですよね。
「どこに何を書けばいいの?」「このディレクティブはどういう意味?」「間違えたらサーバーが止まる?」といった不安もあるでしょう。
この記事では、Nginxの設定ファイル(nginx.conf)の基本構造から、実践的な設定例、よく使うディレクティブ、トラブルシューティングまで、初心者の方にも分かりやすく徹底解説します。
Nginx設定ファイルの基礎知識
nginx.confとは?
nginx.conf(エンジンエックス・ドット・コンフ)
- Nginxのメイン設定ファイル
- Webサーバーの動作を制御する
- テキストファイルなので、エディタで編集可能
役割
- バーチャルホストの設定
- リバースプロキシの設定
- SSL/TLS証明書の設定
- アクセス制御
- ログの設定
設定ファイルの場所
環境によって場所が異なります。
Linux(Ubuntu/Debian)
/etc/nginx/nginx.conf
Linux(CentOS/RHEL)
/etc/nginx/nginx.conf
Mac(Homebrewでインストール)
/opt/homebrew/etc/nginx/nginx.conf
/usr/local/etc/nginx/nginx.conf
Windows
C:\nginx\conf\nginx.conf
確認コマンド
nginx -t
このコマンドで、設定ファイルの場所とエラーの有無が確認できます。
設定ファイルの構造
Nginxの設定は、階層構造(ブロック構造)になっています。
基本的な構造
# グローバル設定(最上位)
user nginx;
worker_processes auto;
# イベントブロック
events {
worker_connections 1024;
}
# HTTPブロック
http {
# HTTPの設定
# サーバーブロック
server {
# バーチャルホストの設定
# ロケーションブロック
location / {
# 特定のURLパスに対する設定
}
}
}
ブロックの階層
グローバル
├── events
└── http
├── upstream
├── server
│ └── location
└── server
└── location
設定ファイルの基本的な書き方
文法のルール
1. ディレクティブの書き方
ディレクティブ名 値;
必ずセミコロン(;)で終わります。
例
listen 80;
server_name example.com;
root /var/www/html;
2. ブロックの書き方
ディレクティブ名 {
# ブロック内の設定
}
中括弧({})で囲みます。
3. コメントの書き方
# これはコメント
# シャープ記号で始まる行はコメント扱い
4. インデント
必須ではありませんが、可読性のため推奨されます。
# 良い例(見やすい)
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
}
# 悪い例(見づらい)
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
}
includeディレクティブ
設定を複数のファイルに分割できます。
http {
# 外部ファイルを読み込む
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
メリット
- 設定が整理しやすい
- サイトごとに設定ファイルを分けられる
- 再利用しやすい
よく使うディレクティブ解説
実務でよく使う設定項目を解説します。
グローバル設定
user
Nginxを実行するユーザーを指定します。
user nginx;
# または
user www-data;
worker_processes
ワーカープロセスの数です。
# CPUコア数に合わせる
worker_processes auto;
# 手動で指定
worker_processes 4;
推奨値: auto
(自動でCPUコア数に合わせる)
error_log
エラーログの出力先です。
error_log /var/log/nginx/error.log warn;
ログレベル:
debug
:デバッグ情報info
:情報メッセージnotice
:通知warn
:警告(推奨)error
:エラーcrit
:重大なエラー
pid
プロセスIDファイルの場所です。
pid /var/run/nginx.pid;
eventsブロック
worker_connections
1つのワーカーが処理できる最大接続数です。
events {
worker_connections 1024;
}
推奨値
- 小規模:512〜1024
- 中規模:2048〜4096
- 大規模:8192以上
httpブロック
include mime.types
ファイルタイプとMIMEタイプの対応表です。
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
}
access_log
アクセスログの設定です。
access_log /var/log/nginx/access.log;
# ログを無効化(パフォーマンス重視)
access_log off;
sendfile
ファイル送信の最適化です。
sendfile on;
推奨: 基本的にon
tcp_nopush
sendfileと組み合わせて使います。
tcp_nopush on;
推奨: sendfile on
の場合はon
keepalive_timeout
接続を保持する時間(秒)です。
keepalive_timeout 65;
推奨値: 30〜75秒
gzip
レスポンスの圧縮です。
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
転送量が減り、表示速度が向上します。
serverブロックの設定
バーチャルホスト(Webサイト)ごとの設定です。
基本的なserverブロック
server {
# ポート番号
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;
}
よく使うserverディレクティブ
listen
待ち受けるポート番号です。
# HTTP(ポート80)
listen 80;
# HTTPS(ポート443)
listen 443 ssl;
# IPv6対応
listen [::]:80;
# 特定のIPアドレス
listen 192.168.1.100:80;
server_name
このserverブロックが応答するドメイン名です。
# 単一ドメイン
server_name example.com;
# 複数ドメイン
server_name example.com www.example.com;
# ワイルドカード
server_name *.example.com;
# 正規表現
server_name ~^(?<subdomain>.+)\.example\.com$;
# デフォルトサーバー
server_name _;
root
Webサイトのファイルがある場所です。
root /var/www/html;
index
ディレクトリアクセス時に表示するファイルです。
index index.html index.htm index.php;
左から順に探します。
locationブロックの設定
特定のURLパスに対する設定です。
locationの基本
server {
# ルートパス
location / {
root /var/www/html;
index index.html;
}
# 特定のパス
location /images/ {
root /var/www;
}
# 拡張子で指定
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
}
locationの優先順位
マッチングには優先順位があります。
1. 完全一致(=)- 最優先
location = / {
# http://example.com/ にのみマッチ
}
2. 前方一致(^~)- 正規表現より優先
location ^~ /images/ {
# /images/ で始まるすべてのURLにマッチ
# 正規表現はチェックされない
}
3. 正規表現(~、~*)
# 大文字小文字を区別
location ~ \.php$ {
# .phpで終わるURLにマッチ
}
# 大文字小文字を区別しない
location ~* \.(jpg|jpeg|png|gif)$ {
# 画像ファイルにマッチ
}
4. 前方一致(プレフィックス)
location /admin/ {
# /admin/ で始まるURLにマッチ
}
実用的なlocation例
静的ファイルの配信
location /static/ {
root /var/www;
expires 30d;
add_header Cache-Control "public, immutable";
}
PHPファイルの処理
location ~ \.php$ {
root /var/www/html;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
APIエンドポイント
location /api/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
リバースプロキシの設定
バックエンドサーバーへリクエストを転送する設定です。
基本的なリバースプロキシ
server {
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
よく使うproxy_設定
proxy_pass
転送先のサーバーです。
# HTTPで転送
proxy_pass http://localhost:3000;
# HTTPSで転送
proxy_pass https://backend.example.com;
# UNIXソケット
proxy_pass http://unix:/tmp/backend.sock;
proxy_set_header
バックエンドに送るヘッダーを設定します。
# ホスト名
proxy_set_header Host $host;
# クライアントの実IPアドレス
proxy_set_header X-Real-IP $remote_addr;
# プロキシチェーン
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# プロトコル(http/https)
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect
リダイレクトURLを書き換えます。
proxy_redirect off;
# または
proxy_redirect http://localhost:3000/ http://example.com/;
upstreamブロック(ロードバランサー)
複数のバックエンドサーバーに負荷分散します。
upstream backend {
# ラウンドロビン(デフォルト)
server 192.168.1.101:3000;
server 192.168.1.102:3000;
server 192.168.1.103:3000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
負荷分散の方式
upstream backend {
# 重み付け
server 192.168.1.101:3000 weight=3;
server 192.168.1.102:3000 weight=1;
# IPハッシュ(同じクライアントは同じサーバーへ)
ip_hash;
# 最小接続数
least_conn;
}
SSL/TLSの設定
HTTPS対応の設定方法です。
基本的なSSL設定
server {
listen 443 ssl;
server_name example.com;
# 証明書のパス
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSLプロトコル
ssl_protocols TLSv1.2 TLSv1.3;
# 暗号化方式
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# セッションキャッシュ
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
root /var/www/html;
index index.html;
}
}
# HTTPからHTTPSへリダイレクト
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Let’s Encrypt(無料SSL証明書)
server {
listen 80;
server_name example.com;
# Let's Encrypt認証用
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# その他はHTTPSへリダイレクト
location / {
return 301 https://$server_name$request_uri;
}
}
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;
location / {
root /var/www/html;
}
}
実践的な設定例
よくある構成の完全な設定例です。
WordPress用の設定
server {
listen 80;
server_name example.com www.example.com;
root /var/www/wordpress;
index index.php;
# アクセスログ
access_log /var/log/nginx/wordpress.access.log;
error_log /var/log/nginx/wordpress.error.log;
# 静的ファイルのキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# メインロケーション
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHPファイルの処理
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# セキュリティ:隠しファイルへのアクセス拒否
location ~ /\. {
deny all;
}
# wp-config.phpへのアクセス拒否
location = /wp-config.php {
deny all;
}
}
Node.js(Express)用の設定
upstream nodejs {
server localhost:3000;
keepalive 64;
}
server {
listen 80;
server_name example.com;
# 静的ファイル
location /static/ {
alias /var/www/app/public/;
expires 30d;
}
# Node.jsアプリケーション
location / {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
複数サイトの運用
# サイト1
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# サイト2
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# デフォルト(どのドメインにもマッチしない場合)
server {
listen 80 default_server;
server_name _;
return 444; # 接続を切断
}
設定の確認と反映
設定ファイルのテスト
編集後、必ず構文チェックを行います。
# 構文チェック
sudo nginx -t
成功時の出力
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
エラー時の出力
nginx: [emerg] unexpected "}" in /etc/nginx/nginx.conf:25
nginx: configuration file /etc/nginx/nginx.conf test failed
エラー箇所と行番号が表示されるので、修正します。
設定の反映
リロード(推奨)
ダウンタイムなしで設定を反映します。
sudo nginx -s reload
# または
sudo systemctl reload nginx
再起動
完全に再起動します。
sudo systemctl restart nginx
停止と開始
# 停止
sudo systemctl stop nginx
# 開始
sudo systemctl start nginx
ステータスの確認
# サービスの状態
sudo systemctl status nginx
# プロセスの確認
ps aux | grep nginx
# ポートの確認
sudo netstat -tlnp | grep nginx
# または
sudo ss -tlnp | grep nginx
トラブルシューティング
よくある問題と解決法です。
問題1:Nginxが起動しない
症状
Job for nginx.service failed
原因と対処法
1. 構文エラー
sudo nginx -t
エラーメッセージに従って修正します。
2. ポートが使用中
sudo netstat -tlnp | grep :80
他のプロセスが80番ポートを使っている場合、そのプロセスを停止するか、別のポートを使用します。
3. 権限の問題
# Nginxユーザーを確認
ps aux | grep nginx
# ファイルの権限を確認
ls -la /var/www/html
問題2:502 Bad Gateway
原因
- バックエンドサーバーが動いていない
- proxy_passの設定ミス
- ファイアウォールでブロックされている
対処法
1. バックエンドの確認
# Node.jsアプリの確認
ps aux | grep node
# PHP-FPMの確認
sudo systemctl status php8.1-fpm
2. 接続テスト
curl http://localhost:3000
3. エラーログを確認
sudo tail -f /var/log/nginx/error.log
問題3:504 Gateway Timeout
原因
- バックエンドの処理が遅い
- タイムアウト設定が短すぎる
対処法
タイムアウト時間を延長します。
location / {
proxy_pass http://backend;
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
}
問題4:403 Forbidden
原因
- ファイルの権限が不正
- インデックスファイルがない
- ディレクトリリスティングが無効
対処法
1. 権限の確認と修正
# 所有者をnginxユーザーに変更
sudo chown -R www-data:www-data /var/www/html
# 権限を設定
sudo chmod -R 755 /var/www/html
2. インデックスファイルの確認
ls -la /var/www/html/index.html
ファイルが存在しない場合は作成します。
パフォーマンスチューニング
Nginxを高速化する設定です。
基本的なチューニング
# ワーカープロセス
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
# ファイル送信の最適化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# キープアライブ
keepalive_timeout 65;
keepalive_requests 100;
# バッファサイズ
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
# タイムアウト
client_header_timeout 12;
client_body_timeout 12;
send_timeout 10;
# Gzip圧縮
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
gzip_disable "msie6";
# キャッシュ
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
静的ファイルのキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
よくある質問(FAQ)
Q1. nginx.confを編集したら、いつ反映されますか?
A. リロードまたは再起動後です。
sudo nginx -s reload
リロードすれば、ダウンタイムなしで反映されます。
Q2. 設定ファイルを間違えたら、サーバーが止まりますか?
A. いいえ、構文チェックで防げます。
sudo nginx -t
このコマンドでエラーがなければ、安全に反映できます。エラーがあれば、反映前に気づけます。
Q3. Apache の .htaccess のようなファイルはありますか?
A. いいえ、Nginxには .htaccess 相当の機能はありません。
すべての設定は、nginx.conf または include されるファイルに記述します。
Q4. 複数のドメインを1つのNginxで運用できますか?
A. はい、server ブロックを複数作成すれば可能です。
server {
server_name site1.com;
root /var/www/site1;
}
server {
server_name site2.com;
root /var/www/site2;
}
Q5. Nginxの設定をバックアップすべきですか?
A. はい、必ずバックアップを取ってください。
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
変更前に必ずバックアップすることを強く推奨します。
Q6. デフォルト設定を確認したいのですが?
A. サンプル設定ファイルが用意されています。
# Ubuntu/Debian
cat /usr/share/doc/nginx/examples/nginx.conf
# または新規インストール時の設定
nginx -V 2>&1 | grep "configure arguments"
まとめ|Nginx設定ファイルをマスターして高性能サーバーを構築
Nginxの設定ファイルは、最初は複雑に見えますが、基本を理解すれば柔軟にカスタマイズできます。
この記事の重要ポイント
- nginx.confは階層構造(ブロック構造)で書く
- 設定変更後は必ず
nginx -t
で構文チェック nginx -s reload
でダウンタイムなしで反映- serverブロックでバーチャルホストを設定
- locationブロックで特定のURLパスを制御
- リバースプロキシでバックエンドと連携
- SSL/TLSでHTTPS対応
- パフォーマンスチューニングで高速化
設定変更のチェックリスト
- バックアップを取る
- 設定ファイルを編集
sudo nginx -t
で構文チェックsudo nginx -s reload
で反映- ブラウザやcurlで動作確認
- エラーログを確認
最初は戸惑うかもしれませんが、この記事の例を参考に、少しずつ試していけば必ず使いこなせるようになります。
あなたのWebサイトやアプリケーションを、Nginxで高速かつ安定して配信してくださいね!
コメント