メインコンテンツまでスキップ

Nginx 設定

FeedbackPulse SaaS の完全な Nginx セットアップガイドです。


前提条件

  • Nginx 1.18 以上
  • PHP-FPM 8.4 以上
  • SSL 証明書(推奨)

基本サーバーブロック

新しい Nginx 設定を作成します:

sudo nano /etc/nginx/sites-available/feedbackpulse

以下を貼り付けます:

server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

index index.php index.html;

charset utf-8;

# Laravel URL の書き換え
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# PHP 処理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}

# 隠しファイルへのアクセスを拒否
location ~ /\.(?!well-known).* {
deny all;
}

# 静的ファイルのキャッシング
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}

# 最大アップロードサイズ(写真、ロゴ用)
client_max_body_size 20M;

# ログ設定
access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}

サイトを有効化します:

sudo ln -s /etc/nginx/sites-available/feedbackpulse /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default # デフォルトサイトを削除(オプション)
sudo nginx -t # 設定をテスト
sudo systemctl restart nginx

HTTPS サーバーブロック(Let's Encrypt 使用)

# HTTP を HTTPS にリダイレクト
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}

# メイン HTTPS サーバー
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

index index.php index.html;
charset utf-8;

# SSL 設定
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
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;
ssl_prefer_server_ciphers off;

# セキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Laravel URL の書き換え
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# PHP 処理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 300;
}

# 隠しファイルへのアクセスを拒否(ACME の .well-known を除く)
location ~ /\.(?!well-known).* {
deny all;
}

# 静的ファイルのキャッシング
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}

client_max_body_size 20M;

access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}

ワイルドカードサブドメインサポート

acme.yourdomain.com のようなテナントサブドメインを使用する場合:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com *.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

# ワイルドカード SSL 証明書を使用
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

# ... 残りの設定は上記の HTTPS ブロックと同じ ...

index index.php index.html;
charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}

location ~ /\.(?!well-known).* {
deny all;
}

client_max_body_size 20M;
}

必要なもの: ワイルドカード DNS レコード + ワイルドカード SSL 証明書。ワイルドカード DNS セットアップ を参照してください。


PHP-FPM の設定

FeedbackPulse 向けに PHP-FPM を最適化します:

sudo nano /etc/php/8.4/fpm/pool.d/www.conf

主な設定:

; プロセス管理
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500

; タイムアウト
request_terminate_timeout = 300

; アップロード制限
php_admin_value[upload_max_filesize] = 20M
php_admin_value[post_max_size] = 25M
php_admin_value[memory_limit] = 256M

PHP-FPM を再起動します:

sudo systemctl restart php8.4-fpm

Laravel Forge / Ploi / RunCloud

マネージドサーバープロバイダーを使用している場合:

Laravel Forge

  1. ドメイン yourdomain.com で新しいサイトを作成します
  2. Web Directory/public に設定します
  3. コードをデプロイします(Git またはアップロード)
  4. Forge が自動的に Nginx を正しく設定します
  5. 「SSL」タブで SSL を有効化します(Let's Encrypt)

Ploi

  1. 新しいサイトを追加 → ドメインを入力します
  2. ルートを /public に設定します
  3. コードをデプロイします
  4. SSL が自動的に設定されます

RunCloud

  1. Web アプリを作成 → 「PHP」を選択 → ドメインを入力します
  2. パブリックパスを public に設定します
  3. Git またはファイルマネージャー経由でデプロイします
  4. SSL を有効化します

Nginx 設定の確認

# 構文をテスト
sudo nginx -t

# PHP-FPM が動作しているか確認
sudo systemctl status php8.4-fpm

# Nginx が動作しているか確認
sudo systemctl status nginx

# 使用中の PHP-FPM ソケットを確認
ls /var/run/php/

# すべてを再起動
sudo systemctl restart php8.4-fpm nginx

よくある Nginx の問題

問題解決策
502 Bad GatewayPHP-FPM が動作していないか、ソケットパスが間違っています。fastcgi_pass が PHP-FPM ソケットと一致しているか確認してください。
すべてのルートで 404location ブロックに try_files $uri $uri/ /index.php?$query_string; が欠けています。
413 Request Entity Too Largeclient_max_body_size を増やしてください(デフォルトは 1M)。
「File not found」rootpublic/ ディレクトリを指していること、SCRIPT_FILENAME$realpath_root が使用されていることを確認してください。
白いページstorage/logs/laravel.log/var/log/nginx/feedbackpulse-error.log を確認してください。

次のステップ