Laravel×Nginxの基礎知識
Nginxが選ばれる3つの理由
モダンなWebアプリケーション開発において、Nginxは多くの開発者から支持されているWebサーバーソフトウェアです。以下の3つの主要な理由により、特にLaravelプロジェクトにおいて選ばれています:
- 優れたパフォーマンスと低リソース消費
- イベント駆動型アーキテクチャの採用により、少ないメモリ消費で多数の同時接続を処理
- 静的コンテンツの配信が非常に高速
- 動的コンテンツのリバースプロキシとしても優れたパフォーマンスを発揮
- CPUとメモリの使用効率が高く、サーバーリソースを効率的に活用
- 高度な負荷分散機能
- ラウンドロビン、IP-hash、最小接続数など、複数の負荷分散アルゴリズムをサポート
- アップストリームサーバーのヘルスチェック機能を標準搭載
- 柔軟なルーティング設定により、複数のバックエンドサーバーへのトラフィック分散が容易
- マイクロサービスアーキテクチャにも適した設計
- 柔軟な設定オプションと拡張性
- モジュール式のアーキテクチャにより、必要な機能のみを有効化可能
- HTTPSやHTTP/2など、最新のプロトコルに対応
- キャッシュ制御やGzip圧縮など、パフォーマンス最適化オプションが充実
- セキュリティ関連の設定が細かく制御可能
LaravelとNginxの相性が抜群な理由
LaravelとNginxの組み合わせが多くのプロジェクトで採用される理由は、以下の相乗効果にあります:
- 効率的なPHP-FPM連携
- NginxはPHP-FPMとの連携が最適化されており、リクエスト処理が高速
- Unix socketを使用した通信により、オーバーヘッドを最小限に抑制
- プロセス管理が効率的で、メモリ使用量を抑えながら高いパフォーマンスを実現
- 静的アセット配信の最適化
- Laravelのパブリックディレクトリにある静的ファイルを高速に配信
- 画像、CSS、JavaScriptファイルのキャッシュ制御が容易
- アセットパイプラインとの相性が良く、本番環境での最適化が簡単
- セキュリティ強化の容易さ
.envファイルなど、機密情報を含むファイルへのアクセスを簡単にブロック- HTTPS設定が容易で、Let’s Encryptとの連携もスムーズ
- XSS対策やCSRF対策などのセキュリティヘッダーを簡単に設定可能
ApacheからNginxへの移行メリット
多くのLaravelプロジェクトでApacheからNginxへの移行が進んでいる理由を、以下の観点から解説します:
- システムリソースの効率化
- メモリ使用量が大幅に削減(同じ条件下で約40-60%の削減が一般的)
- CPU使用率の低下により、より多くのリクエストを処理可能
- 同時接続数の制限が実質的になく、C10K問題への対応が容易
- 設定の簡素化とメンテナンス性向上
- 直感的な設定構文により、設定ファイルの管理が容易
- バーチャルホストの設定が単純明快
- モジュールの依存関係が少なく、システムの安定性が向上
- リバースプロキシの設定が簡単で柔軟
- パフォーマンスチューニングの柔軟性
- マイクロキャッシュなど、高度なキャッシュ戦略の実装が容易
- 動的コンテンツと静的コンテンツの配信を最適化
- ファイルシステムへのアクセスが少なく、I/O負荷を軽減
- リクエストの優先順位付けが可能で、重要なリクエストの処理を最適化
このように、Laravel×Nginxの組み合わせは、現代のWebアプリケーション開発における多くの要件を満たす理想的な選択肢となっています。パフォーマンス、セキュリティ、運用性のバランスが取れており、スケーラブルなアプリケーション開発を支援します。
Nginxサーバーのセットアップ手順
Ubuntu環境でのNginx導入手順
Ubuntuサーバーで安全かつ最適化されたNginx環境を構築する手順を解説します。この手順は、Ubuntu 22.04 LTS以降のバージョンを対象としています。
1. 事前準備
まず、システムを最新の状態に更新します:
# パッケージリストの更新とシステムの更新 sudo apt update sudo apt upgrade -y # 必要なツールのインストール sudo apt install -y curl wget gnupg2 ca-certificates lsb-release ubuntu-keyring
2. Nginxのインストールと初期設定
最新の安定版Nginxをインストールします:
# 公式Nginxリポジトリの追加
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
# パッケージの更新とNginxのインストール
sudo apt update
sudo apt install nginx -y
インストール後の初期確認:
# Nginxのバージョン確認 nginx -v # サービスの状態確認 sudo systemctl status nginx # 自動起動の有効化 sudo systemctl enable nginx
3. 基本的なディレクトリ構造の設定
Laravelアプリケーション用のディレクトリを適切な権限で作成します:
# アプリケーションディレクトリの作成 sudo mkdir -p /var/www/laravel sudo chown -R $USER:www-data /var/www/laravel sudo chmod -R 755 /var/www/laravel # Nginxログディレクトリの作成 sudo mkdir -p /var/log/nginx/laravel sudo chown -R www-data:www-data /var/log/nginx/laravel
PHP-FPMのインストールと設定
1. PHP 8.2と必要なモジュールのインストール
# PHPリポジトリの追加
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# PHP 8.2とモジュールのインストール
sudo apt install -y php8.2-fpm php8.2-cli php8.2-common php8.2-mysql \
php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-bcmath \
php8.2-zip php8.2-intl php8.2-redis php8.2-opcache
2. PHP-FPMの最適化設定
PHP-FPMの設定を本番環境向けに最適化します。/etc/php/8.2/fpm/php.iniを以下のように編集します:
; メモリとパフォーマンスの設定 memory_limit = 256M max_execution_time = 60 max_input_time = 60 post_max_size = 64M upload_max_filesize = 64M ; OPcacheの設定 opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=10000 opcache.validate_timestamps=0 opcache.save_comments=1 opcache.fast_shutdown=1 ; エラー設定(本番環境用) error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = Off display_startup_errors = Off log_errors = On error_log = /var/log/php/error.log
PHP-FPMプールの設定(/etc/php/8.2/fpm/pool.d/www.conf):
[www] user = www-data group = www-data ; Unix socketの設定 listen = /run/php/php8.2-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 ; プロセス管理(中規模サイト向け設定例) pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 10 pm.max_requests = 500 ; スロー実行のログ設定 request_slowlog_timeout = 10s slowlog = /var/log/php-fpm/slow.log
SSLサーバー証明書の設定方法
1. Let’s Encryptの設定
Certbotを使用してSSL証明書を取得・設定します:
# Certbotのインストール
sudo apt install -y certbot python3-certbot-nginx
# 証明書の取得
sudo certbot --nginx -d your-domain.com --non-interactive \
--agree-tos --email your-email@example.com \
--redirect --hsts --staple-ocsp
# 自動更新の設定
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
2. Nginxの SSL/TLS 最適化設定
/etc/nginx/conf.d/ssl.confに以下の設定を追加します:
# SSL設定の最適化 ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # 現代的なTLSの設定 ssl_protocols TLSv1.2 TLSv1.3; 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_prefer_server_ciphers off; # DHパラメータ(事前に生成が必要) ssl_dhparam /etc/nginx/dhparam.pem; # OCSPステープリング ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # セキュリティヘッダー add_header Strict-Transport-Security "max-age=63072000" always; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy strict-origin-when-cross-origin;
3. 最終確認とサービスの再起動
設定完了後、以下のコマンドで構文チェックと再起動を行います:
# Nginx設定のテスト sudo nginx -t # PHP-FPMの再起動 sudo systemctl restart php8.2-fpm # Nginxの再起動 sudo systemctl restart nginx # 各サービスの状態確認 sudo systemctl status nginx sudo systemctl status php8.2-fpm
セットアップ後の確認ポイント:
curl -I https://your-domain.comでHTTPSレスポンスを確認- SSL LabsでSSL設定の評価を確認
- ブラウザの開発者ツールでセキュリティヘッダーの実装を確認
/var/log/nginx/error.logでエラーログを確認
これらの設定により、セキュアで高パフォーマンスなNginx環境が構築できました。次のセクションでは、この環境にLaravelアプリケーションをデプロイする方法を解説します。
Laravelプロジェクトのデプロイ手順
Composerによる依存関係のインストール
1. Composerのインストールと設定
# Composerのインストール
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
# Composerのグローバル設定
composer config -g process-timeout 3000
composer config -g repos.packagist composer https://packagist.org
2. プロジェクトのデプロイ
# プロジェクトディレクトリへの移動 cd /var/www/laravel # Gitからプロジェクトのクローン(例) git clone https://github.com/your-username/your-project.git . # 依存関係のインストール(本番環境用) composer install --no-dev --optimize-autoloader --no-interaction # キャッシュの最適化 php artisan config:cache php artisan route:cache php artisan view:cache
3. キャッシュとログの設定
# ストレージディレクトリの準備 php artisan storage:link # キャッシュディレクトリの権限設定 sudo chown -R www-data:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache # ログローテーションの設定 sudo nano /etc/logrotate.d/laravel
ログローテーションの設定例:
/var/www/laravel/storage/logs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
/usr/bin/kill -USR1 $(cat /var/run/php/php8.2-fpm.pid 2>/dev/null) 2>/dev/null || true
endscript
}
環境設定ファイルの構成方法
1. 環境変数の設定
.envファイルの基本設定:
APP_NAME="Your Application Name"
APP_ENV=production
APP_KEY=base64:your-encrypted-key
APP_DEBUG=false
APP_URL=https://your-domain.com
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=warning
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_secure_password
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=smtp.your-mail-server.com
MAIL_PORT=587
MAIL_USERNAME=your-email@example.com
MAIL_PASSWORD=your-mail-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=no-reply@your-domain.com
MAIL_FROM_NAME="${APP_NAME}"
2. 本番環境固有の設定
config/app.phpでの推奨設定:
return [
// アプリケーションの基本設定
'name' => env('APP_NAME', 'Laravel'),
'env' => env('APP_ENV', 'production'),
'debug' => env('APP_DEBUG', false),
'url' => env('APP_URL', 'https://your-domain.com'),
// パフォーマンス最適化
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'fallback_locale' => 'en',
// セキュリティ設定
'cipher' => 'AES-256-CBC',
'key' => env('APP_KEY'),
// セッション設定
'providers' => [
// 本番環境で不要なプロバイダーをコメントアウト
// Illuminate\Broadcasting\BroadcastServiceProvider::class,
],
];
アプリケーションのパーミッション設定
1. ディレクトリ権限の設定
基本的なパーミッション設定:
# ウェブサーバーのユーザーとグループを設定
sudo chown -R www-data:www-data /var/www/laravel
# 基本的なディレクトリパーミッションの設定
find /var/www/laravel -type f -exec chmod 644 {} \;
find /var/www/laravel -type d -exec chmod 755 {} \;
# 特定のディレクトリの書き込み権限設定
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
2. セキュリティ強化設定
Nginxの設定ファイル(/etc/nginx/conf.d/laravel.conf)でのセキュリティ設定:
server {
listen 443 ssl http2;
server_name your-domain.com;
root /var/www/laravel/public;
# SSL設定は前述の設定を使用
# 基本的なセキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
# Content Security Policy
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";
# 機密ファイルへのアクセス制限
location ~ /\.env {
deny all;
return 404;
}
location ~ /\.git {
deny all;
return 404;
}
# PHPファイルの処理
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
# 静的ファイルのキャッシュ設定
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
3. デプロイ後の最終確認
デプロイ完了後のチェックリスト:
- アプリケーションの動作確認
# アプリケーションステータスの確認 php artisan --version php artisan route:list php artisan migrate:status # キャッシュの確認 php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
- ログとストレージの確認
# ログファイルのパーミッション確認 ls -la storage/logs/ # ストレージリンクの確認 ls -la public/storage
- セキュリティチェック
# 設定ファイルの確認 php artisan config:check # 依存パッケージのセキュリティチェック composer audit
これらの手順を完了することで、セキュアで高パフォーマンスなLaravelアプリケーションの本番環境が構築できます。次のセクションでは、より実践的なNginxの設定例と最適化方法について解説します。
Nginxの実践的な設定例と解説
高パフォーマンスを実現するNginx設定
1. ワーカープロセスの最適化
# /etc/nginx/nginx.conf
# ワーカープロセスの設定
worker_processes auto; # CPUコア数に応じて自動設定
worker_rlimit_nofile 65535; # システムリソース制限の緩和
events {
worker_connections 2048; # 1ワーカーあたりの最大接続数
multi_accept on; # 複数の接続を同時に受け付け
use epoll; # Linuxでの高性能イベントハンドリング
}
http {
# 基本設定
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# バッファサイズの最適化
client_body_buffer_size 16k;
client_max_body_size 64m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
output_buffers 1 32k;
postpone_output 1460;
}
2. マイクロキャッシュの実装
# /etc/nginx/conf.d/microcache.conf
# マイクロキャッシュのゾーン定義
fastcgi_cache_path /tmp/nginx_cache levels=1:2
keys_zone=laravel_cache:100m max_size=10g
inactive=60m use_temp_path=off;
server {
# キャッシュの設定
fastcgi_cache laravel_cache;
fastcgi_cache_key "$request_method$request_uri$query_string";
fastcgi_cache_use_stale error timeout http_500 http_503;
fastcgi_cache_valid 200 60m; # 成功レスポンスを60分キャッシュ
fastcgi_cache_valid 404 1m; # Not Foundを1分キャッシュ
# キャッシュバイパス条件
set $skip_cache 0;
# POSTリクエストはキャッシュしない
if ($request_method = POST) {
set $skip_cache 1;
}
# ログイン済みユーザーはキャッシュしない
if ($http_cookie ~* "laravel_session") {
set $skip_cache 1;
}
location ~ \.php$ {
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# キャッシュステータスをヘッダーに追加
add_header X-Cache-Status $upstream_cache_status;
}
}
3. Gzip圧縮の最適化
# /etc/nginx/conf.d/gzip.conf
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
application/javascript
application/json
application/ld+json
application/manifest+json
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
gzip_buffers 16 8k;
gzip_min_length 1000;
セキュリティを強化するための設定
1. 基本的なセキュリティヘッダー
# /etc/nginx/conf.d/security.conf
# セキュリティヘッダーの設定
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
# Content Security Policy
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self'
" always;
# SSL設定の強化
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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# DDoS対策
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_status 429;
2. アクセス制御とセキュリティ制限
# /etc/nginx/conf.d/restrictions.conf
# 危険な要求の制限
location ~* (?:\.(?:bak|conf|dist|fla|in[ci]|log|psd|sh|sql|sw[op])|~)$ {
deny all;
access_log off;
log_not_found off;
}
# Word Pressなどの攻撃パターンのブロック
location ~* wp-admin|wp-login\.php {
deny all;
access_log off;
log_not_found off;
}
# バージョン情報の非表示
server_tokens off;
# シンボリックリンクの制限
disable_symlinks on;
# バッファオーバーフロー対策
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 64m;
large_client_header_buffers 2 1k;
キャッシュ制御の最適化方法
1. 静的ファイルのキャッシュ設定
# /etc/nginx/conf.d/caching.conf
# 静的ファイルのキャッシュ制御
location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff2?|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
# ETags無効化(If-None-Matchヘッダーを使用)
etag off;
# アクセスログの無効化
access_log off;
# 404エラーのログを無効化
log_not_found off;
}
# HTML/XMLファイルのキャッシュ制御
location ~* \.(html|xml)$ {
expires 1h;
add_header Cache-Control "public, no-transform";
}
# APIレスポンスのキャッシュ制御
location /api/ {
add_header Cache-Control "no-store, no-cache, must-revalidate";
expires 0;
}
2. 動的コンテンツのキャッシュ戦略
# /etc/nginx/conf.d/dynamic-cache.conf
# FastCGIキャッシュの詳細設定
fastcgi_cache_path /tmp/nginx_cache
levels=1:2
keys_zone=laravel_page_cache:100m
max_size=10g
inactive=60m
use_temp_path=off;
# キャッシュキーの設定
fastcgi_cache_key "$request_method$request_uri$query_string";
# キャッシュの例外設定
map $request_uri $no_cache {
default 0;
~*^/admin/ 1;
~*^/api/ 1;
~*^/user/ 1;
}
server {
location ~ \.php$ {
# キャッシュバイパスの条件
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
# キャッシュの有効期限設定
fastcgi_cache_valid 200 60m;
fastcgi_cache_valid 404 1m;
# キャッシュステータスの表示
add_header X-Cache-Status $upstream_cache_status;
# キャッシュのロック(同時リクエストの制御)
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;
# 古いキャッシュの使用
fastcgi_cache_use_stale error timeout http_500 http_503;
# キャッシュの最小使用回数
fastcgi_cache_min_uses 1;
}
}
これらの設定を適用する際の注意点:
- 設定変更前に必ずバックアップを取る
nginx -tで設定ファイルの構文チェックを行う- 段階的に設定を適用し、都度パフォーマンスとセキュリティをテストする
- 本番環境に適用する前にステージング環境でテストを行う
また、これらの設定はサーバーのリソースと要件に応じて適切に調整する必要があります。パフォーマンスモニタリングツールを使用して、設定変更の効果を継続的に測定することをお勧めします。
トラブルシューティングガイド
よくあるエラーと解決方法
1. 502 Bad Gateway エラー
症状:
- ブラウザで502 Bad Gatewayエラーが表示される
- Nginxのエラーログに
connect() failed (111: Connection refused)が記録される
確認手順:
# PHP-FPMの状態確認 sudo systemctl status php8.2-fpm # Nginxのエラーログ確認 sudo tail -f /var/log/nginx/error.log # PHP-FPMのログ確認 sudo tail -f /var/log/php8.2-fpm.log
一般的な原因と解決策:
- PHP-FPMの設定ミス
# /etc/nginx/conf.d/default.conf の確認ポイント
location ~ \.php$ {
# ソケットファイルのパスが正しいか確認
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
# または TCP/IP接続の場合
# fastcgi_pass 127.0.0.1:9000;
}
- パーミッションの問題
# ソケットファイルの権限確認 ls -la /run/php/php8.2-fpm.sock # 権限の修正 sudo chown www-data:www-data /run/php/php8.2-fpm.sock
- PHP-FPMのプロセス数不足
; /etc/php/8.2/fpm/pool.d/www.conf pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
2. 504 Gateway Timeout エラー
症状:
- リクエストが長時間応答を返さない
- Nginxのタイムアウトエラーが発生
確認手順:
# スロークエリの確認 sudo tail -f /var/log/mysql/slow-query.log # PHPプロセスの状態確認 ps aux | grep php
解決策:
- タイムアウト設定の調整
# /etc/nginx/conf.d/timeout.conf fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300;
- PHP実行時間の延長
; /etc/php/8.2/fpm/php.ini max_execution_time = 300 max_input_time = 300
パフォーマンス問題の診断と改善
1. パフォーマンス測定ツール
基本的な診断コマンド:
# サーバーリソースの監視 htop # Nginxの接続状態確認 netstat -an | grep :80 | wc -l # PHP-FPMプロセスの確認 ps aux | grep php-fpm | wc -l
高度な診断ツール:
# abコマンドによる負荷テスト
ab -n 1000 -c 10 https://your-domain.com/
# nginxのステータスページ設定
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
2. パフォーマンス最適化チェックリスト
- OPcacheの最適化
; /etc/php/8.2/fpm/php.ini opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.validate_timestamps=0 opcache.revalidate_freq=0 opcache.save_comments=1
- MySQLのチューニング
# /etc/mysql/mysql.conf.d/mysqld.cnf innodb_buffer_pool_size = 1G innodb_buffer_pool_instances = 4 innodb_read_io_threads = 4 innodb_write_io_threads = 4 innodb_flush_log_at_trx_commit = 2
- Redisのセッション管理
# .env SESSION_DRIVER=redis CACHE_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
セキュリティ脆弱性への対処方法
1. セキュリティ監査ツール
基本的なセキュリティチェック:
# SSL設定の確認
sudo nmap --script ssl-enum-ciphers -p 443 your-domain.com
# オープンポートのスキャン
sudo nmap -sS -sV your-domain.com
# ファイルパーミッションの監査
find /var/www/laravel -type f -exec stat -c "%a %n" {} \;
2. 一般的な脆弱性対策
- XSS対策
// LaravelのBladeテンプレートでの対策
{{ $userInput }} // 自動でエスケープ
{!! $trustedHtml !!} // 信頼できるHTMLの場合のみ使用
- SQLインジェクション対策
// クエリビルダーの使用
$users = DB::table('users')
->where('status', '=', $status)
->get();
// プリペアドステートメントの使用
$results = DB::select('select * from users where id = ?', [$id]);
- CSRF対策
// フォームでのCSRFトークン
@csrf
// ミドルウェアでの保護
protected $middleware = [
\App\Http\Middleware\VerifyCsrfToken::class,
];
3. セキュリティインシデント発生時の対応手順
- インシデントの初期対応
# アクセスログの保存 sudo cp /var/log/nginx/access.log /var/log/nginx/access.log.incident sudo cp /var/log/nginx/error.log /var/log/nginx/error.log.incident # 不審なプロセスの確認 ps aux | grep -i suspicious # ネットワーク接続の確認 netstat -tupln
- システムの復旧手順
# バックアップからの復元 sudo systemctl stop nginx sudo systemctl stop php8.2-fpm # ファイルの復元 rsync -avz backup/laravel/ /var/www/laravel/ # パーミッションの再設定 sudo chown -R www-data:www-data /var/www/laravel sudo chmod -R 755 /var/www/laravel sudo chmod -R 775 /var/www/laravel/storage # サービスの再起動 sudo systemctl start php8.2-fpm sudo systemctl start nginx
- 再発防止策の実施
# セキュリティアップデート sudo apt update sudo apt upgrade -y # ファイアウォールの強化 sudo ufw default deny incoming sudo ufw allow ssh sudo ufw allow 'Nginx Full' sudo ufw enable
これらのトラブルシューティング手順は、一般的な問題に対する基本的なアプローチを提供します。実際の環境では、システムの構成や要件に応じて適切にカスタマイズする必要があります。また、重要な変更を行う前には必ずバックアップを取得し、テスト環境での検証を推奨します。
本番環境での運用ベストプラクティス
パフォーマンスモニタリングの実装
1. システムモニタリングの設定
基本的なモニタリングスクリプト:
#!/bin/bash
# /usr/local/bin/server-monitor.sh
# システムリソース使用状況の記録
log_file="/var/log/server-monitor.log"
date_format=$(date '+%Y-%m-%d %H:%M:%S')
# CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
# メモリ使用率
memory_usage=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
# ディスク使用率
disk_usage=$(df -h / | awk 'NR==2{print $5}')
# Nginxの接続数
nginx_connections=$(netstat -an | grep :80 | wc -l)
# PHP-FPMプロセス数
php_processes=$(ps aux | grep php-fpm | wc -l)
# ログの記録
echo "$date_format - CPU: $cpu_usage%, Memory: $memory_usage, Disk: $disk_usage, Nginx Connections: $nginx_connections, PHP-FPM Processes: $php_processes" >> $log_file
モニタリングの自動化設定:
# cronへの登録
*/5 * * * * /usr/local/bin/server-monitor.sh
# アラート閾値の設定
if [ $(echo "$cpu_usage > 80" | bc) -eq 1 ]; then
echo "High CPU Usage Alert: $cpu_usage%" | mail -s "Server Alert" admin@example.com
fi
2. アプリケーションパフォーマンスの監視
Laravelのパフォーマンス監視設定:
// config/logging.php
'channels' => [
'performance' => [
'driver' => 'daily',
'path' => storage_path('logs/performance.log'),
'level' => 'debug',
'days' => 14,
],
];
// app/Providers/AppServiceProvider.php
public function boot()
{
DB::listen(function ($query) {
if ($query->time > 100) { // 100ms以上のクエリをログ
Log::channel('performance')->warning(
'Slow Query: ' . $query->sql,
[
'bindings' => $query->bindings,
'time' => $query->time,
]
);
}
});
}
Nginxのアクセスログ解析:
# /etc/nginx/conf.d/logging.conf
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/detailed_access.log detailed;
バックアップと復旧戦略
1. 自動バックアップの実装
データベースバックアップスクリプト:
#!/bin/bash
# /usr/local/bin/backup-database.sh
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER="your_db_user"
DB_PASS="your_db_password"
DB_NAME="your_database"
# バックアップディレクトリの作成
mkdir -p $BACKUP_DIR
# データベースのダンプ
mysqldump --user=$DB_USER --password=$DB_PASS --single-transaction \
--quick --lock-tables=false $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME\_$DATE.sql.gz
# 古いバックアップの削除(30日以上前)
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -delete
アプリケーションファイルのバックアップ:
#!/bin/bash
# /usr/local/bin/backup-app.sh
APP_DIR="/var/www/laravel"
BACKUP_DIR="/var/backups/laravel"
DATE=$(date +%Y%m%d_%H%M%S)
# 設定ファイルのバックアップ
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
$APP_DIR/.env \
$APP_DIR/config/*.php
# ストレージディレクトリのバックアップ
tar -czf $BACKUP_DIR/storage_$DATE.tar.gz \
$APP_DIR/storage/app \
$APP_DIR/storage/framework
# バックアップの暗号化(オプション)
gpg -e -r admin@example.com $BACKUP_DIR/config_$DATE.tar.gz
2. 復旧手順の文書化
システム復旧チェックリスト:
1. データベースの復元
bash
gunzip < backup.sql.gz | mysql -u user -p database_name
2. アプリケーションファイルの復元
bash
tar -xzf config_backup.tar.gz -C /var/www/laravel
tar -xzf storage_backup.tar.gz -C /var/www/laravel
3. パーミッションの再設定
bash
sudo chown -R www-data:www-data /var/www/laravel
sudo chmod -R 755 /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage
4. キャッシュのクリア
bash
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
5. サービスの再起動
bash
sudo systemctl restart php8.2-fpm
sudo systemctl restart nginx
``` ### 継続的なセキュリティ対策 #### 1. 自動セキュリティ監査の実装 **セキュリティチェックスクリプト:**
bash
!/bin/bash
/usr/local/bin/security-check.sh
ファイルパーミッションの確認
find /var/www/laravel -type f -perm /o+w -ls > /var/log/security/file_perms.log
不正なプロセスの確認
ps aux | grep -i “suspicious” > /var/log/security/processes.log
不正なネットワーク接続の確認
netstat -tupln | grep ESTABLISHED > /var/log/security/connections.log
失敗したログイン試行の確認
grep “Failed password” /var/log/auth.log > /var/log/security/failed_logins.log
#### 2. セキュリティアップデート管理 **自動アップデートの設定:**
bash
/etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
“${distro_id}:${distro_codename}-security”;
“${distro_id}:${distro_codename}-updates”;
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::Mail “admin@example.com”;
Unattended-Upgrade::MailOnlyOnError “true”;
**Composerパッケージの安全性チェック:**
bash
!/bin/bash
/usr/local/bin/check-composer-security.sh
cd /var/www/laravel
セキュリティ脆弱性のチェック
composer audit
依存パッケージの更新確認
composer outdated –direct
結果をメールで送信
if [ $? -ne 0 ]; then
echo “Security vulnerabilities found” | mail -s “Composer Security Alert” admin@example.com
fi
#### 3. 定期的なセキュリティレビュー項目
markdown
週次レビュー項目:
- エラーログの確認
sudo tail -n 1000 /var/log/nginx/error.log sudo tail -n 1000 /var/log/php8.2-fpm.log
- アクセスパターンの分析
sudo goaccess /var/log/nginx/access.log
- ファイルシステムの整合性確認
sudo aide --check
月次レビュー項目:
- SSL証明書の有効期限確認
- ファイアウォールルールの見直し
- ユーザーアカウントと権限の監査
- バックアップの復元テスト
“`
これらのベストプラクティスを実装することで、安定した本番環境の運用が可能になります。ただし、これらの設定は環境や要件に応じて適切にカスタマイズする必要があります。また、定期的な見直しと更新を行い、新しいセキュリティ脅威や運用課題に対応することが重要です。