• DevOps
  • Настройка Nginx для Laravel

    Введение

    Laravel из коробки предполагает, что веб-сервер смотрит строго в папку public.

    Если настроить Nginx неправильно, обычно появляются симптомы:

    • 404 на всех роутах кроме /
    • открывается index.php как файл
    • .env или .git доступны из браузера

    Базовые требования

    Перед началом предполагаем:

    • Nginx установлен
    • PHP-FPM работает (например PHP 8.4)
    • Laravel развернут в /var/www/example
    • публичная директория: /var/www/example/public

    Конфигурация

    Откройте конфигурационный файл сайта:

     1sudo nano /etc/nginx/sites-available/example
    

    Рекомендуемая конфигурация:

    Важно: если сайт уже работает и имеет собственную конфигурацию, не копируйте конфиг целиком.
    Вносите изменения по шагам, чтобы не затереть важные строки (ниже я объясню назначение каждой).
    Также замените example на имя вашего сайта или домена.

     1server {
     2    listen 80;
     3    server_name example.com www.example.com;
     4
     5    root /var/www/example/public;
     6    index index.php;
     7
     8    location / {
     9        try_files $uri $uri/ /index.php?$query_string;
    10    }
    11
    12    location ~ \.php$ {
    13        include snippets/fastcgi-php.conf;
    14        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    15    }
    16
    17    location ~ /\.(?!well-known).* {
    18        deny all;
    19    }
    20}
    

    Проверка конфигурации на ошибки:

     1sudo nginx -t
    

    должно быть:

     1nginx: the configuration file ... syntax is ok
     2nginx: configuration file ... test is successful
    

    Применить изменения:

     1sudo systemctl reload nginx
    

    Права для директорий storage и bootstrap/cache

    Это критически важные директории для Laravel.

     1sudo chmod -R 775 /var/www/example/storage
     2sudo chmod -R 775 /var/www/example/bootstrap/cache
    

    Laravel использует их для:

    • логов (storage/logs)
    • кэша конфигурации
    • кэша роутов и шаблонов
    • временных файлов

    Разбор конфигурации Nginx

    listen 80;

    Значение listen зависит от того, установлен ли SSL, который позволяет использовать HTTPS:
    для HTTP — listen 80;, для HTTPS — listen 443 ssl;.


    server_name example.com www.example.com;

    Домены, для которых применяется этот конфиг.
    Обязательно заменить example.com на имя вашего домена.


    root /var/www/example/public;

    Корневая папка сайта для Nginx.
    Обязательно укажите путь к папке public вашего Laravel-проекта.


    index index.php;

    Файл по умолчанию, если запросили директорию (/).


    location / { ... }

    Блок обработки всех запросов.

    try_files $uri $uri/ /index.php?$query_string;

    Это ключевая строка для работы роутинга в Laravel. Эту строку нельзя менять или упрощать.
    Она определяет, как Nginx обрабатывает запросы: сначала проверяет наличие файла или директории, и если они не существуют — передаёт запрос в index.php, где его обрабатывает Laravel.


    location ~ \.php$ { ... }

    Этот блок отвечает за обработку PHP-файлов через PHP-FPM.
    Его содержимое напрямую зависит от конфигурации сервера: версии PHP, способа подключения и расположения конфигурационных файлов.


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

    Этот блок запрещает доступ к скрытым файлам и директориям, имена которых начинаются с точки (.env, .git, .htaccess и т.п.). Он используется для базовой защиты конфигурационных и служебных файлов и должен присутствовать в продакшене.

    Исключение /.well-known оставлено намеренно — оно требуется для задач вроде выпуска и продления SSL-сертификатов.

    Итог

    Эта конфигурация покрывает базовые требования Laravel-приложения под Nginx и подходит для большинства продакшен-сценариев.
    Ключевые строки, отвечающие за роутинг и безопасность, не стоит менять без понимания их назначения — именно они обеспечивают корректную работу Laravel.

    Все параметры, зависящие от окружения сервера (пути, домены, версия PHP), можно и нужно адаптировать под свою инфраструктуру, внося изменения поэтапно и проверяя конфигурацию после каждого шага.