Как развернуть приложение Laravel с помощью Nginx в Ubuntu 16.04

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

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

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 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 поддерживает множество серверов баз данных. Поскольку в этом руководстве используется стек LE M P, MySQL будет хранить данные для приложения.

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

Войдите в MySQL + root + административная учетная запись.

mysql -u root -p

Вам будет предложено ввести пароль, который вы установили для учетной записи MySQL * root * во время установки.

Начните с создания новой базы данных с именем ++, которую мы будем использовать для веб-сайта. Вы можете выбрать другое имя, но обязательно запомните его, потому что оно понадобится вам позже.

CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Затем создайте нового пользователя, которому будет разрешен доступ к этой базе данных. Здесь мы используем ` в качестве имени пользователя, но вы также можете настроить это. Не забудьте заменить ` в следующей строке на надежный и безопасный пароль.

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

Сбросьте привилегии, чтобы уведомить сервер MySQL об изменениях.

FLUSH PRIVILEGES;

И выйдите из MySQL.

EXIT;

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

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

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

Во-первых, создайте каталог внутри корневого каталога Nginx, в котором будет храниться приложение. Поскольку демонстрационное приложение называется + quickstart +, давайте использовать + / var / www / html / quickstart +.

sudo mkdir -p /var/www/html/

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

sudo chown  /var/www/html/

Перейдите в новый каталог и клонируйте демонстрационное приложение, используя 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 - Настройка среды приложения

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

Откройте файл конфигурации среды Laravel с помощью + nano + или вашего любимого текстового редактора.

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

Вам нужно будет внести следующие изменения в файл. Обязательно обновите переменные-заполнители, такие как ` и `, соответствующими значениями.

/var/www/html/quickstart/.env

APP_ENV=
APP_DEBUG=
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://

DB_HOST=127.0.0.1
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

. . .

Сохраните файл и выйдите.

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

В разделе конфигурации приложения:

  • Переменная + APP_ENV + обозначает системную среду, в которой выполняется приложение. Значением по умолчанию является + local +, которое используется для локальных сред разработки. Для производственного развертывания его следует изменить на «+ production », как мы сделали здесь. + Изменение этой переменной управляет многословностью журнала, настройками кэширования и отображением ошибок (в зависимости от приложения). С настройками ` local +` он настроен для упрощения разработки и отладки, что удобно при работе с приложением, но не должно использоваться в производственных настройках.

  • Переменная + APP_DEBUG + дополняет + APP_ENV + и явно включает или отключает отладочную информацию и подробное отображение ошибок. В производственных настройках это значение должно быть установлено на «+ false +», чтобы предотвратить отображение отладочной информации пользователям.

  • Переменная + APP_URL + указывает IP-адрес или доменное имя, под которым должен быть доступен сайт. Здесь мы использовали имя домена ++, но вы должны заменить его своим собственным доменом, к которому должен получить доступ веб-сайт.

Раздел конфигурации базы данных немного проще:

  • + DB_DATABASE + - это имя базы данных.

  • + DB_USERNAME + - это имя пользователя MySQL, которое должно использовать приложение.

  • + DB_PASSWORD + - пароль базы данных для этого пользователя.

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

php artisan migrate

Artisan попросит подтвердить, намереваемся ли мы запустить его в производственном режиме. Ответь + y + на вопрос. Это будет запускать необходимые задачи базы данных впоследствии.

Artisan output**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] (yes/no) [no]:
>

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. Во-первых, давайте создадим new файл конфигурации блока сервера для нашего приложения, скопировав файл по умолчанию.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/

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

sudo nano /etc/nginx/sites-enabled/

Есть несколько необходимых изменений, которые вы должны будете сделать:

  • Удаление обозначения + default_server + из директив + listen +,

  • Обновление корня сети путем изменения директивы + root +,

  • Обновив директиву + server_name +, чтобы правильно указать доменное имя для сервера,

  • Обновление обработки URI запроса путем изменения директивы + try_files +.

Измененный файл конфигурации Nginx будет выглядеть так:

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

server {
   listen
   listen

   . . .

   root
   index index.php index.html index.htm index.nginx-debian.html;

   server_name  www.;

   location / {
       try_files $uri $uri/
   }

   . . .
}

Давайте объясним эти изменения более подробно.

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

Директива + root + указывает, где хранятся файлы приложения. Приложение Laravel хранится в + / var / www / html / +, но только подкаталог + / public + должен быть доступен для Интернета; все остальные файлы приложения вообще не должны быть доступны через браузер. Чтобы соответствовать этим рекомендациям, мы устанавливаем для корневого веб-узла значение + / var / www / html // public +.

Директива + server_name + определяет список доменных имен, на которые будет отвечать блок сервера. Мы использовали ++ и + www. + Здесь, но вы должны заменить их на доменное имя, которое вы хотите использовать для вашего сайта.

Мы также изменили обработку 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/ /etc/nginx/sites-enabled/

И, наконец, перезагрузите Nginx, чтобы учесть изменения.

sudo systemctl reload nginx

Теперь, когда Nginx настроен для обслуживания демонстрационного приложения Laravel, все компоненты настроены.

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

На следующем и последнем этапе мы настроим шифрование TLS для обслуживания приложения через безопасное соединение.

Шаг 6 - Защита вашего приложения с помощью TLS

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

Let’s Encrypt - это бесплатный центр сертификации, который упрощает добавление TLS на ваш сайт. Чтобы включить HTTPS для только что развернутого приложения, мы будем следовать https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16 -04 Учебное пособие [Как защитить Nginx с Let’s Encrypt на Ubuntu 16.04] с некоторыми небольшими изменениями, чтобы приспособиться к настройке этого конкретного приложения Laravel.

Единственные изменения будут:

  • Использование местоположения приложения Laravel (+ / var / www / html / +) вместо веб-корня по умолчанию (+ / var / www / html +) при запросе сертификата SSL.

  • Изменение файла конфигурации + / etc / nginx / sites-available / + вместо файла блока сервера по умолчанию.

В частности, команда для получения сертификата будет:

sudo certbot certonly --webroot --webroot-path= -d  -d

И финальная версия файла конфигурации + / etc / nginx / sites-available / example.com + будет выглядеть следующим образом

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

server {
       listen 80;
       listen [::]:80;

       server_name  www.;
       return 301 https://$server_name$request_uri;
}

server {
       listen 443 ssl http2;
       listen [::]:443 ssl http2;

       include snippets/ssl-.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  www.;

       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 Encrypt TLS / SSL будет полностью установлен, и приложение будет доступно через защищенное соединение. Чтобы проверить, все ли работает как положено, просто зайдите +: // +. Вы должны увидеть ту же форму заявки, что и раньше, но на этот раз соединение будет полностью защищено.

Заключение

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

Related