Развертывание приложения Symfony 4 в производство на LEMP в Ubuntu 18.04

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

В этом мануале вы развернете существующее стандартное приложение Symfony 4 в производство с помощью стека LEMP (Nginx, MySQL и PHP) в Ubuntu 18.04. Nginx – это популярный высокопроизводительный открытый HTTP-сервер с дополнительными функциями, включая поддержку обратного прокси. Он имеет хорошую репутацию и обрабатывает несколько крупнейших и популярных сайтов. Если вы решите развернуть собственное приложение Symfony,  возможно, вам придется самостоятельно выполнить дополнительную настройку в зависимости от структуры вашего приложения.

Требования

1: Создание пользователя и базы данных приложения

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

Чтобы создать БД MySQL для приложения и связанного с ним пользователя, вам необходимо получить доступ к клиенту MySQL с помощью учетной записи root:

mysql -u root -p

Введите свой пароль, который вы использовали при запуске mysql_secure_installation.

Затем создайте БД для приложения:

CREATE DATABASE blog;
Query OK, 1 row affected (0.00 sec)

БД для приложения готова. Теперь вы можете создать пользователя MySQL и предоставить ему доступ к только что созданной базе данных.

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

CREATE USER  'blog-admin'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

В настоящее время пользователь blog-admin не имеет прав доступа к базе данных приложения. Фактически, даже если blog-admin попытается войти в систему со своим паролем, он не сможет получить доступ к оболочке MySQL.

Пользователь должен иметь соответствующие привилегии, чтобы получить доступ к БД или выполнить в ней определенные действия. Используйте следующую команду, чтобы предоставить пользователю blog-admin полный доступ к базе данных blog:

GRANT ALL PRIVILEGES ON blog.* TO 'blog-admin'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Теперь у пользователя blog-admin есть все привилегии для работы в БД blog. Сбросьте привилегии, чтобы обновить параметры СУБД.

FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Теперь у вас есть БД и пользователь со всеми необходимыми привилегиями. Чтобы убедиться, что все работает, выйдите из MySQL:

quit;

И снова войдите в систему, используя учетные данные пользователя MySQL, которого вы только что создали (введите пароль по запросу):

mysql -u blog-admin -p

Убедитесь, что пользователь может получить доступ к базе данных, с помощью команды:

SHOW DATABASES;

Вы увидите таблицу blog в выводе:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog               |
+--------------------+
2 rows in set (0.00 sec)

Теперь можно закрыть MySQL.

quit;

У вашего приложения есть база данных и пользователь со всеми необходимыми правами. Вы можете настроить базовое приложение.

2: Настройка базового приложения

Для простоты работы в этом мануале мы развернем приложение блога, созданное с помощью Symfony. Это приложение позволит аутентифицированному пользователю создавать записи в блоге и сохранять ее в базе данных. Кроме того, пользователь приложения может просматривать все записи и данные, связанные с автором.

Исходный код приложения, которое вы развернете в этом руководстве, можно найти на GitHub. Используйте Git для извлечения исходного кода приложения из GitHub и сохранения его в новом каталоге.

Сначала создайте каталог, который будет служить корневым каталогом для вашего приложения. Выполните следующую команду из консоли, чтобы создать новый каталог по имени symfony-blog:

sudo mkdir -p /var/www/symfony-blog

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

sudo chown 8host:8host /var/www/symfony-blog

Замените 8host именем своего пользователя sudo.

Теперь вы можете перейти в родительский каталог и клонировать приложение на GitHub:

cd /var/www
git clone https://github.com/yemiwebby/symfony-blog.git symfony-blog
Cloning into 'symfony-blog'...
remote: Counting objects: 180, done.
remote: Compressing objects: 100% (122/122), done.
remote: Total 180 (delta 57), reused 164 (delta 41), pack-reused 0
Receiving objects: 100% (180/180), 167.01 KiB | 11.13 MiB/s, done.
Resolving deltas: 100% (57/57), done.

Демо-приложение готово. После этого нужно настроить переменные среды и установить зависимости проекта.

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

Чтобы полностью настроить приложение, вам необходимо установить зависимости проекта и правильно настроить параметры.

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

Symfony должен знать, что вы запускаете приложение в производственной среде. Вы можете настроить среду, создав файл .env, содержащий объявления переменных, или непосредственно создав переменные среды. Поскольку вы также можете использовать файл .env для настройки учетных данных БД для этого приложения, использовать его удобнее. Перейдите в каталог, в котором хранится клонированный проект, и создайте файл .env:

cd symfony-blog
sudo nano .env

Добавьте следующие строки в файл, чтобы настроить сред производства:

APP_ENV=prod
APP_DEBUG=0

APP_ENV – это переменная среды, которая указывает, что приложение находится в рабочем состоянии. APP_DEBUG – это переменная среды, которая указывает, должно ли приложение работать в режиме отладки или нет. На данный момент здесь должно быть значение false.

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

Затем установите расширение PHP, которое приложения Symfony используют для обработки XML:

sudo apt install php7.2-xml

Далее вам нужно установить зависимости проекта, запустите composer install:

cd /var/www/symfony-blog
composer install

Вы успешно настроили переменные среды и установили необходимые зависимости проекта. Далее нужно настроить учетные данные БД.

4: Настройка учетных данных БД

Чтобы получить данные из БД приложения, которую вы создали ранее, вам нужно будет установить и настроить необходимые учетные данные БД из приложения Symfony.

Снова откройте файл .env:

sudo nano .env

Добавьте в файл следующую строку, которая позволит вам легко подключаться и правильно взаимодействовать с базой данных. Вы можете добавить ее сразу после строки APP_DEBUG=0 в файле .env:

...
DATABASE_URL=mysql://blog-admin:password@localhost:3306/blog

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

Теперь вы можете использовать Doctrine для обновления вашей базы данных таблицами из клонированного приложения Github. Запустите эту команду, чтобы сделать это:

php bin/console doctrine:schema:update --force
Updating database schema...
4 queries were executed
[OK] Database schema updated successfully!

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

5: Заполнение базы данных с помощью Doctrine-Fixtures

На данный момент таблицы БД пусты. Вы должны заполнить их, используя doctrine-fixtures. Doctrine-Fixtures не является обязательным условием для приложений Symfony, это нужно только для добавления фиктивных данных в БД вашего приложения.

Выполните следующую команду, чтобы автоматически загрузить тестовые данные, содержащие сведения об авторе и образец записи, в таблицу базы данных блога:

php bin/console doctrine:fixtures:load

Вы получите предупреждение об очистке базы данных. Чтобы продолжить, нажмите Y:

Careful, database will be purged. Do you want to continue y/N ? y
> purging database
> loading App\DataFixtures\ORM\Fixtures

6: Чистка и разогрев кэша

Чтобы приложение загружалось быстрее, когда пользователи отправляют запросы, рекомендуется разогреть кэш во время развертывания. Прогрев кэша генерирует страницы и сохраняет их (это позволяет приложению быстрее отвечать на запросы и не тратить время на создание совершенно новых страниц). К счастью, у Symfony есть команда для очистки кэша, которая также запускает разогрев. Для этого выполните следующую команду:

php bin/console cache:clear
Clearing the cache for the prod environment with debug false
[OK] Cache for the "prod" environment (debug=false) was successfully cleared.

Сейчас пора настроить веб-сервер.

7: Настройка веб-сервера и запуск приложения

Если вы выполнили требования этого мануала, сейчас для обслуживания ваших страниц у вас установлен Nginx, а ваши данные хранит MySQL. Теперь нужно настроить веб-сервер, создав новый блок server для вашего приложения (не меняя блок server по умолчанию).

Откройте новый блок server:

sudo nano /etc/nginx/sites-available/blog

Поместите в файл такие строки. Укажите IP-адрес своего сервера вместо your_server_ip.

server {
listen 80;
listen [::]:80;
server_name blog your_server_ip;
root /var/www/symfony-blog/public;
index index.php;
client_max_body_size 100m;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php {
try_files $uri /index.php =404;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.(?:ht|git|svn) {
deny all;
}
}

Сначала мы указали директивы listen для Nginx, который по умолчанию слушает порт 80, а затем задали в server name IP-адрес сервера. Далее мы используем директивы root, чтобы указать document root проекта. Приложение symfony-blog хранится в /var/www/symfony-blog, но лучше настроить корневой веб-каталог в /var/www/symfony-blog/public, так как только каталог /public должен быть доступен в сети. Директива location в конце файла предназначена для обработки PHP.

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

Примечание: Если вы создали файл example.com в ходе выполнения Установка стека LEMP в Ubuntu 18.04, удалите его из каталога sites-enabled с помощью команды:

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

В противном случае возникнет конфликт с этим новым файлом.

Чтобы включить только что созданный блок server, нужно создать симлинк для нового файла конфигурации из каталога /etc/nginx/sites-available directory в /etc/nginx/sites-enabled с помощью следующей команды:

sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/

Убедитесь, что в новой конфигурации нет ошибок:

sudo nginx -t

Эта команда выведет ошибки в консоль, если они есть. Если ошибок нет, перезагрузте Nginx:

sudo systemctl reload nginx

Это последнее, что было необходимо для успешного развертывания приложения Symfony 4. Вы настроили веб-сервер, создав блок server и правильно установив корневой каталог, это сделает веб-приложение доступным.

Наконец, теперь вы можете запустить и протестировать приложение. Посетите http://your_server_ip в вашем браузере. Вы увидите:

Blog tutorial
A basic description of the blog, built in Symfony
Sample blog post

Заключение

Symfony – это многофункциональная среда веб-разработки, которая предоставляет разработчикам мощные инструменты для создания веб-приложений. Благодаря своей гибкой архитектуре Symfony считается хорошим средством для написания корпоративных приложений. Этапы развертывания базового приложения Symfony могут отличаться в зависимости от настроек, сложности и требований приложения.

В этом мануале вы вручную развернули тестовое приложение Symfony 4 в производство на сервере Ubuntu 18.04 и стеке LEMP. Теперь вы можете применить эти знания для развертывания своего приложения Symfony.

Tags: , , , ,