Nginx: конфигурация для Laravel с PHP-FPM
Официальная конфигурация Nginx для Laravel приложений с PHP-FPM, поддержкой роутинга и безопасности. Основано на официальной документации Laravel.
Конфигурация Nginx для Laravel приложений с PHP-FPM. Основано на официальной документации Laravel Deployment.
Базовая конфигурация
server {
listen 80;
listen [::]:80;
server_name example.com;
# ВАЖНО: root указывает на директорию public
root /srv/example.com/public;
index index.php;
charset utf-8;
# Заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
access_log /var/log/nginx/laravel-access.log;
error_log /var/log/nginx/laravel-error.log;
# Основной location - все запросы идут через index.php
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Favicon и robots.txt
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
# Обработка PHP - только для index.php
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
# Внутренний редирект для обработки пути
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
# Защита от выполнения PHP в других файлах
location ~ \.php$ {
return 404;
}
# Защита скрытых файлов (кроме .well-known для Let's Encrypt)
location ~ /\.(?!well-known).* {
deny all;
}
# Обработка ошибок через Laravel
error_page 404 /index.php;
}
С поддержкой HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /srv/example.com/public;
index index.php;
charset utf-8;
# SSL сертификаты
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
access_log /var/log/nginx/laravel-access.log;
error_log /var/log/nginx/laravel-error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ \.php$ {
return 404;
}
location ~ /\.(?!well-known).* {
deny all;
}
error_page 404 /index.php;
}
Важные замечания
⚠️ Директория public: root должен указывать на директорию public проекта Laravel, а не на корень проекта. Это критически важно для безопасности.
⚠️ Только index.php: Обработка PHP разрешена только для index.php. Все остальные .php файлы возвращают 404, что предотвращает прямой доступ к файлам приложения.
⚠️ $realpath_root: Использование $realpath_root вместо $document_root обеспечивает корректную работу с символическими ссылками.
⚠️ PATH_INFO: Директива fastcgi_split_path_info и PATH_INFO необходимы для корректной обработки путей в Laravel роутинге.
⚠️ Обработка ошибок: error_page 404 /index.php; позволяет Laravel обрабатывать все 404 ошибки через свой роутер.
Источники: