Разработка и производство веб-приложений: развертывание приложения

Данное руководство поможет вам развернуть PHP-приложение, WordPress и частный DNS.

Пользователи будут получать доступ к приложению по HTTPS через доменное имя (в руководстве используется условный домен https://www.example.com). Домен указывает на балансировщик нагрузки, который работает как обратный прокси-сервер для серверов приложений, подключенных к серверу баз данных. Частный DNS позволяет ссылаться на частные сетевые адреса серверов по именам, что значительно облегчает процесс настройки серверов.

Для реализации такой инфраструктуры нужны шесть серверов, которые создаются в следующем порядке:

  • Частные DNS-серверы (ns1 и ns2).
  • Сервер баз данных (db1).
  • Серверы приложений (app1 и app2).
  • Балансировщик нагрузки (lb1).

1: Частные DNS-серверы

Использование имен в адресах помогает идентифицировать серверы, с которыми вы работаете, и упрощает обслуживание объемных инфраструктур (чтобы заменить сервер, достаточно просто обновить свои записи DNS в одном файле, а обновлять бесчисленные конфигурационные файлы не нужно). В данной настройке DNS используется для того, чтобы иметь возможность ссылаться на частные сетевые адреса серверов по имени вместо IP-адресов.

Ссылаться на частный сетевой адрес каждого сервера можно по имени хоста по поддомену nyc3.example.com. Например, частный сетевой адрес сервера базы данных будет db1.nyc3.example.com.

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

В результате вы получите два BIND-сервера, ns1 и ns2. Если вы уже знаете IP-адреса всех серверов, добавьте их в DNS. Если вы не знаете адреса, добавляйте DNS-записи по мере создания серверов.

2: Сервер баз данных

Чтобы внедрить распределение нагрузки между серверами приложений (то есть, между Apache и PHP), нужно отделить от них базу данных, выделив для нее отдельный сервер. Отделение БД от приложения является важным этапом для горизонтального масштабирования многих типов приложений.

Читайте также: Горизонтальное масштабирование PHP-приложений

Установка MySQL

Перейдите на сервер БД, db1, и установите MySQL:

sudo apt-get update
sudo apt-get -y install mysql-server

По запросу введите root-пароль MySQL.

Запустите:

sudo mysql_install_db
sudo mysql_secure_installation

MySQL снова запросит root-пароль, а затем предложит изменить его. Если вы не хотите менять этот пароль, введите N. На остальные вопросы программы можно выбрать опции по умолчанию.

Настройка MySQL для прослушивания частного сетевого интерфейса

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

sudo vi /etc/mysql/my.cnf

Найдите параметр bind-address и укажите в нем частный сетевой адрес сервера базы данных:

bind-address            = db1.nyc3.example.com

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

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

sudo service mysql restart

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

Теперь нужно создать БД и пользователя, с помощью которого приложение сможет подключаться к БД.

Откройте консоль MySQL:

mysql -u root -p

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

Чтобы создать БД, введите:

CREATE DATABASE app;

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

Создайте пользователя базы данных appuser, к которому можно подключиться с частного сетевого адреса каждого из серверов приложений (app1 и app2). Используйте один и тот же пароль для каждого пользователя:

CREATE USER 'appuser'@'app1.nyc3.example.com' IDENTIFIED BY 'password';
CREATE USER 'appuser'@'app2.nyc3.example.com' IDENTIFIED BY 'password';

Теперь нужно передать пользователю appuser права на базу данных app.

GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app1.nyc3.example.com';
GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app2.nyc3.example.com';
FLUSH PRIVILEGES;

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

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

Выйдите из командной строки MySQL:

exit

3: Настройка серверов приложений

Серверы приложений будут запускать код приложения, который будет подключаться к серверу базы данных. В данном случае используется PHP-приложение WordPress, которое обслуживается веб-сервером Apache или Nginx. Чтобы реализовать балансировку нагрузки между серверами приложений, настройте два одинаковых сервера.

Установка Apache и PHP

На оба сервера приложений, app1 и app2, нужно установить Apache и PHP.

sudo apt-get update
sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt

Настройка Apache

Для распределения нагрузки и обработки SSL-терминации будет использоваться HAProxy. Это предотвратит прямой доступ к приложению. Свяжите Apache с частным сетевым адресом каждого сервера.

На каждом сервере приложений (app1 и app2) откройте конфигурационный файл портов Apache. По умолчанию это файл ports.conf:

sudo vi /etc/apache2/ports.conf

Найдите строку Listen 80 и добавьте в нее свой внутренний IP-адрес:

Listen private_IP:80

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

Теперь Apache прослушивает только частный сетевой интерфейс, что означает, что к нему нельзя получить доступ по внешнему IP-адресу или имени хоста.

Перезапустите Apache, чтобы обновить настройки:

sudo service apache2 restart

Теперь веб-сервер Apache доступен только через частный сетевой адрес серверов приложений. Чтобы веб-сервер мог получать запросы пользователей, настройте балансировку нагрузки.

Загрузка и настройка приложения

В данном примере используется приложение WordPress. Если вы используете другое PHP-приложение, самостоятельно загрузите его и выполните соответствующую настройку (например, добавьте информацию о подключении к базе данных), а затем перейдите к следующему разделу.

Загрузите архив WordPress на первый сервер приложений, app1.

cd ~
wget http://wordpress.org/latest.tar.gz

Распакуйте архив:

tar xvf latest.tar.gz

Перейдите в полученный каталог:

cd wordpress

Для загрузок WordPress необходим каталог wp-content/uploads.

mkdir wp-content/uploads

В качестве шаблона конфигурационного файла WordPress можно использовать образец, который поставляется с установкой. Скопируйте его:

cp wp-config-sample.php wp-config.php

Откройте файл в редакторе:

vi wp-config.php

Настройте подключение WordPress к БД приложения. Для этого укажите следующие данные:

/** The name of the database for WordPress */
define('DB_NAME', 'app');
/** MySQL database username */
define('DB_USER', 'appuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
/** MySQL hostname */
define('DB_HOST', 'db1.nyc3.example..com');

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

Балансировщик нагрузки будет шифровать данные с помощью TLS/SSL. Добавьте в настройки WordPress следующие строки, чтобы приложение могло взаимодействовать с обратным прокси-сервером и поддерживать SSL.

define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS']='on';

Также нужно обновить ключи и соль, чтобы в случае необходимости иметь возможность сделать файлы cookies недействительными. Ключи и соль должны быть одинаковыми на всех серверах приложений.

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

Копирование файлов приложения в корневой каталог

Теперь приложение настроено. Можно скопировать его файлы в корневой каталог (document root) веб-сервера Apache, из которого он будет обслуживать контент.

По умолчанию DocumentRoot Apache находится в каталоге /var/www/html.

Сначала удалите стандартный файл index.html:

sudo rm /var/www/html/index.html

С помощью rsync скопируйте файлы WordPress в /var/www/html и передайте права на них пользователю www-data (он запускает Apache).

sudo rsync -avP ~/wordpress/ /var/www/html
sudo chgrp -R www-data /var/www/html/*

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

4: Репликация файлов приложения на остальные серверы

Чтобы сохранить целостность файлов приложения на всех серверах, нужно настроить репликацию каталога document root.

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

Примечание: Если вы используете не WordPress, а другое приложение PHP, которое не сохраняет данные (например, загруженные файлы или загруженные плагины) на сервере приложений, вы можете просто один раз скопировать файлы приложения вручную. Для копирования файлов с app1 на app2 используйте rsync.

GlusterFS позволяет создать реплицированный том необходимых файлов.

Читайте также: Создание резервного пула хранения данных GlusterFS в Ubuntu

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

5: Настройка балансировщика нагрузки

В качестве балансировщика нагрузки используется HAProxy, который будет работать как обратный прокси-сервер для серверов приложений. Пользователи получат доступ к приложению через сервер балансировки нагрузки по домену (например, https://www.example.com).

Читайте также:

Копирование SSL-сертификата

Примечание: Данный раздел нужно выполнить на сервере lb1.

Откройте каталог, в котором хранится SSL-сертификат, и объедините все файлы сертификата в единый файл .pem. К примеру:

cd /root/certs

cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem

Затем скопируйте полученный файл в /etc/ssl/private:

sudo cp www.example.com.pem /etc/ssl/private/

HAProxy будет использовать этот файл для SSL-терминации.

Установка HAProxy

На сервер lb1 установите HAProxy.

sudo add-apt-repository ppa:vbernat/haproxy-1.5
sudo apt-get update
sudo apt-get -y install haproxy

Настройка HAProxy

Выберите параметры HAProxy, настройте SSL-терминацию, фронтенд и бэкенд.

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

sudo vi /etc/haproxy/haproxy.cfg

Общие настройки HAProxy

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

maxconn 2048

Добавьте эту строку, чтобы настроить максимальный размер создаваемых временных ключей DHE:

tune.ssl.default-dh-param 2048

В раздел defaults добавьте следующие строки под строкой mode http:

option forwardfor
option http-server-close

Если вы хотите включить страницу статистики HAProxy, добавьте следующие строки в раздел defaults (укажите имя пользователя и надежный пароль):

stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password

Это предоставит вам доступ к странице статистики HAProxy (https://www.example.com/stats).

Настройки прокси

Добавьте интерфейс для обработки входящих HTTP-соединений. В конце файла укажите интерфейс www-http:

frontend www-http
bind www.example.com:80
reqadd X-Forwarded-Proto:\ http
default_backend app-backend

Этот интерфейс будет принимать HTTP-соединения, которые потом будут перенаправлены на HTTPS.

Теперь добавьте интерфейс для обработки входящих соединений HTTPS. Укажите свой pem сертификат.

frontend www-https
bind www.example.com:443 ssl crt /etc/ssl/private/www.example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend app-backend

Затем нужно настроить бэкенд. Добавьте в файл:

backend app-backend
redirect scheme https if !{ ssl_fc }
server app1 app1.nyc3.example.com:80 check
server app2 app2.nyc3.example.com:80 check

Этот бэкенд указывает, на какие серверы приложений балансировщик нагрузки должен отправлять трафик. Кроме того, строка redirect scheme https указывает на перенаправление HTTP-соединений на HTTPS.

Теперь сохраните и выйдите из haproxy.cfg. HAProxy готов к запуску, но сначала нужно настроить логирование.

Логирование HAProxy

Откройте файл rsyslog.

sudo vi /etc/rsyslog.conf

Найдите следующие строки и раскомментируйте их, чтобы включить передачу сообщений Syslog через UDP.

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

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

sudo service rsyslog restart

Настройка логирования HAProxy завершена. После запуска HAProxy создаст лог /var/log/haproxy.log.

Перезапуск HAProxy

Чтобы обновить настройки, перезапустите HAProxy.

sudo service haproxy restart

6: Настройка WordPress

Запустите сценарий установки WordPress, который подготовит БД.

Откройте в браузере:

https://www.example.com/wp-admin/install.php

На экране появится экран установки WordPress. Следуя его инструкциям. Заполните все формы и нажмите Install WordPress.

После установки WordPress приложение будет готово к работе.

Заключение

Теперь все компоненты приложения настроены и приложение готово к использованию. Вы можете войти в систему как пользователь admin. Пользователи могут получить доступ к сайту через HTTPS.

Обязательно проверьте работу приложения и убедитесь, что все работает должным образом.

Затем можно переходить к следующей части данной серии.

Tags: , , ,