「Nginxのサーバー設定を変更したいけど、どこをいじればいいの?」
Nginxを使ってウェブサイトを運営していると、必ず出会うのが「nginx.conf」という設定ファイルです。このファイルは、Nginxがどのように動作するかを決める、いわば「設計図」のようなもの。
でも、初めて見ると「記号だらけで何が書いてあるか分からない…」と感じる方も多いはず。
この記事では、nginx.confの基本から、よく使う設定項目、実践的な設定例、トラブル対処まで分かりやすく解説していきます。
サーバー管理の第一歩として、nginx.confをマスターしましょう!
nginx.confって何?基本を理解しよう
Nginxとは
まず、Nginxについて簡単に説明しましょう。
Nginx(エンジンエックス)は、高速で軽量なウェブサーバーソフトウェアです。世界中の多くのウェブサイトで使われており、Apache と並ぶ人気のサーバーソフトですね。
nginx.confの役割
nginx.conf は、Nginxのメイン設定ファイルです。
このファイルに書かれた内容に従って、Nginxは以下のような動作を決定します。
- どのポートで接続を受け付けるか
- どのドメイン名でアクセスされたときに、どのファイルを表示するか
- アクセスログをどこに保存するか
- SSL証明書をどのように扱うか
- リバースプロキシとして動作するかどうか
つまり、nginx.conf を理解すれば、サーバーの挙動を自由にコントロールできるということです。
設定ファイルの場所
nginx.conf は通常、以下の場所にあります。
一般的な配置場所
- Linux系(Ubuntu、Debian):
/etc/nginx/nginx.conf
- Linux系(CentOS、RHEL):
/etc/nginx/nginx.conf
- macOS(Homebrewでインストール):
/usr/local/etc/nginx/nginx.conf
- Windows:
C:\nginx\conf\nginx.conf
場所が分からない場合は、以下のコマンドで確認できます。
nginx -t
このコマンドは設定ファイルの構文チェックと同時に、使用している設定ファイルのパスも表示してくれますよ。
nginx.confの基本構造を知ろう
ディレクティブとは
nginx.confは「ディレクティブ」という命令文で構成されています。
ディレクティブは、「こういう設定にしてね」という指示のこと。以下のような形式で書かれます。
設定項目名 値;
セミコロン(;)で終わるのがポイントです。
例:シンプルなディレクティブ
worker_processes 4;
これは「ワーカープロセスを4つ起動してね」という意味です。
コンテキストとは
ディレクティブは「コンテキスト」という範囲の中に書かれます。
コンテキストは、波括弧 {}
で囲まれたブロックのこと。どの範囲に対する設定なのかを示します。
主なコンテキスト
- main(メイン):ファイル全体に適用される設定
- events(イベント):接続処理に関する設定
- http(HTTP):ウェブサーバー全体の設定
- server(サーバー):個別のバーチャルホスト(サイト)の設定
- location(ロケーション):特定のURLパスに対する設定
階層構造
これらのコンテキストは、入れ子構造になっています。
main コンテキスト
├── events コンテキスト
└── http コンテキスト
└── server コンテキスト
└── location コンテキスト
内側のコンテキストは、外側の設定を継承します。ただし、同じ設定があれば内側が優先されるんです。
基本的なnginx.confの構成例
実際のnginx.confがどんな感じか見てみましょう。
# ワーカープロセスの数(通常はCPUコア数に合わせる)
worker_processes auto;
# イベント処理の設定
events {
worker_connections 1024; # 1つのワーカーが処理できる接続数
}
# HTTP サーバーの設定
http {
# 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;
# パフォーマンス設定
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# バーチャルホストの設定
server {
listen 80; # ポート80で待ち受け
server_name example.com; # ドメイン名
# ドキュメントルート
root /var/www/html;
index index.html index.htm;
# URLごとの設定
location / {
try_files $uri $uri/ =404;
}
}
}
最初は複雑に見えますが、区切りを意識すれば理解しやすくなりますよ。
重要な設定項目を理解する
mainコンテキストの主要設定
worker_processes
Nginxが起動するワーカープロセスの数です。
worker_processes auto;
auto
にすると、CPUコア数に合わせて自動設定されます。手動で指定する場合は、CPUコア数と同じ値にするのが一般的ですね。
user
Nginxを実行するユーザー名を指定します。
user nginx;
セキュリティのため、root以外の専用ユーザーで実行するのが基本です。
error_log
エラーログの出力先とレベルを設定します。
error_log /var/log/nginx/error.log warn;
レベルは debug
, info
, notice
, warn
, error
, crit
などが指定できます。
eventsコンテキストの主要設定
worker_connections
1つのワーカープロセスが同時に処理できる接続数です。
worker_connections 1024;
アクセスが多いサイトなら、この値を増やすことも検討しましょう。
httpコンテキストの主要設定
include
他の設定ファイルを読み込みます。
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
設定を分割して管理するのに便利です。
sendfile
ファイル送信の最適化機能です。
sendfile on;
通常は on
にしておくと、パフォーマンスが向上します。
keepalive_timeout
接続を保持する時間(秒)です。
keepalive_timeout 65;
短すぎると頻繁に接続を確立する必要があり、長すぎるとリソースを圧迫します。
gzip
データを圧縮して転送する機能です。
gzip on;
gzip_types text/plain text/css application/json;
帯域幅を節約し、ページの読み込みを高速化できますよ。
serverブロックの設定
serverブロックは、個別のウェブサイトやアプリケーションの設定を行います。
基本的なserverブロック
server {
listen 80; # HTTPポート
server_name example.com www.example.com; # ドメイン名
root /var/www/example.com; # ドキュメントルート
index index.html index.htm index.php; # インデックスファイル
location / {
try_files $uri $uri/ =404;
}
}
listen ディレクティブ
待ち受けるポートとIPアドレスを指定します。
listen 80; # IPv4のポート80
listen [::]:80; # IPv6のポート80
listen 443 ssl; # HTTPSポート
server_name ディレクティブ
このserverブロックが対応するドメイン名を指定します。
server_name example.com www.example.com;
複数のドメインをスペース区切りで指定できます。ワイルドカードも使えますよ。
server_name *.example.com; # サブドメインすべて
server_name .example.com; # example.comとすべてのサブドメイン
root と index
root:ウェブサイトのファイルが置かれているディレクトリ
index:ディレクトリにアクセスされたときに表示するファイル
root /var/www/html;
index index.html index.htm index.php;
locationブロックの活用
locationブロックは、特定のURLパスに対する動作を定義します。
基本的なlocationブロック
location / {
try_files $uri $uri/ =404;
}
これは「ファイルがあれば表示、なければ404エラー」という意味です。
locationの種類
前方一致(プレフィックスマッチ)
location /images/ {
root /var/www;
}
/images/
で始まるURLにマッチします。
完全一致
location = /index.html {
# 処理
}
=
を使うと、完全に一致する場合のみマッチ。
正規表現(大文字小文字を区別)
location ~ \.php$ {
# PHP ファイルの処理
}
~
を使うと正規表現が使えます。
正規表現(大文字小文字を区別しない)
location ~* \.(jpg|jpeg|png|gif)$ {
# 画像ファイルの処理
}
~*
は大文字小文字を区別しません。
try_files の使い方
リクエストされたファイルが存在するか順番に確認します。
try_files $uri $uri/ /index.php?$query_string;
- まず
$uri
(リクエストされたファイル)を探す - なければ
$uri/
(ディレクトリ)を探す - それもなければ
/index.php
にリダイレクト
フレームワークを使ったアプリケーションでよく使われる設定ですね。
SSL/HTTPS の設定
セキュアな通信のためのSSL設定も重要です。
基本的なSSL設定
server {
listen 443 ssl;
server_name example.com;
# SSL証明書のパス
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;
# その他の設定
root /var/www/html;
index index.html;
}
HTTPからHTTPSへのリダイレクト
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
HTTP(ポート80)でアクセスされたら、HTTPS(ポート443)に転送する設定です。
リバースプロキシの設定
Nginxをリバースプロキシとして使う場合の設定です。
基本的なプロキシ設定
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;
}
バックエンドのアプリケーションサーバー(Node.js、Pythonなど)にリクエストを転送します。
ロードバランシング
複数のサーバーに負荷を分散する設定です。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
設定変更の正しい手順
nginx.confを編集したら、以下の手順で適用します。
1. 設定ファイルをバックアップ
万が一のために、元の設定を保存しておきましょう。
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
2. 設定ファイルを編集
テキストエディタで編集します。
sudo nano /etc/nginx/nginx.conf
または
sudo vi /etc/nginx/nginx.conf
3. 構文チェック
編集後、必ず構文チェックを行います。
sudo nginx -t
成功時の表示
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
エラーがある場合
エラーメッセージが表示されるので、該当箇所を修正してください。
4. 設定を反映
構文チェックが成功したら、設定を反映させます。
リロード(推奨)
sudo nginx -s reload
または
sudo systemctl reload nginx
リロードは、既存の接続を切らずに設定を反映します。
再起動
sudo systemctl restart nginx
再起動は、すべての接続を一旦切断します。
よくある設定例
実際によく使われる設定パターンを紹介します。
WordPress サイトの設定
server {
listen 80;
server_name example.com;
root /var/www/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
静的ファイルのキャッシュ設定
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
画像やCSSファイルを30日間キャッシュさせる設定です。
Basic認証の設定
location /admin {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
特定のディレクトリにパスワード認証をかける設定ですね。
トラブルシューティング
よくある問題と解決法を見ていきましょう。
設定変更後にNginxが起動しない
原因:構文エラー
構文チェックを実行して、エラー箇所を確認します。
sudo nginx -t
よくあるミス:
- セミコロン(;)の付け忘れ
- 波括弧({})の閉じ忘れ
- クォート(””)の閉じ忘れ
502 Bad Gateway エラー
原因:バックエンドサーバーが起動していない
プロキシ先のアプリケーションが動作しているか確認しましょう。
systemctl status アプリケーション名
403 Forbidden エラー
原因1:ファイルのパーミッション
Nginxがファイルを読み取れるか確認します。
ls -la /var/www/html
原因2:index ファイルがない
指定したindexファイルが存在するか確認してください。
ログファイルの確認
問題が起きたら、まずログを確認しましょう。
エラーログ
sudo tail -f /var/log/nginx/error.log
アクセスログ
sudo tail -f /var/log/nginx/access.log
リアルタイムでログを監視できます。
セキュリティ設定
安全なサーバー運用のための設定です。
サーバー情報の隠蔽
http {
server_tokens off;
}
Nginxのバージョン情報を非表示にします。
アクセス制限
location /admin {
allow 192.168.1.0/24; # 許可するIPアドレス
deny all; # その他は拒否
}
特定のIPアドレスからのみアクセスを許可できます。
レート制限
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20;
}
}
}
DDoS攻撃を防ぐため、アクセス頻度を制限します。
パフォーマンス最適化
サーバーの処理速度を向上させる設定です。
gzip圧縮の有効化
http {
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/x-javascript application/xml+rss
application/json;
}
転送データを圧縮して、通信量を削減します。
静的ファイルのキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
access_log off;
add_header Cache-Control "public, immutable";
}
open_file_cache の設定
http {
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
頻繁にアクセスされるファイルをキャッシュして、ディスク読み込みを削減します。
よくある質問
Q1. nginx.confを編集するのに特別な権限が必要?
はい、root権限が必要です。
sudo
コマンドを使って編集してください。
Q2. 複数のサイトを運営する場合は?
各サイトごとにserverブロックを作成します。
または、/etc/nginx/sites-available/
に個別のファイルを作って、includeで読み込む方法もありますよ。
Q3. 設定を間違えたらどうなる?
構文エラーがあると、Nginxが起動しません。
でも、既存の設定ファイルのバックアップがあれば、すぐに元に戻せます。
Q4. デフォルト設定はどこにある?
インストール時の設定は /etc/nginx/nginx.conf
にあります。
配布元によって多少内容が異なることがあるので、公式ドキュメントも確認しましょう。
Q5. includeで読み込むファイルの推奨構成は?
一般的な構成:
/etc/nginx/nginx.conf
:メイン設定/etc/nginx/conf.d/*.conf
:追加の設定/etc/nginx/sites-available/
:個別サイトの設定/etc/nginx/sites-enabled/
:有効化されたサイト
管理しやすい構造を選びましょう。
まとめ:nginx.confをマスターしよう
nginx.confについて、重要なポイントをまとめます。
基本構造
- ディレクティブとコンテキストで構成
- main → events → http → server → location の階層
- セミコロン(;)と波括弧({})に注意
重要な設定項目
- worker_processes:プロセス数
- worker_connections:接続数
- server_name:ドメイン名
- root:ドキュメントルート
- location:URLごとの設定
設定変更の手順
- バックアップを取る
- 設定ファイルを編集
nginx -t
で構文チェックnginx -s reload
で反映
よく使う設定
- SSL/HTTPS設定
- リバースプロキシ
- 静的ファイルのキャッシュ
- アクセス制限
- gzip圧縮
トラブル対処
- ログファイルを確認
- 構文チェックを実行
- バックアップから復元
nginx.confは最初は難しく感じますが、基本構造を理解すれば、柔軟にサーバーを設定できるようになります。この記事を参考に、安全で高速なウェブサーバーを構築してくださいね!
コメント