NGINX
#nginx#laravel#php-fpm#framework#fastcgi#routing

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 ошибки через свой роутер.

Источники: