Развертывание приложения Laravel на Nginx в Ubuntu 16.04

Laravel – один из самых популярных фреймворков веб-приложений с открытым исходным кодом, написанный на PHP. Он позволяет разработчикам создавать различные приложения, упростив рутинные задачи приложений (например, кэширование и аутентификацию).

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

Примечание: В руководстве рассказывается о развертывании готового приложения.

Требования

  • Сервер Ubuntu 16.04 с пользователем sudo и настроенным брандмауэром (читайте руководство по начальной настройке).
  • Стек LEMP (установить его поможет этот мануал).
  • Доменное имя (в руководстве используется условное доменное имя example.com). Оно необходимо, чтобы получить сертификат SSL.

1: Установка зависимостей

Для работы приложений Laravel вам понадобятся некоторые расширения PHP и менеджер зависимостей PHP под названием Composer.

Обновите индекс пакетов:

sudo apt-get update

Вам понадобятся расширения PHP для поддержки многобайтовых строк и XML. Вы можете установить эти расширения, Composer и unzip (для обработки ZIP-файлов) одновременно.

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

2: Настройка MySQL

Laravel поддерживает множество серверов баз данных. В данном случае используется MySQL.

В установке по умолчанию MySQL создает только учетную запись администратора root. Поскольку root имеет неограниченные привилегии на сервере базы данных, использовать его на сайте очень опасно. Вместо этого лучше создать специального пользователя базы данных для приложения Laravel, а также новую базу данных, доступ к которой будет у пользователя Laravel.

Войдите в MySQL как root.

mysql -u root -p

Введите root-пароль MySQL.

Создайте БД laravel, которую сможет использовать ваш сайт.

CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Затем создайте пользователя для этой БД. В руководстве он называется laraveluser; выберите любое другое имя. Вместо password укажите надежный пароль.

GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

Сбросьте привилегии:

FLUSH PRIVILEGES;

Закройте MySQL.

EXIT

3: Настройка демо-приложения

Приложение quickstart, распространяемое Laravel на GitHub, представляет собой простой список задач. Оно позволяет добавлять и удалять ненужные элементы и сохранять свои задачи в базе данных MySQL.

Создайте каталог для приложения. Например:

sudo mkdir -p /var/www/html/quickstart

Передайте права на новый каталог своему пользователю, чтобы работать с файлами в каталоге без sudo.

sudo chown 8host:8host /var/www/html/quickstart

Перейдите в новый каталог и клонируйте приложение с помощью Git.

cd /var/www/html/quickstart
git clone https://github.com/laravel/quickstart-basic .

Git загрузит все файлы из репозитория демо-приложения. Вывод выглядит так:

Cloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.

Затем нужно установить зависимости проекта. Laravel использует Composer для управления зависимостями, что упрощает установку необходимых пакетов.

composer install

Вывод покажет ход установки всех зависимостей проекта:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
. . .
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader

Приложение настроено, следующий шаг – настройка среды приложения. Это включает в себя настройку взаимодействия приложения и базы данных и отладку некоторых параметров производства.

4: Настройка среды приложения

На этом этапе нужно изменить некоторые параметры приложения, связанные с безопасностью, настроить взаимодействие приложения с БД и подготовить базу данных. Это необходимо всем приложениям Laravel на стеке LEMP.

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

sudo nano /var/www/html/quickstart/.env

Отредактируйте следующие значения в файле:

APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com
DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password
. . .

Сохраните и закройте файл.

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

Раздел настроек приложения:

  • Переменная APP_ENV определяет среду, в которой работает приложение. Значение по умолчанию – local, которое определяет локальную среду разработки. Чтобы развернуть приложение в среде производства, нужно указать здесь значение production. Эта переменная управляет объемом логов, настройками кэширования и отображением ошибок (в зависимости от приложения). Со значением local она упрощает разработку и отладку, что удобно на этапе разработки, но не должно использоваться в производственной среде.
  • Переменная APP_DEBUG дополняет APP_ENV и явно включает или отключает отладочную информацию и подробное отображение ошибок. В среде производства она должна иметь значение false, чтобы конечные пользователи не получили доступ к информации отладки.
  • Переменная APP_URL указывает IP-адрес или доменное имя сайта. Вместо example.com укажите свой домен.

Настройки БД:

  • DB_DATABASE – это имя базы данных.
  • DB_USERNAME – это имя пользователя MySQL, которого должно использовать приложение.
  • DB_PASSWORD – это пароль этого пользователя.

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

php artisan migrate

Приложение попросит подтвердить запуск в среде производства. Введите y.

**************************************
*     Application In Production!     *
**************************************
Do you really wish to run this command? [y/N] (yes/no) [no]:
> y
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_10_27_141258_create_tasks_table

5: Настройка Nginx

Каталог приложения принадлежит системному пользователю 8host и доступен только для чтения. Так должно быть с большинством файлов приложений, но есть несколько каталогов, которые должны быть доступны веб-серверу. Веб-сервер должен иметь право на запись во всех каталогах, где Laravel сохраняет загруженные и кэшированные данные.

Передайте каталоги storage и bootstrap/cache группе www-data:

sudo chgrp -R www-data storage bootstrap/cache

И передайте права на чтение и запись этой группе:

sudo chmod -R ug+rwx storage bootstrap/cache

Теперь у вас есть все файлы демо-приложения с соответствующими правами. Затем нужно изменить параметры Nginx, чтобы веб-сервер правильно взаимодействовал с установкой Laravel. Создайте новый конфигурационный файл сервера для приложения, скопировав файл по умолчанию.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Откройте новый файл.

sudo nano /etc/nginx/sites-enabled/example.com

В него нужно внести следующие изменения:

  • Удалить значение default_server из директивы listen.
  • Отредактировать директиву root.
  • Обновить директиву server_name и указать в ней доменное имя.
  • Обновить URI запроса в директиве try_files.

В результате настройки Nginx будут выглядеть так:

server {
listen 80;
listen [::]:80;
. . .
root /var/www/html/quickstart/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
. . .
}

Рассмотрим их подробнее:

  • Директива listen по умолчанию включает опцию default_server, которая указывает, что блок server должен обслуживать запрос, если никакой другой блок server не подходит. Эту опцию можно включить только в одном из активных блоков server. Поскольку опция default_server уже включена в блоке по умолчанию, удалите ее из этого файла.
  • Директива root определяет, где хранятся файлы приложений. Приложение Laravel хранится в /var/www/html/quickstart, но доступным из интернета должен быть только подкаталог /public. Все другие файлы приложений вообще не должны быть доступны через браузер. Укажите в root каталог /var/www/html/quickstart/public.
  • Директива server_name содержит список доменных имен, на которые будет отвечать блок server. В руководстве используются домены example.com и www.example.com. Вы должны заменить их доменом своего веб-сайта.
  • Также нужно изменить обработку запросов URI. Согласно настойкам по умолчанию веб-сервер должен найти существующий файл, затем существующий каталог, или выдать ошибку 404 Not Found (с помощью встроенной настройки =404). Чтобы приложение Laravel работало правильно, все запросы должны быть перенаправлены на Laravel. Нужно удалить обработчик ошибок Nginx по умолчанию 404 и установить строку /index.php?$query_string, которая передает запросы в файл index.php, основной файл приложения Laravel.

Сохраните и закройте файл.

Чтобы включить новые настройки, создайте символьную ссылку в каталоге sites-enabled.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Перезапустите Nginx.

sudo systemctl reload nginx

Теперь Nginx будет обслуживать приложение Laravel.

Убедитесь, что все работает. Просто посетите http://example.com в браузере. Вы увидите страницу с простым приложением и сможете попробовать добавить или удалить задачи. Все внесенные изменения будут сохранены в базе данных и появятся на сайте при последующем посещении. Вы можете проверить это, закрыв и снова открыв сайт.

6: Защита приложения по TLS

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

Let’s Encrypt – это бесплатный центр сертификации TLS.

Чтобы получить сертификат для нового приложения, следуйте руководству Создание сертификата Let’s Encrypt для Nginx в Ubuntu 16.04. Следуя этому руководству, не забудьте поправить следующие данные:

  • Вместо стандартного корневого каталога сайта (/var/www/html) укажите корневой каталог приложения Laravel (/var/www/html/quickstart).
  • Отредактируйте файл /etc/nginx/sites-available/example.com, а не стандартный блок server.

Получить сертификаты можно с помощью этой команды:

sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

Файл /etc/nginx/sites-available/example.com в результате должен выглядеть так:

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /var/www/html/quickstart/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /.well-known {
allow all;
}
}

Убедитесь, что в синтаксисе нет ошибок:

sudo nginx -t

Если ошибок нет, команда выведет:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапустите Nginx:

sudo systemctl restart nginx

Теперь приложение будет доступно через безопасное соединение. Чтобы убедиться, что все работает должным образом, просто посетите https://example.com. Вы увидите ту же страницу, что и раньше, но на этот раз соединение будет полностью защищено.

Заключение

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

Tags: , , ,