Перейти к основному содержимому

Настройка Nginx

Полное руководство по настройке Nginx для FeedbackPulse SaaS.


Предварительные требования

  • 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;

# Перезапись URL для Laravel
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;

# Перезапись URL для Laravel
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;
}

# Запретить доступ к скрытым файлам (кроме .well-known для ACME)
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;
}

Поддержка wildcard-поддоменов

Для поддоменов арендаторов вида acme.yourdomain.com:

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

# Использовать wildcard 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;
}

Требуется: Wildcard-запись DNS и wildcard SSL-сертификат. Смотрите Настройка Wildcard DNS.


Настройка PHP-FPM

Оптимизируйте PHP-FPM для FeedbackPulse:

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. Создайте веб-приложение → выберите «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.
404 на всех маршрутахОтсутствует try_files $uri $uri/ /index.php?$query_string; в блоке location.
413 Request Entity Too LargeУвеличьте client_max_body_size (по умолчанию 1M).
«File not found»Проверьте, что root указывает на директорию public/ и что $realpath_root используется в SCRIPT_FILENAME.
Белая страницаПроверьте storage/logs/laravel.log и /var/log/nginx/feedbackpulse-error.log.

Следующие шаги