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

Вступление

В этой части руководства мы развернем наше примерное приложение PHP, WordPress и частный DNS:

изображение: https: //assets.digitalocean.com/articles/architecture/production/lamp/dns_application.png [DNS + схема приложения]

Ваши пользователи будут получать доступ к вашему приложению через HTTPS через доменное имя, например, «Https://www.example.com», который указывает на балансировщик нагрузки. Балансировщик нагрузки будет действовать в качестве обратного прокси-сервера для серверов приложений, которые будут подключаться к серверу базы данных. Частный DNS позволит нам использовать имена для обозначения частных сетевых адресов наших серверов, что облегчает процесс настройки наших серверов.

Мы настроим компоненты, которые мы только что обсудили, на шести серверах в следующем порядке:

  • Частный DNS (ns1 и ns2)

  • Сервер базы данных (db1)

  • Серверы приложений (app1 и app2)

  • Балансировщик нагрузки (фунт-1)

Давайте начнем с настройки DNS.

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

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

Мы будем ссылаться на адрес частной сети каждого сервера по имени хоста в поддомене «nyc3.example.com». Например, адрес частной сети сервера базы данных будет «db1.nyc3.example.com», который будет преобразован в частный IP-адрес. Обратите внимание, что пример субдомена почти полностью произвольный и обычно выбирается на основе целей логической организации; в нашем случае «nyc3» означает, что серверы находятся в центре обработки данных NYC3, а «example.com» - это доменное имя нашего приложения.

Настройте это, следуя этому руководству, и добавляя записи DNS для каждого сервера в вашей настройке:

После завершения обучения DNS у вас должно быть два сервера BIND: * ns1 * и * ns2 *. Если вы уже знаете частные IP-адреса всех серверов в вашей настройке, добавьте их в свой DNS сейчас; в противном случае добавьте соответствующие записи DNS при создании серверов.

Теперь мы готовы настроить сервер базы данных.

Настройка сервера базы данных

Потому что мы хотим сбалансировать нагрузку на наши серверы приложений, т.е. те, на которых работают Apache и PHP, нам необходимо отделить базу данных от серверов приложений, установив ее на отдельном сервере. Отсоединение базы данных от приложения является важным шагом перед горизонтальным масштабированием многих типов приложений, как описано в этом сообщении в блоге: https://www.digitalocean.com/company/blog/horizontally-scaling-php-applications/[Horizontally Scaling Приложения PHP: практический обзор.

В этом разделе описываются все необходимые шаги для настройки нашего сервера базы данных, но вы можете узнать больше о настройке удаленного отсоединенного сервера базы данных MySQL для приложения PHP в этом руководстве: https://www.digitalocean.com/community/ учебные пособия / как настроить удаленную базу данных для оптимизации производительности сайта с помощью mysql [Как настроить удаленную базу данных MySQL].

Установите MySQL

На сервере базы данных * db1 * установите MySQL Server:

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

Введите желаемый пароль root для MySQL в командной строке.

Теперь запустите:

sudo mysql_install_db
sudo mysql_secure_installation

Вам нужно будет ввести пароль администратора MySQL, который вы установили в шагах выше. После этого он спросит, хотите ли вы изменить этот пароль. Наберите «N», если нет, если вы довольны текущим паролем. Ответьте на остальные вопросы со значениями по умолчанию.

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

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

sudo vi /etc/mysql/my.cnf

Найдите параметр + bind-address + и измените его на адрес адреса частной сети вашего сервера базы данных:

/etc/mysql/my.cnf

bind-address            =

Сохранить и выйти.

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

sudo service mysql restart

Настройка базы данных и пользователей базы данных

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

Войдите в консоль MySQL:

mysql -u root -p

Введите пароль root MySQL в командной строке.

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

CREATE DATABASE ;

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

CREATE USER ''@'' IDENTIFIED BY '';
CREATE USER ''@'' IDENTIFIED BY '';

Мы настроим окончательные привилегии пользователя базы данных позже, но давайте дадим * appuser * полный контроль над базой данных * app *:

GRANT ALL PRIVILEGES ON .* TO ''@'';
GRANT ALL PRIVILEGES ON .* TO ''@'';
FLUSH PRIVILEGES;

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

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

exit

Настройка сервера базы данных завершена. Давайте настроим серверы приложений.

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

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

Этот раздел охватывает все необходимые шаги для настройки наших серверов приложений, но эта тема подробно рассматривается в следующем руководстве, начиная с раздела * Настройка веб-сервера *: https://www.digitalocean.com/community. / tutorials / how-to-setup-a-remote-database-to-optimize-site-performance-with-mysql [Как настроить удаленную базу данных].

Установите 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

Мы будем использовать HAProxy на сервере балансировки нагрузки для обработки завершения SSL, поэтому мы не хотим, чтобы наши пользователи обращались к серверам приложений напрямую. Таким образом, мы свяжем Apache с адресом частной сети каждого сервера.

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

sudo vi /etc/apache2/ports.conf

Найдите строку с надписью + Listen 80 + и добавьте к ней свой частный IP-адрес, например, (замените фактический IP-адрес вашего сервера):

Apache ports.conf - прослушивание частного интерфейса

Listen :80

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

Перезапустите Apache, чтобы изменения вступили в силу:

sudo service apache2 restart

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

Скачать и настроить приложение

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

На первом сервере приложений * app1 * загрузите архив WordPress:

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

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

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, изменив выделенную информацию в следующих строках:

WP-config.php

/** The name of the database for WordPress */
define('DB_NAME', '');

/** MySQL database username */
define('DB_USER', '');

/** MySQL database password */
define('DB_PASSWORD', '');

/** MySQL hostname */
define('DB_HOST', '');

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

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

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

Сохранить и выйти.

WordPress теперь настроен, но его файлы должны быть скопированы в нужное место для обслуживания нашим программным обеспечением веб-сервера.

Копировать файлы приложения в корневой каталог документов

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

Стандартное расположение Apache DocumentRoot + / 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/*

Наш первый сервер приложений, app1, готов. Мы настроим другой сервер приложений.

Копировать файлы приложения на другие серверы

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

GlusterFS можно использовать для создания реплицированного тома необходимых файлов, что демонстрируется в разделе «Синхронизация файлов веб-приложения» * этого учебника: https://www.digitalocean.com/community/tutorials/how-to-use -haproxy-as-a-layer-4-балансировщик нагрузки для wordpress-application-servers-on-ubuntu-14-04 # synchronize-web-application-files [Как использовать HAProxy в качестве балансировщика нагрузки для приложения WordPress Серверы]. Следуйте инструкциям (пропустите расположение файла Edit Hosts, поскольку DNS об этом позаботится) и настройте репликацию между * app1 * и * app2 *.

После правильной настройки репликации оба сервера приложений должны быть настроены правильно. Давайте настроим наш балансировщик нагрузки сейчас.

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

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

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

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

Выполните эти шаги на сервере балансировки нагрузки, * lb1 *.

В каталоге, содержащем ваш SSL-сертификат (одна из предпосылок из части 1), объедините ваш сертификат, любой промежуточный сертификат CA и ключ вашего сертификата в один файл + .pem +. Например (наши сертификаты находятся в + / root / certs +:

cd /root/certs
cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem

Затем скопируйте файл 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

Нам нужно настроить HAProxy с некоторыми разумными настройками, завершением SSL и соответствующими внешними и внутренними интерфейсами, чтобы он работал с нашими серверами приложений.

Откройте файл конфигурации HAProxy для редактирования:

sudo vi /etc/haproxy/haproxy.cfg
Настройка HAProxy: общие настройки

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

haproxy.cfg - maxconn

  maxconn

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

haproxy.cfg - tune.ssl.default-dh-param

  tune.ssl.default-dh-param 2048

Затем в разделе значений по умолчанию добавьте следующие строки под строкой, в которой указано режим http:

haproxy.cfg

  option forwardfor
  option http-server-close

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

haproxy.cfg

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

Это позволит вам просмотреть страницу статистики HAProxy, перейдя в свой домен на / stats (например, «Https://www.example.com/stats%22[https://www.example.com/stats»]).

Пока не закрывайте файл конфигурации! Мы добавим конфигурацию прокси дальше.

Конфигурация HAProxy: Прокси

Первое, что мы хотим добавить - это интерфейс для обработки входящих HTTP-соединений. В конце файла давайте добавим интерфейс под названием www-http:

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

Цель этого интерфейса - принимать HTTP-соединения, чтобы их можно было перенаправить на HTTPS.

Теперь добавьте интерфейс для обработки входящих HTTPS-соединений. Обязательно укажите соответствующий сертификат + pem +:

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

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

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

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

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

Включить ведение журнала HAProxy

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

sudo vi /etc/rsyslog.conf

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

/etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

Теперь перезапустите rsyslog, чтобы включить новую конфигурацию:

sudo service rsyslog restart

Ведение журнала HAProxy теперь включено! Файл журнала будет создан в + / var / log / haproxy.log + после запуска HAProxy.

Перезапустите HAProxy

Перезапустите HAProxy, чтобы изменения вступили в силу:

sudo service haproxy restart

Наш балансировщик нагрузки настроен.

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

Установить WordPress

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

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

Open in a Web Browserhttps:///wp-admin/install.php

Откроется экран установки WordPress. Заполните формы и нажмите кнопку * Установить WordPress *.

После установки WordPress приложение готово к использованию.

Заключение

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

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

Перейдите к следующему учебному пособию, чтобы начать работу над планом восстановления для настройки производственного приложения: https://www.digitalocean.com/community/tutorials/building-for-production-web-applications-recovery-planning[Building for Production: Веб-приложения - планирование восстановления.

Related