Как развернуть приложение Symfony в производственной среде на Ubuntu 14.04

Вступление

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

В этом руководстве рассматриваются шаги, необходимые для ручного развертывания базового приложения Symfony на сервере Ubuntu 14.04. Мы посмотрим, как правильно настроить сервер с учетом мер безопасности и производительности, чтобы выполнить настройку, готовую к работе.

Если вы ищете вводное руководство по Symfony, вы можете прочитать https://www.digitalocean.com/community/tutorials/how-to-install-and-get-started-with-symfony-2-on-ubuntu- 14-04 [как установить и начать работать с Symfony в Ubuntu 14.04].

Предпосылки

Для этого урока вам понадобятся:

  • Свежая капля Ubuntu 14.04, запущенная по адресу LAMP или https : //www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 [LEMP]

  • Пользователь без полномочий root, который вы можете настроить, следуя учебному руководству Initial Server Setup

Важно помнить, что развертывание является очень обширной темой, поскольку у каждого приложения будут свои особые потребности. Для простоты мы будем использовать пример приложения, созданного с помощью Symfony. Вы можете найти его исходный код на GitHub.

Шаг 1 - Установка зависимостей сервера

На этом этапе мы установим зависимости сервера.

Начните с обновления кеша менеджера пакетов.

sudo apt-get update

Нам понадобится + git + для проверки файлов приложения, + acl + для установки правильных прав доступа к каталогу при установке приложения и два расширения PHP (+ php5-cli + для запуска PHP в командной строке и ` + php5-curl + `для Symfony). Установите необходимые пакеты.

sudo apt-get install git php5-cli php5-curl acl

Наконец, нам понадобится + composer + для загрузки зависимостей приложения. Чтобы установить + composer + для всей системы, запустите:

sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Теперь вы должны быть готовы к работе.

Шаг 2 - Настройка MySQL

Давайте начнем с подготовки вашей установки MySQL к работе. Для следующего шага вам понадобится пароль для учетной записи * root * MySQL. Убедитесь, что вы настроили MySQL безопасно (как подробно описано в шаге 2 https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on -ubuntu-14-04 # step-two-% E2% 80% 94-install-mysql [LAMP] и https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql -php-lemp-stack-on-ubuntu-14-04 # шаги-два-% E2% 80% 94 руководства по установке-mysql-to-manage-site-data [LEMP]).

Установка параметров сортировки и кодировки по умолчанию

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

Откройте файл + / etc / mysql / my.cnf + в вашем любимом редакторе командной строки.

sudo nano /etc/mysql/my.cnf

Теперь найдите блок * [mysqld] *. Добавьте параметры + collation-server + и + набор символов-сервера + в разделе * Основные настройки *.

/etc/mysql/my.cnf

[mysqld]
#
# * Basic Settings
#


user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock

. . .

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

sudo service mysql restart

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

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

Сначала войдите в клиент MySQL, используя учетную запись MySQL * root *.

mysql -u root -p

Вам будет предложено ввести пароль. Это должен быть тот же пароль, который вы использовали при запуске + mysql_secure_installation +.

Теперь создайте базу данных приложения.

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

База данных создана. Следующим шагом является создание пользователей MySQL и предоставление им доступа к нашей вновь созданной базе данных.

CREATE USER ''@'localhost' IDENTIFIED BY '';
OutputQuery OK, 0 rows affected (0.00 sec)

Это создаст пользователя с именем * todo-user *, с паролем * todo-password *. Важно отметить, что это простые примерные значения, которые необходимо изменить, и вы должны использовать более сложный пароль для своего пользователя MySQL для повышения безопасности.

Нам все еще нужно предоставить этому пользователю права доступа к нашей базе данных приложений. Это можно сделать с помощью:

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

Это предоставит пользователю * todo-user * все привилегии для всех таблиц в базе данных + todo +. Чтобы применить изменения, запустите:

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

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

quit;

Теперь снова войдите в систему, на этот раз, используя только что созданного пользователя и пароль MySQL. В этом примере мы используем имя пользователя * todo-user * с паролем * todo-password *.

mysql -u  -p

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

SHOW DATABASES;

Вывод должен выглядеть так:

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

Это означает, что новый пользователь был успешно создан с нужными привилегиями. Вы должны увидеть только две базы данных: + information_schema + и + todo +.

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

quit;

Шаг 3 - Проверка кода приложения

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

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

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

Мы собираемся использовать Git для проверки кода приложения. Следующим шагом является выбор места, которое будет служить корневым каталогом нашего приложения. Позже мы настроим веб-сервер соответственно. В этом уроке мы будем использовать + / var / www / todo-symfony +, поэтому создайте этот каталог сейчас.

sudo mkdir -p /var/www/

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

sudo chown  /var/www/

Теперь перейдите в родительский каталог и клонируйте приложение.

cd /var/www
git clone
OutputCloning into 'todo-symfony'...
remote: Counting objects: 76, done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 76 (delta 6), reused 76 (delta 6), pack-reused 0
Unpacking objects: 100% (76/76), done.
Checking connectivity... done.

Шаг 4 - Исправление разрешений папки

Файлы приложения теперь расположены в + / var / www / todo-symfony +, каталоге, принадлежащем нашей system user (в этом руководстве мы используем * sammy * в качестве примера). Тем не менее, web server user (обычно * www-data *) также нуждается в доступе к этим файлам. В противном случае веб-сервер не сможет обслуживать приложение. Кроме того, есть две директории, которые требуют специального соглашения о разрешениях: + app / cache и` + app / logs`. Эти каталоги должны быть доступны для записи как пользователю системы, так и пользователю веб-сервера.

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

Во-первых, нам нужно разрешить пользователю * www-data * доступ к файлам внутри папки приложения. Дайте этому пользователю разрешение read + execute (rX) во всем каталоге.

sudo setfacl -R -m u:www-data:rX

Далее нам нужно установить специальные разрешения для папок + cache и` + log`. Предоставьте права доступа read + write + execute (rwX) пользователю * www-data *, чтобы веб-сервер мог выполнять запись только в эти каталоги.

sudo setfacl -R -m u:www-data:rwX /app/cache /app/logs

Наконец, мы определим, что все новые файлы, созданные в папках + app / cache + и + app / logs +, следуют той же схеме разрешений, которую мы только что определили, с разрешениями на чтение, запись и выполнение для пользователя веб-сервера. Это можно сделать, повторив команду + setfacl +, которую мы только что выполнили, но на этот раз добавив параметр + -d +.

sudo setfacl -dR -m u:www-data:rwX /app/cache /app/logs

Если вы хотите проверить, какие разрешения в данный момент имеются в данном каталоге, вы можете использовать + getfacl +.

getfacl /app/cache

Вы должны получить вывод, похожий на этот:

Output# file: todo-symfony/app/cache
# owner: sammy
# group: sammy
user::rwx
user:www-data:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Из этого вывода видно, что, хотя каталог + app / cache + принадлежит пользователю * sammy *, для пользователя * www-data * существует дополнительный набор разрешений. Директивы по умолчанию показывают, какие разрешения будут иметь новые файлы, созданные в этом каталоге.

Шаг 5 - Настройка приложения

Теперь у нас есть файлы приложения, но нам все еще нужно установить зависимости проекта и настроить параметры приложения.

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

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

export SYMFONY_ENV=prod

Далее нам нужно установить зависимости проекта. Откройте папку с приложением и запустите + composer install.

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

В конце процесса установки вам будет предложено предоставить некоторую информацию, которая будет заполнять файл + parameters.yml +. Этот файл содержит важную информацию для приложения, например настройки подключения к базе данных. Вы можете нажать + ENTER +, чтобы принять значения по умолчанию для всех из них, кроме имени базы данных, имени пользователя и пароля. Для них используйте значения, которые вы создали в ссылке: # step-2-% E2% 80% 94-configure-mysql [шаг 2].

OutputCreating the "app/config/parameters.yml" file
Some parameters are missing. Please provide them.
database_host (127.0.0.1):
database_port (null):
database_name (symfony):
database_user (root):
database_password (null):
. . .

Когда установка завершится, мы можем проверить соединение с базой данных с помощью консольной команды + doctrine: schema: validate +.

php app/console doctrine:schema:validate
Output[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

Строка OK означает, что соединение с базой данных работает. Строка FAIL ожидается, потому что мы еще не создали схему базы данных, поэтому давайте сделаем это следующим образом:

php app/console doctrine:schema:create
OutputATTENTION: This operation should not be executed in a production environment.

Creating database schema...
Database schema created successfully!

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

Теперь вы должны очистить кеш.

php app/console cache:clear --env=prod --no-debug
OutputClearing the cache for the prod environment with debug false

И, наконец, генерировать активы приложения.

php app/console assetic:dump --env=prod --no-debug
OutputDumping all prod assets.
Debug mode is off.

14:02:39 [file+] /var/www/todo-symfony/app/../web/css/app.css
14:02:39 [dir+] /var/www/todo-symfony/app/../web/js
14:02:39 [file+] /var/www/todo-symfony/app/../web/js/app.js

Шаг 6 - Настройка веб-сервера

Осталось только настроить веб-сервер. Это будет состоять из 2 шагов: установка директивы + date.timezone в` + php.ini` и обновление файла конфигурации веб-сайта по умолчанию (в Apache или Nginx) для обслуживания нашего приложения.

Мы увидим, как выполнить эти шаги в средах LEMP и LAMP.

Шаги настройки для Nginx + PHP-FPM

Начнем с редактирования файла по умолчанию + php.ini, чтобы определить часовой пояс сервера. Это требование для запуска приложений Symfony, и обычно оно комментируется при установке новых серверов.

Откройте файл + / etc / php5 / fpm / php.ini.

sudo nano /etc/php5/fpm/php.ini

Найдите строку, содержащую + date.timezone +. Раскомментируйте директиву, удалив знак +; + в начале строки, и добавьте часовой пояс, соответствующий вашему приложению. В этом примере мы будем использовать + Europe / Amsterdam +, но вы можете выбрать любой supported timezone.

модифицированный /etc/php5/fpm/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

Сохраните файл и выйдите. Чтобы применить изменения, перезапустите PHP.

sudo service php5-fpm restart

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

cd /etc/nginx/sites-available
sudo mv default default-bkp

Создайте новый файл, чтобы заменить старый.

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

Вставьте следующее содержимое в файл. Не забудьте заменить значения + server_name +, чтобы они отражали доменное имя или IP-адрес вашего сервера.

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   server_name ;
   root /var/www//web;

   location / {
       # try to serve file directly, fallback to app.php
       try_files $uri /app.php$is_args$args;
   }

   location ~ ^/app\.php(/|$) {
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       # Prevents URIs that include the front controller. This will 404:
       # http://domain.tld/app.php/some-path
       # Remove the internal directive to allow URIs like this
       internal;
   }

   error_log /var/log/nginx/symfony_error.log;
   access_log /var/log/nginx/symfony_access.log;
}

Сохраните файл и выйдите. Чтобы применить изменения, перезапустите Nginx.

sudo service nginx restart

Шаги настройки для веб-сервера Apache + PHP5

Начнем с редактирования файла по умолчанию + php.ini, чтобы определить часовой пояс сервера. Это требование для запуска приложений Symfony, и обычно оно комментируется при установке новых серверов.

Откройте файл + / etc / php5 / apache2 / php.ini:

sudo nano /etc/php5/apache2/php.ini

Найдите строку, содержащую + date.timezone +. Раскомментируйте директиву, удалив знак +; + в начале строки, и добавьте часовой пояс, соответствующий вашему приложению. В этом примере мы будем использовать + Europe / Amsterdam +, но вы можете выбрать любой supported timezone.

модифицированный /etc/php5/fpm/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

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

cd /etc/apache2/sites-available
sudo mv 000-default.conf default-bkp.conf

Создайте новый файл, чтобы заменить старый.

sudo nano /etc/apache2/sites-available/000-default.conf

Вставьте следующее содержимое в файл.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>

   DocumentRoot /var/www//web
   <Directory /var/www//web>
       AllowOverride None
       Order Allow,Deny
       Allow from All

       <IfModule mod_rewrite.c>
           Options -MultiViews
           RewriteEngine On
           RewriteCond %{REQUEST_FILENAME} !-f
           RewriteRule ^(.*)$ app.php [QSA,L]
       </IfModule>
   </Directory>

   # uncomment the following lines if you install assets as symlinks
   # or run into problems when compiling LESS/Sass/CoffeScript assets
   # <Directory /var/www/project>
   #     Options FollowSymlinks
   # </Directory>

   ErrorLog /var/log/apache2/symfony_error.log
   CustomLog /var/log/apache2/symfony_access.log combined
</VirtualHost>

Если вы используете доменное имя для доступа к вашему серверу, а не только по IP-адресу, вы можете при желании определить значения + ServerName + и + ServerAlias ​​+, как показано ниже. Если нет, вы можете опустить их.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>



   DocumentRoot /var/www/todo-symfony/web
. . .

Сохраните файл и выйдите. Нам также нужно включить + mod_rewrite + для Apache.

sudo a2enmod rewrite

Чтобы применить все изменения, перезапустите Apache.

sudo service apache2 restart

Шаг 7 - Доступ к приложению

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

изображение: https: //assets.digitalocean.com/articles/symfony_1404/todo-symfony.png [Предварительный просмотр приложения Symfony To-Do]

Вы можете использовать форму для создания новых задач и тестирования функциональности приложения.

Заключение

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

Related