Настройка Apache для Laravel: от локальной среды до продакшена

Полное руководство по настройке веб-сервера для разработки, тестирования и продакшен окружения.

Правильная конфигурация веб-сервера — критический шаг при развёртывании любого Laravel-приложения. В отличие от встроенного сервера php artisan serve, веб-сервер, такой как Apache, требует точной настройки для корректной работы маршрутизации, обработки статических файлов и обеспечения безопасности. В этом руководстве я систематизирую процесс настройки Apache для Laravel. Вы получите единый подход, который работает от локальной машины до продакшена.

Как Laravel работает с Apache

Эффективная настройка начинается с понимания архитектуры. Laravel построен по модели фронт-контроллера: все HTTP-запросы должны изначально попадать в единственную точку входа — файл public/index.php. Этот файл инициализирует фреймворк, который уже далее определяет логику обработки через маршруты и контроллеры.

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

Стандартный файл public/.htaccess в Laravel содержит набор инструкций для mod_rewrite, которые перенаправляют все запросы, не ведущие к реально существующему файлу или папке, на index.php. Этот файл — лишь отправная точка для тонкой настройки Apache. С помощью .htaccess можно решать множество других задач: повышать безопасность, управлять кешированием, настраивать редиректы и кастомизировать страницы ошибок. Подробный сборник практических примеров и готовых решений для .htaccess поможет глубже настроить ваше приложение.

Для реализации этого правила Laravel использует два взаимосвязанных механизма Apache:

  1. Модуль mod_rewrite. Это движок перенаправления, который позволяет динамически переписывать URL-адреса. Он должен быть глобально активирован на сервере.
  2. Файл .htaccess. Содержит конкретные правила перенаправления для директории, в которой находится.

Работа этой связки — основа корректной работы маршрутизации Laravel. Без активированного mod_rewrite или с запретом на чтение .htaccess все маршруты, кроме корневого, будут возвращать ошибку 404.

Настройка локальной среды разработки

Настройка локального Apache — наиболее безопасный и рекомендуемый способ начать работу. Она позволяет получить рабочее окружение, полностью соответствующее будущему продакшен-серверу, но на личной машине.

Подготовка Apache

Перед созданием виртуального хоста необходимо проверить две глобальные настройки локального сервера Apache.

  1. Активация модуля mod_rewrite.

    • На Debian, Ubuntu и их производных используется команда:

      sudo a2enmod rewrite
      sudo a2enmod env # Важно для передачи переменных окружения в Laravel
    • На системах, основанных на RHEL (CentOS, Fedora), модуль mod-rewrite обычно уже включён. Если нет, его необходимо добавить в основной конфигурационный файл (/etc/httpd/conf/httpd.conf или /etc/httpd/conf.modules.d/*.conf).

    • После активации модуля сервер Apache необходимо перезагрузить: sudo systemctl reload apache2 (Debian/Ubuntu) или sudo systemctl reload httpd (RHEL).

  2. Разрешение использования .htaccess.

    Требуется указать Apache учитывать правила в файлах .htaccess для директории с проектом. Для этого в основном конфигурационном файле Apache (например, /etc/apache2/apache2.conf или /etc/httpd/conf/httpd.conf) нужно найти или добавить блок <Directory>, указывающий на путь к проекту Laravel, и установить для него директиву AllowOverride All.

    <Directory /путь/к/вашему/laravel-проекту/public>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    </Directory>

    После внесения изменений конфигурацию сервера также необходимо перезагрузить.

Создание виртуального хоста

Использование домена вида myapp.test вместо localhost/project/public значительно упрощает разработку.

  1. Создание конфигурационного файла виртуального хоста.

    В системах Debian/Ubuntu новый файл создаётся в директории /etc/apache2/sites-available/, например, myapp.test.conf. В него помещается следующая минимальная конфигурация:

    <VirtualHost *:80>
    ServerName myapp.test
    DocumentRoot /путь/к/вашему/laravel-проекту/public

    <Directory /путь/к/вашему/laravel-проекту/public>
    AllowOverride All
    Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/myapp_error.log
    CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
    </VirtualHost>
  2. Активация сайта и обновление hosts-файла.

    • На Debian/Ubuntu сайт активируется командой sudo a2ensite myapp.test.conf с последующей перезагрузкой Apache.

    • Чтобы домен myapp.test указывал на локальную машину, необходимо добавить запись в системный файл hosts:

      127.0.0.1   myapp.test
      • Linux/macOS: /etc/hosts
      • Windows: C:\Windows\System32\drivers\etc\hosts

    После перезагрузки Apache и браузера приложение должно стать доступно по адресу http://myapp.test. Чтобы организовать полностью валидное HTTPS-соединение в локальной среде (с «зелёным замочком» в браузере) без предупреждений безопасности, используйте инструмент mkcert. Подробное руководство по его настройке поможет сделать это за несколько минут.

  3. Проверка и отладка типовых проблем

    Если приложение не загружается или маршруты не работают, стоит проверить следующее:

    • Синтаксис конфигурационных файлов Apache. Проверить можно командой sudo apache2ctl configtest или sudo httpd -t.
    • Права доступа к файлам. Веб-сервер (пользователь www-data или apache) должен иметь право на чтение всех файлов в директории проекта.
    • Кэш конфигурации Laravel. После изменения путей может потребоваться очистка кэша: php artisan config:cache.
    • Логи ошибок. Основной источник информации при отладке — файлы логов Apache (/var/log/apache2/ или /var/log/httpd/) и Laravel (storage/logs/laravel.log).

Перенос проекта на рабочий сервер

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

Базовая конфигурация: повторение успешной схемы

Алгоритм действий на сервере (VPS или выделенном) повторяет шаги из локальной настройки, но с учётом серверного окружения.

  1. Подготовка сервера. Устанавливаются необходимые пакеты: Apache, PHP с требуемыми расширениями (включая php-fpm для часто используемой связки Apache + PHP-FPM), Composer.
  2. Настройка базовых модулей Apache. Активируются модули mod_rewrite, mod_ssl (для HTTPS), а также mod_proxy_fcgi и mod_setenvif, если используется PHP-FPM. Команды аналогичны локальным, но могут отличаться в зависимости от дистрибутива сервера (Debian/Ubuntu, CentOS/RHEL).
  3. Размещение кода приложения. Код проекта размещается в директории, отличной от системной корневой веб-директории, например, /var/www/laravel-app/. Права доступа налагаются строго: владелец — пользователь для развёртывания (например, deploy), группа — веб-сервер (например, www-data).
  4. Создание виртуального хоста для HTTP. Создаётся файл конфигурации (например, /etc/apache2/sites-available/laravel-app.conf), структурно идентичный локальному, но с актуальными путями и доменным именем. После активации сайта и перезагрузки Apache приложение должно стать доступно по HTTP. Активируйте его командой sudo a2ensite laravel-app.conf и перезагрузите Apache (sudo systemctl reload apache2).

Принудительное использование HTTPS

Работа приложения по незашифрованному HTTP в продакшене неприемлема. Настройка HTTPS состоит из двух ключевых частей.

  1. Настройка виртуального хоста для HTTPS. Создаётся конфигурация для порта 443, аналогичная HTTP-хосту, но с добавлением директив для SSL.

    <VirtualHost *:443>
    ServerName your-domain.com
    # ... DocumentRoot и Directory (как в HTTP1-конфиге) ...

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/your-domain.crt
    SSLCertificateKeyFile /etc/ssl/private/your-domain.key
    # Для лучшей безопасности рекомендуется также указать цепочку сертификатов (SSLCertificateChainFile)

    # Дополнительные настройки безопасности (протоколы, шифры)
    # Современные безопасные настройки с приоритетом Forward Secrecy
    SSLProtocol TLSv1.2 TLSv1.3
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder off
    SSLSessionTickets off # Отключает TLS session tickets для предотвращения атак на возобновление сессий. Может вызвать проблемы с балансировщиками нагрузки или некоторыми клиентами.

    # Для совместимости со старыми клиентами можно использовать:
    # SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384

    ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    </VirtualHost>
  2. Настройка редиректа всего HTTP-трафика на HTTPS. Это критически важный шаг для безопасности. В конфигурации виртуального хоста для порта 80 (HTTP) добавляются правила перенаправления.

    <VirtualHost *:80>
    ServerName your-domain.com
    # Редирект всех запросов на HTTPS-версию
    Redirect permanent / https://your-domain.com/
    </VirtualHost>

Использование TLS 1.3 значительно повышает безопасность и скорость установки соединения. Подробное руководство по его активации в Apache для различных дистрибутивов доступно в отдельной статье.

Финальный чек-лист перед запуском

Перед открытием доступа к приложению необходимо проверить:

  1. Права доступа к системным директориям Laravel. Веб-сервер должен иметь права на запись в storage/ и bootstrap/cache/. Рекомендуемые команды:

    # Установите владельца и группу (замените 'www-data' на пользователя вашего веб-сервера)
    sudo chown -R www-data:www-data storage bootstrap/cache

    # Установите корректные права (владелец и группа - чтение/запись/выполнение, остальные - только чтение/выполнение)
    sudo chmod -R 775 storage bootstrap/cache

    # Альтернативный, более безопасный вариант:
    sudo chmod -R ug+rwx,o+rx storage bootstrap/cache
  2. Корректность настроек в файле .env. Ключевые параметры: APP_URL (должен начинаться с https://), настройки базы данных, драйвера кэша (redis/memcached для продакшена).

  3. Оптимизация производительности выполнена. Запущены команды: php artisan config:cache, php artisan route:cache, php artisan view:cache.

  4. Проверка безопасности маршрутов. Убедиться, что все продакшен-маршруты защищены (например, auth middleware для панели администратора).

  5. Настройка логирования и мониторинга. Проверены пути к логам Apache и Laravel, рассмотрена настройка внешнего мониторинга (например, Sentry).

  6. Тестирование отказоустойчивости. Проверена работа приложения при отключении сервисов (база данных, кэш), протестирован процесс деплоя без даунтайма.

После прохождения чек-листа и окончательного тестирования приложение готово к работе в продакшен-режиме.

Решение сложных задач развёртывания

На практике часто возникают сценарии, выходящие за рамки базовой настройки «один домен — одно приложение». Конфигурация Apache гибка и позволяет решать эти задачи без изменения кода Laravel.

Размещение нескольких приложений на одном сервере

Экономически эффективный подход, когда несколько независимых проектов работают на одном физическом или виртуальном сервере. Реализуется через создание отдельных виртуальных хостов для каждого домена или субдомена.

Пример конфигурации для двух приложений в одном файле (/etc/apache2/sites-available/multiple-apps.conf):

# Первое приложение: CRM
<VirtualHost *:80>
ServerName crm.example.com
DocumentRoot /var/www/crm.example.com/public

<Directory /var/www/crm.example.com/public>
AllowOverride All
Require all granted
</Directory>
# Директивы для логирования (ErrorLog, CustomLog) для каждого приложения свои
</VirtualHost>

# Второе приложение: Интернет-магазин
<VirtualHost *:80>
ServerName shop.example.com
DocumentRoot /var/www/shop.example.com/public

<Directory /var/www/shop.example.com/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

Важные моменты:

Интеграция Laravel в поддиректорию существующего сайта

Ситуация, когда Laravel-приложение (например, блог или панель управления) должно работать не на отдельном домене, а как часть основного сайта по пути вроде example.com/admin или example.com/blog.

Оптимальное решение — использование директивы Alias в виртуальном хосте основного сайта:

<VirtualHost *:80>
ServerName example.com
# Корневая директория основного сайта (может быть статичным HTML или другим приложением)
DocumentRoot /var/www/main-site/public

# Сопоставление пути "/app" с публичной директорией Laravel
Alias /app "/var/www/laravel-app/public"

<Directory "/var/www/laravel-app/public">
AllowOverride All
Require all granted
# Важно: отключаем проверку директорий для алиаса, если требуется
Options FollowSymLinks
</Directory>
</VirtualHost>

Важное замечание для Laravel: При работе в поддиректории необходимо убедиться, что помощники маршрутизации (route(), asset()) генерируют корректные URL. За это отвечает параметр APP_URL в файле .env. Для приведённого примера он должен быть установлен как APP_URL=https://example.com/app.

Запуск на виртуальном хостинге с доступом только к .htaccess

Многие виртуальные (shared) хостинги не предоставляют доступ к конфигурации виртуальных хостов. Единственный инструмент управления — файл .htaccess в корневой директории (public_html/ или www/). В этом случае Laravel можно установить в поддиректорию (например, public_html/laravel/), а с помощью правил в корневом .htaccess — перенаправить все запросы в его публичную папку.

Пример содержимого .htaccess в корне public_html/:

RewriteEngine On

# Перенаправляем все запросы в папку laravel/public/, если они ещё не находятся там
RewriteCond %{REQUEST_URI} !^/laravel/public/
RewriteRule ^(.*)$ laravel/public/$1 [L]

Альтернативный вариант с проверкой существования файлов:

# Если запрос не ведёт к существующему файлу или папке в корне,
# перенаправляем его в папку laravel/public/
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ laravel/public/$1 [L]

Схема работы:

  1. Пользователь запрашивает https://example.com/login.
  2. Файл .htaccess в public_html/ перенаправляет запрос во внутренний путь laravel/public/login (обратите внимание на отсутствие начального слеша — это важно для относительных путей).
  3. Внутренний файл laravel/public/.htaccess (стандартный для Laravel) передаёт запрос login в index.php для обработки маршрутизацией.

Особенности и ограничения:

Часто задаваемые вопросы (FAQ)

Вопросы по настройке и ошибкам

После настройки виртуального хоста получаю ошибку 403 Forbidden. Что делать?

Ошибка 403 обычно связана с правами доступа или настройками директории. Проверьте:

  1. Права доступа: Убедитесь, что веб-сервер (пользователь www-data или apache) имеет права на чтение всех файлов в директории проекта, особенно в папке public/.

  2. Настройки <Directory>: В конфигурации виртуального хоста убедитесь, что для директории public/ установлены директивы:

    Require all granted
    Options FollowSymLinks
  3. Владелец файлов: Файлы не должны принадлежать пользователю root. Исправьте командой:

    sudo chown -R www-data:www-data /путь/к/проекту
Маршруты Laravel возвращают ошибку 404, но главная страница работает. В чем проблема?

Эта проблема почти всегда связана с модулем mod_rewrite. Решение:

  1. Активируйте модуль:

    sudo a2enmod rewrite
    sudo systemctl reload apache2
  2. Проверьте настройки .htaccess: Убедитесь, что в папке public/ существует файл .htaccess со стандартным содержимым Laravel.

  3. Разрешите .htaccess: В конфигурации Apache для директории проекта должно быть:

    AllowOverride All
После настройки HTTPS сайт выдаёт ошибку «Ваше соединение не защищено». Что не так?

Проблема с SSL-сертификатом. Проверьте:

  1. Пути к сертификатам в конфигурации Apache: /etc/ssl/certs/ваш-домен.crt и /etc/ssl/private/ваш-домен.key

  2. Права доступа к приватному ключу (только для чтения владельцем):

    sudo chmod 600 /etc/ssl/private/ваш-домен.key
  3. Цепочку сертификатов: Для некоторых провайдеров нужен промежуточный сертификат. Добавьте директиву:

    SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
Статические файлы (CSS, JS, изображения) не загружаются. Как исправить?

Проблема с путями к статическим файлам. Решения:

  1. Для продакшена: Убедитесь, что в .env установлен корректный APP_URLhttps:// для HTTPS).

  2. Сгенерируйте правильные ссылки: Очистите кэш и перегенерируйте ссылки:

    php artisan config:clear
    php artisan view:clear
  3. Проверьте симлинки: Если используете storage:link, проверьте, что симлинк создан:

    php artisan storage:link
Как проверить, активен ли модуль mod_rewrite?

Есть несколько способов:

  1. Через командную строку:

    apache2ctl -M | grep rewrite   # Debian/Ubuntu
    httpd -M | grep rewrite # RHEL/CentOS
  2. Создайте PHP-файл в корне сайта с содержимым <?php phpinfo(); ?> и найдите раздел «Loaded Modules».

  3. Проверьте наличие файла: На Debian/Ubuntu модуль обычно находится в /etc/apache2/mods-enabled/rewrite.load.

Сессии Laravel не сохраняются или сбрасываются после перезагрузки страницы

Проблема с правами доступа к папке storage/. Решение:

  1. Установите правильные права:

    sudo chown -R www-data:www-data storage/
    sudo chmod -R 775 storage/
  2. Проверьте драйвер сессий в .env: для продакшена лучше использовать redis или memcached вместо file — это важно для масштабирования и производительности.

  3. Очистите кэш приложения:

    php artisan cache:clear

Вопросы по производительности и оптимизации

Использование .htaccess замедляет сайт. Есть ли альтернатива?

Да, для повышения производительности можно перенести правила из .htaccess в основную конфигурацию Apache (<Directory> блок в виртуальном хосте):

<Directory /путь/к/public>
# Вместо AllowOverride All и .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</Directory>

Это избавит Apache от необходимости читать .htaccess при каждом запросе.

Как настроить кэширование статических файлов (CSS, JS, изображений) в Apache?

Добавьте в конфигурацию виртуального хоста:

<IfModule mod_expires.c>
ExpiresActive On
# Кэширование на 1 год
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
</IfModule>

Не забудьте активировать модуль: sudo a2enmod expires.

Вопросы по конкретным сценариям

Нужно ли настраивать что-то в Laravel при переносе с локального сервера на продакшен?

Да, несколько важных изменений:

  1. Файл .env:

    • Установите APP_ENV=production
    • Убедитесь, что APP_DEBUG=false
    • Проверьте APP_URL (должен начинаться с https://)
  2. Настройки кэша: В продакшене всегда используйте:

    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
  3. Оптимизация Composer:

    composer install --optimize-autoloader --no-dev

    Подробнее прочитать об управлении можно в статье Composer: практическое руководство по управлению зависимостями PHP

Как обслуживать несколько Laravel-приложений на одном IP с разными портами?

Создайте виртуальные хосты с разными портами:

# Приложение 1 на порту 8080
<VirtualHost *:8080>
ServerName app1.local
DocumentRoot /var/www/app1/public
# ... остальные настройки
</VirtualHost>

# Приложение 2 на порту 8081
<VirtualHost *:8081>
ServerName app2.local
DocumentRoot /var/www/app2/public
# ... остальные настройки
</VirtualHost>

Добавьте в /etc/apache2/ports.conf:

Listen 8080
Listen 8081
Можно ли использовать Apache вместе с Nginx/Angie для Laravel?

Да, популярная конфигурация — Nginx как обратный прокси перед Apache:

  1. Nginx/Angie обрабатывает статические файлы и SSL
  2. Apache (через php-fpm) обрабатывает PHP-запросы Laravel

Преимущества: Лучшая производительность для статических файлов и более гибкая настройка кэширования в Nginx.

Laravel выдаёт ошибку «No input file specified». В чем причина?

Эта ошибка возникает, когда PHP не может найти index.php. Причины и решения:

  1. Неправильный DocumentRoot: Убедитесь, что он указывает на папку public/.
  2. Проблемы с путями в php.ini: Проверьте директивы doc_root и user_dir.
  3. Ошибка в правилах mod_rewrite: Временно отключите .htaccess, чтобы проверить, работает ли сайт без него.

Вопросы по безопасности

Какие минимальные настройки безопасности Apache для Laravel?

Рекомендуемые настройки:

  1. Скрыть информацию о сервере:

    ServerTokens Prod
    ServerSignature Off
  2. Запретить доступ к dot-файлам (.env, .htaccess, .git и т.д.):

    <FilesMatch "^\.">
    Require all denied
    </FilesMatch>
Как настроить HTTP/2 в Apache для Laravel?

После настройки HTTPS:

  1. Активируйте модуль:

    sudo a2enmod http2
  2. Добавьте в виртуальный хост HTTPS:

    Protocols h2 http/1.1
  3. Проверьте поддержку: Убедитесь, что используемая версия Apache ≥ 2.4.17 и OpenSSL ≥ 1.0.2.

Если ваш вопрос не найден здесь, проверьте логи ошибок:

# Логи Apache
tail -f /var/log/apache2/error.log
# Логи Laravel
tail -f storage/logs/laravel.log

Чаще всего именно в логах содержится точная информация о проблеме.

Заключение

Настройка Apache для работы с Laravel — это системный процесс, основанный на понимании единого принципа: корневая директория документа (DocumentRoot) всегда должна указывать на подкаталог public/ проекта. Этот принцип универсален и применим к любой среде: от локальной машины разработчика до промышленного кластера.

Несмотря на различия в деталях (наличие доступа к конфигурации виртуальных хостов, необходимость SSL, работа в поддиректории), последовательность действий остаётся логичной и предсказуемой: активация mod_rewrite, разрешение .htaccess, корректное указание путей, настройка HTTPS и проверка прав доступа.

Для быстрого обращения ключевые шаги по средам сведены в таблицу:

Среда / ЗадачаКлючевой инструментКритически важная настройкаЧто проверить
Локальная разработкаВиртуальный хостDocumentRoot /путь/проекта/publicЗапись в файле hosts, права на storage/
Рабочий сервер (VPS)Виртуальный хост + SSLРедирект HTTP → HTTPS в хосте *:80Значение APP_URLhttps://), кэш конфигурации. Настройки брандмауэра (открыты ли порты 80/443)
Несколько приложенийНесколько виртуальных хостовУникальный ServerName для каждогоИзоляция путей и логов для каждого проекта
Работа в поддиректорииДиректива AliasAlias /app "/путь/к/public"APP_URL (например, https://site.com/app)
Виртуальный хостингКорневой .htaccessПравило перенаправления в .htaccess (см. пример выше)Отсутствие конфликтов с другими правилами в .htaccess

Следуя этой схеме и уделяя внимание деталям, описанным в руководстве, можно добиться стабильной и безопасной работы Laravel-приложения на сервере Apache в любой требуемой конфигурации.

Полезные ресурсы

Комментарии


Дополнительные материалы

Предыдущая Статья

Управление зависимостями PHP с Composer