Webサイトやアプリケーションを公開するには、Webサーバーの構築が不可欠です。中でもNginx(エンジンエックス)は、高速・軽量・高い同時接続処理能力を備え、世界中で最も利用されているWebサーバーソフトウェアの一つです。
本記事では、Linux上でNginxをインストールし、基本設定からバーチャルホスト設定、SSL化(HTTPS対応)までを初心者向けに丁寧に解説します。Linuxの基本操作についてはLinuxとは?の入門記事を、コマンド操作に不安がある方はLinuxコマンド実践ガイドをあらかじめ確認しておくと安心です。
Nginxとは?Apacheとの違いと中小企業で選ばれる理由
Webサーバーソフトウェアの選択肢として、Nginxの他にApacheがよく知られています。まずは両者の違いを理解し、Nginxが選ばれる理由を押さえましょう。
Nginxの特徴と強み
Nginxは2004年にロシアのIgor Sysoev氏によって開発されました。当初から大量の同時接続を効率的に処理することを目的に設計されており、以下のような特徴があります。
- イベント駆動型アーキテクチャ:少ないメモリで大量の同時接続を処理可能
- 静的コンテンツの配信が高速:HTML、CSS、画像などの配信に特に強い
- リバースプロキシ機能:バックエンドのアプリケーションサーバーへの仲介が得意
- 設定ファイルがシンプル:直感的な記法で設定しやすい
- リソース消費が少ない:低スペックなサーバーでも安定して動作する
NginxとApacheの比較
| 比較項目 | Nginx | Apache |
|---|---|---|
| 処理方式 | イベント駆動型(非同期) | プロセス/スレッド駆動型 |
| 同時接続性能 | 非常に高い | 中程度 |
| 静的コンテンツ | 非常に高速 | 高速 |
| 動的コンテンツ | 外部に委譲(FastCGI等) | モジュールで直接処理 |
| 設定変更の反映 | 設定ファイルの再読み込み | .htaccessで動的変更も可能 |
| メモリ消費 | 少ない | 比較的多い |
中小企業においては、限られたサーバーリソースで安定したパフォーマンスを発揮するNginxが特に適しています。また、静的サイトのホスティングやリバースプロキシとしての利用が中心の場合、Nginxの強みを最大限に活かせます。
NginxのインストールとLinuxでの初期設定
ここでは、Ubuntu/Debian系とCentOS/Rocky Linux系の両方の手順を紹介します。サーバーのセットアップがまだの方は、UbuntuサーバーセットアップガイドやCentOS/Rocky Linuxガイドを参照してください。
Ubuntu/Debian系でのインストール
# パッケージ一覧の更新
sudo apt update
# Nginxのインストール
sudo apt install -y nginx
# サービスの状態確認
sudo systemctl status nginx
# 自動起動の設定
sudo systemctl enable nginx
CentOS/Rocky Linux系でのインストール
# EPELリポジトリの有効化(必要な場合)
sudo dnf install -y epel-release
# Nginxのインストール
sudo dnf install -y nginx
# サービスの起動と自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx
ファイアウォールの設定
Nginxをインストールしたら、HTTP(80番)とHTTPS(443番)のポートをファイアウォールで許可する必要があります。Linuxのファイアウォール設定も参考にしてください。
# UFW(Ubuntu)の場合
sudo ufw allow 'Nginx Full'
sudo ufw status
# firewalld(CentOS/Rocky Linux)の場合
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
ブラウザでサーバーのIPアドレスにアクセスして、「Welcome to nginx!」のページが表示されればインストール成功です。
Nginxの設定ファイルの構造を理解する
Nginxを使いこなすには、設定ファイルの構造を理解することが重要です。
主要な設定ファイルとディレクトリ
Nginxの設定ファイルは以下の場所にあります。
- /etc/nginx/nginx.conf:メインの設定ファイル
- /etc/nginx/conf.d/:追加の設定ファイル(CentOS系で主に使用)
- /etc/nginx/sites-available/:サイト設定ファイルの保管場所(Ubuntu系)
- /etc/nginx/sites-enabled/:有効なサイト設定のシンボリックリンク(Ubuntu系)
- /var/log/nginx/:アクセスログとエラーログ
- /var/www/html/:デフォルトのドキュメントルート
ディレクトリ構造の詳細については、Linuxのディレクトリ構造ガイドを参照してください。
nginx.confの基本構造
# グローバル設定
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
multi_accept on;
}
http {
# HTTPコンテキストの設定
include /etc/nginx/mime.types;
default_type application/octet-stream;
# ログ設定
access_log /var/log/nginx/access.log;
# パフォーマンス設定
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
# サイト設定の読み込み
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
設定変更の反映と文法チェック
設定ファイルを変更したら、必ず文法チェックを行ってから反映しましょう。
# 設定ファイルの文法チェック
sudo nginx -t
# 設定の再読み込み(サービス無停止)
sudo systemctl reload nginx
# サービスの再起動(必要な場合)
sudo systemctl restart nginx
バーチャルホストの設定:複数サイトの運用
1台のサーバーで複数のWebサイトを運用するには、バーチャルホスト(Nginxではserver blockと呼びます)を設定します。
基本的なserver blockの設定
# /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
# アクセスログとエラーログの分離
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
# 静的ファイルのキャッシュ設定
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
サイトの有効化と無効化
# ドキュメントルートの作成
sudo mkdir -p /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/example.com
# サイトの有効化(シンボリックリンクの作成)
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# デフォルトサイトの無効化
sudo rm /etc/nginx/sites-enabled/default
# 設定の確認と反映
sudo nginx -t
sudo systemctl reload nginx
パーミッションの設定については、Linuxのファイルパーミッション解説を参照してください。
リバースプロキシの設定
Node.jsやPythonなどのアプリケーションサーバーと連携する場合、Nginxをリバースプロキシとして設定します。
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_cache_bypass $http_upgrade;
}
}
この構成は、DockerでWebアプリケーションを運用する場合にも非常に有用です。
SSL証明書の導入とHTTPS化(Let's Encrypt)
現代のWebサイトにとって、HTTPS化はほぼ必須です。Let's Encryptを使えば、無料でSSL証明書を取得して自動更新する仕組みを構築できます。
Certbot(Let's Encryptクライアント)のインストール
# Ubuntu/Debian系
sudo apt install -y certbot python3-certbot-nginx
# CentOS/Rocky Linux系
sudo dnf install -y certbot python3-certbot-nginx
SSL証明書の取得と自動設定
# Certbotを使ってSSL証明書を取得し、Nginx設定を自動修正
sudo certbot --nginx -d example.com -d www.example.com
# 対話形式で以下を聞かれます
# - メールアドレス(証明書の期限通知用)
# - 利用規約への同意
# - HTTPからHTTPSへのリダイレクト設定
Certbotが実行されると、Nginxの設定ファイルが自動的に修正され、SSL関連の設定が追加されます。
SSL証明書の自動更新設定
Let's Encryptの証明書は90日で失効するため、自動更新の設定が不可欠です。
# 自動更新のテスト(実際には更新しない)
sudo certbot renew --dry-run
# cronまたはsystemd timerで自動更新が設定されているか確認
sudo systemctl list-timers | grep certbot
cronによる定期実行の仕組みについては、Linuxのcronとスケジュールタスクの記事を参照してください。
SSLの推奨設定
セキュリティを強化するために、以下の設定を追加しましょう。
# /etc/nginx/conf.d/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# セキュリティヘッダー
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Nginxのパフォーマンスチューニング
Nginxはデフォルト設定でも十分な性能を発揮しますが、環境に合わせたチューニングでさらに性能を引き出せます。
ワーカープロセスの最適化
# nginx.conf
worker_processes auto; # CPUコア数に自動で合わせる
events {
worker_connections 2048; # 1プロセスあたりの最大接続数
multi_accept on; # 複数接続を同時に受け入れ
use epoll; # Linux向けの高効率イベント処理
}
gzip圧縮の設定
http {
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
application/rss+xml
image/svg+xml;
gzip_min_length 1000;
}
静的ファイルのキャッシュ設定
# ブラウザキャッシュの設定
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
expires 90d;
add_header Cache-Control "public, immutable";
}
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
location ~* \.(woff|woff2|ttf|otf|eot)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
サーバー全体のパフォーマンス監視については、Linuxサーバーのパフォーマンス監視入門もあわせてお読みください。
Nginxのログ管理とトラブルシューティング
Webサーバーの安定運用には、ログの監視と適切なトラブルシューティングが欠かせません。
ログの確認方法
# アクセスログの確認(リアルタイム)
sudo tail -f /var/log/nginx/access.log
# エラーログの確認
sudo tail -f /var/log/nginx/error.log
# 特定のステータスコード(404エラーなど)を抽出
sudo grep " 404 " /var/log/nginx/access.log
# アクセスの多いIPアドレスを集計
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
ログの管理全般については、Linuxのログ管理ガイドを参照してください。また、テキスト処理のテクニックはLinuxテキスト処理コマンドで詳しく解説しています。
よくあるエラーと解決策
403 Forbidden:パーミッションの問題が多い原因です。ドキュメントルートのオーナーとNginxの実行ユーザーを確認しましょう。
# Nginxの実行ユーザーを確認
grep "user" /etc/nginx/nginx.conf
# ドキュメントルートのパーミッションを確認
ls -la /var/www/example.com/
# パーミッションを修正
sudo chown -R www-data:www-data /var/www/example.com/
sudo chmod -R 755 /var/www/example.com/
502 Bad Gateway:リバースプロキシ先のアプリケーションが停止している場合に発生します。バックエンドのアプリケーションが正常に起動しているか確認してください。
設定ファイルのエラー:nginx -tでエラー箇所を特定できます。修正後は必ず再度チェックしてから反映しましょう。
まとめ:NginxでLinuxサーバーを効率的に運用しよう
本記事では、Linux上でのNginxの構築から運用までを一通り解説しました。
- Nginxはイベント駆動型で、少ないリソースで高パフォーマンスを発揮する
- バーチャルホスト設定で、1台のサーバーから複数サイトを運用可能
- Let's Encryptで無料のSSL証明書を取得し、HTTPS化を実現できる
- パフォーマンスチューニングで、さらなる高速化が可能
- ログの監視とトラブルシューティングが安定運用の鍵となる
Nginxは中小企業のWebインフラとして非常に優秀な選択肢です。まずは基本的なWebサイトの公開から始めて、リバースプロキシやロードバランシングなど、より高度な使い方にステップアップしていきましょう。
サーバーのセキュリティ対策についてはLinuxサーバーのセキュリティ強化を、サービス管理の自動化についてはsystemdとサービス管理ガイドも参考にしてください。また、AIツールの導入で開発効率をさらに上げたい方は、Claude Codeセットアップガイドもおすすめです。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践