Введение
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), можно и нужно адаптировать под свою инфраструктуру, внося изменения поэтапно и проверяя конфигурацию после каждого шага.