Установка базового программного обеспечения LEMP
Для выполнения дальнейших шагов нам необходимы настроенные LEMP серверы с установленными сертификатами Let’s Encrypt. В зависимости от выбранной ОС, вы можете воспользоваться для настройки одним из руководств, приведенных ниже. При настройке каждого сервера используйте его доменное имя — , , .
Настройку необходимо выполнить на каждом из серверов, который будет входить в отказоустойчивый кластер.
Установка LEMP в CentOS 7 с использованием внешнего репозитория Remi’s Repository для установки PHP 7.2.
Стандартная установка LEMP в Debian 9 Stretch с использованием PHP 7.0
Стандартная установка LEMP в Ubuntu 18.04 Bionic с использованием PHP 7.2
На этом шаге вы должны получить три сервера с установленным стеком LEMP. Каждый сервер должен быть доступен по доменному имени по протоколу HTTPS. На каждом сервере должен быть установлен сервер СУБД MariaDB.
Установка Certbot на CentOS 7 с nginx / apache
Для установки certbot нам потребуется установить репозиторий epel-release (все команды выполняются с правами root):
Далее устанавливаем сам клиент и модуль работы с сервером (пример для nginx):
Если же вы используете apache, то выполните установку certbot с соответствующим модулем:
Приступаем к непосредственному получению бесплатного сертификата и настройке https. Если вы используете nginx, выполните:
Если у вас установлен apache:
Certbot попросит указать адрес электронной почты, которая будет использована срочного продления и уведомлений безопасности. Указываем свою почту и нажимаем Enter:
Далее необходимо принять пользовательское соглашение, вводим A и нажимаем Enter:
Нам предложат опубликовать наш адрес электронной почты после успешного получения сертификата. Отказываемся, введя N и Enter:
Certbot проверит конфигурационные файлы nginx / apache на наличие доменных имен. Если они будут найдены, то он выведет их список и предложит указать те, для которых требуется получить сертификаты и настроить веб-сервер (в консоли вводятся номера позиций, возможно указание нескольких через пробел). Если же у вас нет настроенных доменов, то имя потребуется указать вручную:
После этого дожидаемся окончания работы клиента:
Для успешной работы Certbot необходимо, чтобы у вас были открыты порты 80 и 443!
Заходим в браузер и вводим наш домен. Справа от него будет указан значок замка, который говорит о защищенном соединении:
Так как сертификаты Let’s Encrypt выдаются на три месяца, то настроим их автоматическое обновление. Для этого откроем любым текстовым редактором крон:
И укажем периодическое задание на обновление всех сертификатов с помощью certbot:
Установка Certbot на CentOS 8 с nginx / apache
Для установки certbot нам потребуется установить репозиторий epel-release (все команды выполняются с правами root):
Далее устанавливаем сам клиент и модуль работы с сервером (пример для nginx):
Если же вы используете apache, то выполните установку certbot с соответствующим модулем:
Приступаем к непосредственному получению бесплатного сертификата и настройке https. Если вы используете nginx, выполните:
Если у вас установлен apache:
Certbot попросит указать адрес электронной почты, которая будет использована срочного продления и уведомлений безопасности. Указываем свою почту и нажимаем Enter:
Далее необходимо принять пользовательское соглашение, вводим A и нажимаем Enter:
Нам предложат опубликовать наш адрес электронной почты после успешного получения сертификата. Отказываемся, введя N и Enter:
Certbot проверит конфигурационные файлы nginx / apache на наличие доменных имен. Если они будут найдены, то он выведет их список и предложит указать те, для которых требуется получить сертификаты и настроить веб-сервер (в консоли вводятся номера позиций, возможно указание нескольких через пробел). Если же у вас нет настроенных доменов, то имя потребуется указать вручную:
После этого дожидаемся окончания работы клиента:
Для успешной работы Certbot необходимо, чтобы у вас были открыты порты 80 и 443!
Заходим в браузер и вводим наш домен. Справа от него будет указан значок замка, который говорит о защищенном соединении:
Так как сертификаты Let’s Encrypt выдаются на три месяца, то настроим их автоматическое обновление. Для этого откроем любым текстовым редактором крон:
И укажем периодическое задание на обновление всех сертификатов с помощью certbot:
Установка сервера CentOS 7
Здесь вкратце поговорим о том, как развернуть универсальный сервер на базе CentOS 7 с минимальным набором необходимых инструментов, которые требуются для его полноценной работы.
Итак, для начала необходимо отыскать сам сервер. Его можно либо нанять в Сети (от 250 рублей), либо настроить на локальной машине. Единственное, что потребуется, – это данные SSH, которые будут использоваться для входа на сервер. Возьмем в качестве примера абстрактный почтовый адрес [email protected] и имя пользователя c паролем тоже centos.
Начать конфигурацию стоит с создания пользователя и выдачи ему всех необходимых прав:
- Добавляем пользователя командой useradd centos;
- Создаем для него уникальный пароль – passwd centos;
- Заставляем систему отправлять root-почту этому пользователю – vi /etc/aliases;
- Даем пользователю права sudo командой visudo (командная строка отзовется подтверждением операции).
Далее необходимо указать имя хоста. Это можно сделать командой hostnamectl set-hostname server1.centos.net.
После нужно отключить Firewall и SeLinux. Это необходимо сделать для того, чтобы случайно не лишить себя прав доступа к серверу. Приостановить работу Firewall можно, используя команды systemctl stop firewalld и systemctl disable firewalld. Ситуация с SeLinux немного сложнее: необходимо открыть соответствующий конфигурационный файл в текстовом редакторе Vi с помощью команды vi /etc/selinux/config, разыскать там строку SELINUX=enabled и заменить на SELINUX=disabled. Затем нужно перезагрузить систему.
Следующим этапом настройки будет установка SSH.
Для этого необходимо:
- Добавить соответствующие ключи с севера командой ssh-copy-id [email protected].
- Изменить порт в конфигурационном файле /etc/ssh/sshd_config на Port 222.
- Запретить вход на сервер без прав Root, вписав строку PermitRootLogin without-password.
- И перезагрузить сервер командой systemctl restart sshd.
Также нужно обновить все системы и установить хранилища epel и rpmforge. Для этого необходимо:
- Обновить все системные элементы командой yum update.
- Загрузить новые системные компоненты командой yum -enablerepo=cr update.
- Если существующих компонентов недостаточно, можно загрузить более современные версии epel и rpmforge, для этого вводим команду yum -y install *адрес репозитория, где хранится нужная версия программного обеспечения* (подходящий репозиторий можно легко найти на профильных ресурсах).
Установка и настройка PhpMyAdmin (PMA)
Ставить будем вручную. Для этого нам потребуется менеджер загрузок wget.
Если у вас нет, то ставим:
#
yum-yinstall wget
Идем на http://www.phpmyadmin.net/home_page/downloads.php и копируем ссылку на самую последнюю мультиязычную версию PhpMyAdmin со сжатием .zip (На данный момент это — http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/4.2.8/phpMyAdmin-4.2.8-all-languages.zip).
Идем в /var/www/html/:
#
cd/var/www/html/
Скачиваем PMA:
#
wget http//sourceforge.net/projects/phpmyadmin/files/phpMyAdmin/4.2.8/phpMyAdmin-4.2.8-all-languages.zip
В директории появится архив phpMyAdmin-4.2.8-all-languages.zip, распаковываем его:
#
unzip phpMyAdmin-4.2.8-all-languages.zip
Переименуем директорию phpMyAdmin-4.2.8-all-languages в pma:
#
mv phpMyAdmin-4.2.8-all-languages pma
Удалим архив phpMyAdmin-4.2.8-all-languages.zip т.к. он нам больше не нужен:
#
rm phpMyAdmin-4.2.8-all-languages.zip
По идее у нас уже полностью рабочий PhpMyAdmin должен быть доступен по адресу — https://IP-адрес_сервера/pma/
Дополнительно читаем: Тонкая настройка PhpMyAdmin
Плановое ручное переключение
Если по каким-то причинам надо поменять primary и standby местами, то сделать это можно одной командой
Внимание! Данная команда запускает довольно сложную серию операций на двух серверах, поэтому перед запуском убедитесь в надёжности вашего оборудования, стабильности сетевого соединения, отсутствии активных клиентов и наличии резервной копии (в первую очередь наличие резервной копии!). Выполним на standby-сервере:
# sudo -u postgres /usr/pgsql-9.6/bin/repmgr -f /etc/repmgr/9.6/repmgr.conf standby switchover NOTICE: executing switchover on node "v83node2" (ID: 2) NOTICE: local node "v83node2" (ID: 2) will be promoted to primary; current primary "v83node1" (ID: 1) will be demoted to standby NOTICE: stopping current primary node "v83node1" (ID: 1) NOTICE: issuing CHECKPOINT DETAIL: executing server command "/usr/pgsql-9.6/bin/pg_ctl -D '/var/lib/pgsql/9.6/data' -W -m fast stop" NOTICE: current primary has been cleanly shut down at location 0/A000028 NOTICE: promoting standby to primary DETAIL: promoting server "v83node2" (ID: 2) using "/usr/pgsql-9.6/bin/pg_ctl -w -D '/var/lib/pgsql/9.6/data' promote" server promoting NOTICE: STANDBY PROMOTE successful DETAIL: server "v83node2" (ID: 2) was successfully promoted to primary NOTICE: setting node 1's primary to node 2 NOTICE: starting server using "/usr/pgsql-9.6/bin/pg_ctl -w -D '/var/lib/pgsql/9.6/data' start" NOTICE: NODE REJOIN successful DETAIL: node 1 is now attached to node 2 NOTICE: replication slot "repmgr_slot_2" deleted on node 1 NOTICE: switchover was successful DETAIL: node "v83node2" is now primary and node "v83node1" is attached as standby NOTICE: STANDBY SWITCHOVER has completed successfully
Вернуть всё обратно можно той же командой, только выполнить её теперь надо на v83node1.
Создание контента веб-сервера
После определения DocumentRoot веб-сервера вы знаете все, что нужно знать для настройки базового веб-сервера. По умолчанию веб-сервер Apache ищет файл с именем index.html и представляет содержимое этого документа клиентам, использующим браузер для доступа к веб-серверу.
Чтобы протестировать веб-сервер, вы можете запустить браузер. Браузер Firefox установлен по умолчанию во всех графических установках RHEL / CentOS. Если ваш сервер не поддерживает графический интерфейс, используйте yum install elinks для установки текстового браузера elinks.
Этот браузер не позволяет загружать сложные веб-страницы, но он позволяет вам проверить работу веб-сервера. Ниже на скриншоте показано, как выглядит интерфейс elinks.
В упражнении 1 вы узнаете, как настроить базовый веб-сервер.
Упражнение 1. Настройка базового веб-сервера
В этом упражнении вы узнаете, как настроить базовый веб-сервер Apache.
Компоненты web сервера
Для работы с веб сайтом как правило необходимо иметь три компонента.
- Nginx — по сути это и есть сам веб сервер который будет обрабатывать все запросы и выдавать информацию пользователям,
- MariaDB — база данных в которой будут хранится данные сайтов. MariaDB ответвление от популярной mysql и полностью с ней совместима,
- PHP — язык программирования, который чаще всего применяется веб разработчиками.
Теперь обо всех этих компонентах расскажу подробно.
Дальнейшие действия производим с учетом начальной настройки сервера CetnOS 7 на Айхор Хостинге. Все действия будут правильны для других хостингов и серверов где необходимо развернуть данный функционал на операционной системе CentOS 7.
Установка phpMyAdmin
Для установки phpMyAdmin вводим следующую команду:
yum install phpmyadmin
Теперь создадим для него отдельный виртуальный домен в NGINX:
vi /etc/nginx/conf.d/phpMyAdmin.conf
И добавим в него следующее содержимое:
server {
listen 80;
server_name phpmyadmin.dmosk.local;
set $root_path /usr/share/phpMyAdmin;
location / {
root $root_path;
index index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
fastcgi_read_timeout 300;
}
}
* где phpmyadmin.dmosk.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpMyAdmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.
После перезапускаем NGINX:
systemctl reload nginx
Также нужно перезапустить php-fpm, так как в процессе установки был добавлен модуль mbstring:
systemctl restart php-fpm
И открываем в браузере наш домен, в данном примере, http://phpmyadmin.dmosk.local. Откроется форма для авторизации — вводим логин root и пароль, который мы указали после установки и запуска mariadb.
Настройка виртуальных хостов apache2 в ubuntu
Виртуальные хосты позволяют размещать более одного веб-сайта на одном сервере Apache2. В Nginxэто называется серверными блоками.
По умолчанию Apache2 поставляется с одним виртуальным хостом, а его конфигурационная информация хранится в файле /etc/apache2/sites-enabled/000-default.conf. Кроме того, корень веб-сайта по умолчанию — располагается в /var/www/html.
Настроить новый виртуальный хост очень просто. Следуйте инструкции и просто замените setiwik своим собственным зарегистрированным доменным именем.
Примечание: ваше зарегистрированное доменное имя должно указывать на IP-адрес вашего сервера Ubuntu.
Устанавливаем PHP на CentOS 7.1
Для установки языка программирования PHP на CentOS необходимо выполнить следующую команду, но учтите, что если Вы используете дополнительные расширения PHP, то их необходимо включать в установку, например, мы сразу установим расширение для работы с базой MySQL (указываем название расширения через пробел). Если Вы не знаете, какие расширения Вы будете использовать, то ничего страшного, потом их конечно можно доустановить, итак, команда для установки php и расширения mysql будет выглядеть следующим образом (все от имени root):
yum -y install php php-mysql
Перезапускаем Apache
systemctl restart httpd
Для проверки установился ли PHP, создаем тестовый файл (например, таким же способом как мы создавали конфиг Apache чуть выше), допустим с названием test.php в директории тестового сайта (/var/www/html/testsite/www/), содержание файла следующее (просто информация о PHP)
<?PHP echo phpinfo(); ?>
После создания мы обращаемся к этому файлу из браузера, например ip_адрес/test.php
В ответ мы должны получить вот такую страницу
Как видите, у нас установилась версия PHP 5.4.16.
Устанавка MySQL.
# yum -y install mysql mysql-server
Пропишем MySQL в автозапуск:
# chkconfig mysqld on
Стартуем MySQL:
# service mysqld start
Установим пароль MySQL для root :
# mysqladmin -u root password 'your-pass'
Где your-pass — root пароль для MySQL. ВСЕ УСТАНОВИЛИ! Но для удобства добавим пару последних штрихов:
Структура будет выглядеть следующим образом:
/home/captain/ — директория с вашими сайтами
/home/captain/test.com/ — папка для сайта test.com
/home/captain/test.com/www/ — файлы сайта test.com
/home/captain/test.com/logs/ — логи сайта test.com
/home/captain/test.com/tmp/ — папка с временными файлами сайта test.com
И так, создаем в /home/captain/ в директории каждого из сайтов создаем папки www, logs, tmp. После этого прописываем их в конфиг апача: /etc/httpd/conf.d/ — В эту директорию будем создавать отдельный конфиг файл для каждого сайта (так удобнее).
Файл test.com.conf:
<VirtualHost *:80> ServerName test.com ServerAlias www.test.com DocumentRoot /home/captain/test.com/www <Directory /home/captain/test.com/www> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> #лог ошибок ErrorLog /home/captain/test.com/logs/error.log # #лог обращений выключен по умолчанию, для включения уберите # Установка и настройка Apache, PHP, MySQL в CentOS # #CustomLog /home/captain/test.com/logs/access.log common # # php safety options # php_admin_flag register_globals 1 php_admin_value date.timezone 'Europe/Kiev' php_admin_value open_basedir /home/captain/test.com php_admin_value max_execution_time 60 php_admin_value upload_max_filesize 50M php_admin_value upload_tmp_dir /home/captain/test.com/tmp php_admin_value session.save_path /home/captain/test.com/tmp </VirtualHost>
И так для каждого сайта что находится в директории /home/captain. Затем рестартанем апачик:
# service httpd restart
Установка и настройка FTP-сервера
В качестве FTP-сервера будем использовать ProFTPd, так как он позволяет авторизовываться под uid системных учетных записей. Для его установки вводим следующую команду:
yum install proftpd proftpd-utils
Создаем каталог для хранения настроек:
mkdir /etc/proftpd.d
Создаем виртуального пользователя:
ftpasswd —passwd —file=/etc/proftpd.d/ftpd.passwd —name=ftpwww —uid=48 —gid=48 —home=/var/www —shell=/sbin/nologin
* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (apache); /var/www — домашний каталог пользователя; /sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.
Открываем на редактирование конфигурационный файл proftpd:
vi /etc/proftpd.conf
И редактируем следующее (комментируем):
#AuthOrder …
В конце файла добавим следующее:
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535
RequireValidShell off
AuthUserFile /etc/proftpd.d/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c
* где 60000 — 65535 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl enable proftpd —now
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS 7.
Топология
Мы будем настраивать трехузловую конфигурацию, как изображено на следующем рисунке:
Внутренняя сеть
Для успешной настройки все узлы должны быть соединены высоконадежной внутренней сетью. В том случае, если вы используете виртуальные машины, у которых есть только публичная сеть, то вы можете использовать VXLAN, туннели GRE или VPN для организации внутренней сети. В целом, мы предполагаем, что вы как-то свяжете свои серверы между собой, и эта связь будет надежной. От надежности и производительности внутренней сети будет зависеть то, насколько качественно будет работать отказоустойчивая конфигурация.
Если вы используете аппаратные серверы, рекомендуем связать их между собой через свич с поддержкой LACP, а лучше посредством MLAG, через два независимых коммутатора. Если же ваши коммутаторы не поддерживают MLAG, то вы можете использовать протокол OSPF для организации отказоустойчивой внутренней сети, используя Quagga, развернутый на каждом узле.
Если же у вас только один коммутатор, просто воткните три сервера в него и настройте общую частную сеть.
Публичная сеть
Публичная сеть в рамках планируемой конфигурации может быть ненадежной. Если вы используете аппаратные серверы, можете взять публичные каналы от нескольких провайдеров, чтобы защититься от аварии инфраструктуры провайдера. В общем случае, к публичной сети требования довольно просты — она должна быть приемлемо надежной и обеспечивать прохождение нужного объема трафика.
Обратите внимание, что в моменты деградации, например, если один из узлов выйдет из строя, трафик перетечет на оставшиеся два узла. Каналы каждого из этих узлов должны выдержать добавление от 1/6 до 1/3 трафика без деградации
На каждом узле мы установим одну и ту же операционную систему и все прикладное программное обеспечение — Nginx, GlusterFS, MariDB, PHP7 и настроим публичное взаимодействие с этими серверами по безопасному протоколу Let’s Encrypt.
DNS
Будем считать, что наши серверы имеют доменные имена:
- ,
- ,
- ,
Необходимо убедиться, что серверы доступны по этим доменным именам из сети интернет (корректные записи A, AAAA). Доменные имена необходимы для получения сертификатов Let’s Encrypt, которые будут шифровать трафик.
Таким образом, каждый из серверов должен быть индивидуально доступен через , а запись должна указывать на каждый из них. При вызове вы должны получить ip-адреса всех серверов.
Если вы не планируете использовать для внешней балансировки трафика CDN, необходимо установить корректный TTL для записей . Устанавливайте минимальный, какой позволяет провайдер. Это необходимо, чтобы при отказе сервера вы могли удалить запись для него и быстро исключить его из списка доступных.
Если вы планируете отправку почты с напрямую серверов или через внешний SMTP, то для настройки обратитесь к руководствам по настройке дополнительных записей, необходимых для правильной доставки почты — SPF, PTR.
Начнем установку apache, я установлю с SSL:
# yum -y install httpd mod_ssl
Апач установился, нужно подправить его конфиг, открыв в текстовом редакторе :
# ee /etc/httpd/conf/httpd.conf
И в поле ServerName прописываем ваш IP или имя сервера, у меня оно выглядит так:ServerName 192.168.77.113
Чтобы Apache стартовал автоматически пропишем в автозапуск следующее:
# chkconfig httpd on
Стартуем Apache:
# service httpd start
Создадим пробную страницу, можно не выполнять это:
# echo '<h1>It's Work</h1>' > /var/www/html/index.html
Проверить можно перейдя по адресу который вы прописали в ServerName:http://192.168.77.113/
И мы увидим строчку «It’s Work»
Установка MariaDB или MySQL
В данной статье мы установим MariaDB, но процедура установки и настройки MySQL аналогичная. Все расхождения будут отмечены явно в инструкции.
Устанавливаем MariaDB следующей командой:
yum install mariadb-server
* будет установлена mariadb версии 5.5. Если нужна другая, то читаем подробнее в инструкции .
** для установки mysql выполняем команду yum install mysql
Разрешаем автозапуск и запускаем СУБД:
systemctl enable mariadb —now
* для работы с mysql меняем mariadb на mysql.
Сразу создаем пароль для учетной записи root:
mysqladmin -u root password
PHP + MariaDB (MySQL)
Для возможности подключаться к базе данных скриптами PHP необходимо установить следующие модули:
yum install php-mysqli
Если мы установили php5, также ставим php-mysql:
yum install php-mysql
После перезагружаем php-fpm:
systemctl restart php-fpm
* нас не должно смущать, что установили мы mariadb, а заголовок mysql. Если посмотреть в таблицу, можно увидеть ячейку Client API version, в которой указано, что используется именно mariadb.