Как развернуть приложение Laravel с помощью Nginx в Ubuntu 16.04
Laravel — одна из самых популярных платформ веб-приложений с открытым исходным кодом, написанная на PHP. Он призван помочь разработчикам создавать как простые, так и сложные приложения, упрощая часто используемые задачи приложений (такие как кэширование и аутентификация).
В этом руководстве мы развернем простое приложение Laravel с учетом производственной среды, для чего потребуется несколько общих шагов. Например, приложения должны использовать выделенного пользователя базы данных с ограниченным доступом только к необходимым базам данных. Права доступа к файлам должны гарантировать, что только необходимые каталоги и файлы доступны для записи. Следует учитывать настройки приложения, чтобы убедиться, что информация об отладке не отображается для конечного пользователя, что может привести к раскрытию сведений о конфигурации приложения.
Это руководство посвящено развертыванию существующего приложения. Если вместо этого вы хотите узнать о том, как использовать сам фреймворк Laravel, собственная серия Laravel Laravel from Scratch — хорошее место для начала.
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Один сервер Ubuntu 16.04, настроенный с помощью этого руководства по начальной настройке сервера, включая пользователя без полномочий root и брандмауэр.
- Стек LEMP, установленный в соответствии с руководством по Linux, Nginx, MySQL, PHP (стек LEMP) в Ubuntu 16.04.
- Доменное имя, указывающее на ваш сервер, как описано в разделе «Как настроить имя хоста с помощью DigitalOcean». В этом руководстве везде будет использоваться
example.com
. Это необходимо для получения SSL-сертификата для вашего веб-сайта, чтобы вы могли безопасно обслуживать свое приложение с помощью шифрования TLS.
Шаг 1 — Установка зависимостей пакетов
Для запуска приложений Laravel вам понадобятся некоторые расширения PHP и менеджер зависимостей PHP под названием Composer в дополнение к базовому стеку LEMP.
Начните с обновления кеша менеджера пакетов.
- sudo apt-get update
Вам понадобятся расширения PHP для поддержки многобайтовых строк и поддержки XML. Вы можете установить эти расширения, Composer и unzip
(что позволяет Composer обрабатывать zip-файлы) одновременно.
- sudo apt-get install php7.0-mbstring php7.0-xml composer unzip
Теперь, когда зависимости пакета установлены, мы создадим и настроим базу данных MySQL и выделенную учетную запись пользователя для приложения.
Шаг 2 — Настройка MySQL
Laravel поддерживает множество серверов баз данных. Поскольку в этом руководстве используется стек LEMP, MySQL будет хранить данные для приложения.
При установке по умолчанию MySQL создает только корневую административную учетную запись. Использование корневого пользователя базы данных на веб-сайте является плохой практикой безопасности, поскольку он имеет неограниченные привилегии на сервере базы данных. Вместо этого давайте создадим выделенного пользователя базы данных для использования приложением Laravel, а также новую базу данных, к которой пользователю Laravel будет разрешен доступ.
Войдите в административную учетную запись MySQL root
.
- mysql -u root -p
Вам будет предложено ввести пароль, который вы установили для корневой учетной записи MySQL во время установки.
Начните с создания новой базы данных с именем laravel
, которую мы будем использовать для веб-сайта. Вы можете выбрать другое имя, но обязательно запомните его, потому что оно понадобится вам позже.
- CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Затем создайте нового пользователя, которому будет разрешен доступ к этой базе данных. Здесь мы используем laraveluser
в качестве имени пользователя, но вы также можете настроить его. Не забудьте заменить пароль
в следующей строке надежным и безопасным паролем.
- GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';
Сбросьте привилегии, чтобы уведомить сервер MySQL об изменениях.
- FLUSH PRIVILEGES;
И выйти из MySQL.
- EXIT;
Теперь вы настроили выделенную базу данных и учетную запись пользователя для использования Laravel. Компоненты базы данных готовы, поэтому теперь мы настроим демонстрационное приложение.
Шаг 3 — Настройка демонстрационного приложения
Демонстрационное приложение quickstart
, распространяемое Laravel на GitHub, представляет собой простой список задач. Он позволяет добавлять и удалять элементы списка дел и сохраняет свои задачи в базе данных MySQL.
Сначала создайте каталог в корневом каталоге Nginx, в котором будет храниться приложение. Поскольку демонстрационное приложение называется quickstart
, давайте использовать /var/www/html/quickstart
.
- sudo mkdir -p /var/www/html/quickstart
Затем измените владельца вновь созданного каталога на своего пользователя, чтобы вы могли работать с файлами внутри без использования sudo
.
- sudo chown sammy:sammy /var/www/html/quickstart
Перейдите в новый каталог и клонируйте демонстрационное приложение с помощью Git.
- cd /var/www/html/quickstart
- git clone https://github.com/laravel/quickstart-basic .
Git загрузит все файлы из репозитория демонстрационного приложения. Вы увидите вывод, который выглядит следующим образом:
Git outputCloning 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
Несколько длинный вывод покажет ход установки для всех зависимостей проекта:
Composer outputLoading 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 с помощью nano
или вашего любимого текстового редактора.
- sudo nano /var/www/html/quickstart/.env
Вам нужно будет внести следующие изменения в файл. Обязательно обновите переменные-заполнители, такие как password
и example.com
, с соответствующими значениями.
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
Artisan попросит подтвердить, собираемся ли мы запускать его в рабочем режиме. Ответьте y
на вопрос. После этого он будет запускать необходимые задачи базы данных.
Artisan output**************************************
* 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
Теперь у нас полностью установлен и настроен Laravel. Далее нам нужно настроить Nginx для обслуживания приложения.
Шаг 5 — Настройка Nginx
Каталог приложения принадлежит нашему системному пользователю sammy и доступен для чтения, но не для записи веб-сервером. Это справедливо для большинства файлов приложений, но есть несколько каталогов, требующих специальной обработки. В частности, везде, где 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-available/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
, которая указывает, что серверный блок должен обслуживать запрос, если никакой другой серверный блок не подходит. Эта опция может быть включена только для одного из включенных серверных блоков. Поскольку мы оставили блок сервера по умолчанию на месте, мы удалим обозначение default_server
из этого второго файла конфигурации.
Директива root
указывает, где хранятся файлы приложения. Приложение Laravel хранится в /var/www/html/quickstart
, но только подкаталог /public
должен быть доступен в Интернете; все остальные файлы приложения вообще не должны быть доступны через браузер. Чтобы соответствовать этим передовым методам, мы устанавливаем корневой каталог веб-сайта /var/www/html/quickstart/public
.
Директива server_name
указывает список доменных имен, на которые будет отвечать блок сервера. Здесь мы использовали example.com
и www.example.com
, но вы должны заменить их именем домена. вы хотите использовать для своего веб-сайта.
Мы также изменили обработку URI запроса. Настройки по умолчанию говорят веб-серверу найти существующий файл, затем существующий каталог или, наконец, выдать ошибку 404 Not Found (используя встроенную настройку =404
). Чтобы Laravel работал правильно, все запросы должны направляться в сам Laravel. Это означает, что мы удаляем обработчик ошибок 404 Nginx по умолчанию и устанавливаем его на /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
в своем любимом браузере. Вы увидите страницу с простым приложением задач, и вы можете попробовать добавить или удалить задачи. Все внесенные вами изменения будут сохранены в базе данных и сохранены для последующих посещений веб-сайта, в чем вы можете убедиться, закрыв браузер и снова открыв сайт.
На следующем и последнем шаге мы настроим шифрование TLS для обслуживания приложения через безопасное соединение.
Шаг 6 — Защита вашего приложения с помощью TLS
Для завершения производственной настройки рекомендуется обслуживать приложение через безопасный HTTPS с использованием TLS. Это гарантирует, что вся связь между приложением и его посетителями будет зашифрована, что особенно важно, если приложение запрашивает конфиденциальную информацию, такую как логин или пароль.
Как защитить Nginx с помощью Let’s Encrypt в учебнике Ubuntu 16.04 с некоторыми небольшими изменениями, чтобы приспособиться к настройке этого конкретного приложения Laravel.
Единственными изменениями будут:
- Использование местоположения приложения Laravel (
/var/www/html/quickstart
) вместо корневого веб-сайта по умолчанию (/var/www/html
) при запросе SSL-сертификата. - Изменение файла конфигурации
/etc/nginx/sites-available/example.com
вместо файла блока сервера по умолчанию.
В частности, команда для получения сертификата будет следующей:
- 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
Если все изменения были успешными, вы получите результат, который выглядит следующим образом:
Outputnginx: 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
Сертификат Let’s Encrypt TLS/SSL будет полностью установлен, и приложение будет доступно через безопасное соединение. Чтобы убедиться, что все работает должным образом, просто посетите https://example.com
. Вы должны увидеть ту же форму заявки, что и раньше, но на этот раз соединение будет полностью защищено.
Заключение
Теперь вы успешно развернули демонстрационное приложение, поставляемое с Laravel, в рабочую среду, используя стек LEMP. В реальных приложениях список задач настройки может включать больше шагов и действий, специфичных для приложения. Если вы сомневаетесь, всегда обращайтесь к документации приложения, которое вы развертываете, но вы также можете найти много полезной информации в официальной документации Laravel.