«Идеальный» кластер. Часть 2.2: Высокодоступный и масштабируемый web-сервер, лучшие технологии на страже вашего бизнеса

  • Tutorial


В продолжение цикла статей об «Идеальном» кластере, хочу поделиться рецептами создания надежных, производительных и удобных для управления web-систем.



Для обеспечения надежной и быстрой работы сайтов и web-систем, в нашей компании была проведена экспертиза доступных на рынке технических средств. Мы руководствовались простой целью: достигнуть масштабируемости и одновременно высокой производительности наших систем.

Кластер, фактически, был построен с нуля. Возникла frontend-backend архитектура. Базы данных отправились в MariaDB Galera, все сайты переехали на унифицированные web-ноды.

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



Другие мои публикации на тему «Идеального» кластера


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


  • Как развернуть безопасную, масштабируемую web-систему на примере виртуального кластера в Hetzner на базе Proxmox
  • Как легко управлять всеми системами из одной бесплатной и удобной панели управления
  • Как, используя самые современные технологии, добиться максимальной производительности и безопасности


Вы можете спросить, чем отличается эта статья от сотни других?


  • как настроить бесплатную панель управления web-системами ISPConfig на базе CentOS (официальная документация рассказывает о использовании панели в окружении Debian)
  • как настроить саму web панель ISPConfig на работу без apache2 (В документации настойчиво предлагают использовать именно с apache2)
  • поделюсь рецептом создания производительного сервера приложений php с использованием nginx+php-phm и apache2+php-fpm/mod_phр бекендов.
  • Расскажу о процессе установки и настройки MariaDB, вместо MySQL


Концепция:

  • Возмем к примеру, гипервизор на базе бесплатной системы Proxmox
  • Для каждой службы создадим свое виртуальное окружение на базе OpenVZ (спасибо коллегам из Parallels за отличный продукт)
  • У нас есть контейнер gw.local, он пробрасывает отдельные порты к другим контейнерам при помощи iptables
  • Есть isp. local на котором работает панель управления ISPConfig на базе nginx+php-fpm
  • Есть front01.local на нем работает nginx в режиме проксирования трафика на один из своих upstream (серверов исполнения наших сайтов)
  • Есть app01.local на котором живет среда исполнения php пода. Это может быть apache + php-fpm/mod_php или nginx+php-fpm
  • Есть db.local на котором живет главная база данных MariaDB


На всех серверах кроме app01.local, удалены все незадейстованные службы, в том числе и ssh, взаимодействие между ними происходит через серую приватную сеть. В публичную сеть открыты лишь те порты, что необходимы для работы наших сайтов (80, 443 и др)

Proxmox Known issues



Не забывайте включать автозагрузку созданных контейнерам



Когда вы создаете сеть для моста vmbr1, Proxmox присваивает ему виртуальное имя eth0, так что приходится удалять созданную сеть и переделывать все правильно



Что бы войти в контейнер, его необходимо запустить и в терминале ввести команду vzctl enter номер_контейнера

В статье о Proxmox (ссылка на нее в самом начале), мы говорили, что используем файл, где прописаны правила фаервола нашей служебной публичной сети, о которой в идеале не должен знать никто, кроме нас.

nano /etc/iptables.up.rules


*nat
:PREROUTING ACCEPT [2164:136969]
:POSTROUTING ACCEPT [58:3659]
:OUTPUT ACCEPT [0:0]

# Nat
-A POSTROUTING -o vmbr0 -j MASQUERADE

# ISPConfig Web Panel
-A PREROUTING -d *.*.*182/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.8.3:8080
-A PREROUTING -d *.*.*.182/32 -p tcp -m tcp --dport 8081 -j DNAT --to-destination 192.168.8.3:8081

# app01. ssh server
-A PREROUTING -d *.*.*.182/32 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.8.4:22

COMMIT


# Меняем порт ssh нашего гипервизора на 2222

nano /etc/ssh/sshd_config


Port 2222


Общие предварительные настройки для всех наших контейнеров



# Обязательно добавляем в hosts файл, на всех контейнерах, где будут агенты ISPConfig, эти строки:

nano /etc/hosts


192.168.8.1 gw.local
192.168.8.2 front01.local
192.168.8.3 isp.local
192.168.8.4 app01.local
192.168.8.5 db01.local


# Меняем временную зону на Вашу

ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime


yum install wget nano wget ntpdate -y


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

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
rm *.rpm -f


# Этот репозиторий нам пригодится но мы его выключим по умолчанию
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
cd /tmp
wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm && rpm -ivh rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm


# Выключаем, будем использовать через --enablerepo=rpmforge

sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo


# А вот это жемчужина для web систем и не только, тут действительно есть очень много того, что нужно администратору в своей работе. MustHave

wget -q -O - http://www.atomicorp.com/installers/atomic | sh


# Ставим полезный софт

yum install nano mc screen sudo nscd htop ntp zip unzip pigz iotop sysstat lsof strace atop multitail -y
yum --enablerepo=rpmforge install htop -y


# Удаляем нежелательные для этого контейнера службы

yum remove -y sendmail httpd sshd samba bind openssh -y


# Обновляем систему

yum update -y


# Удаляем mysql

yum remove mysql* mysql-*


# Устанавливаем mariadb для служебных целей ISPConfig

yum install mariadb-server mariadb-devel mariadb-client -y


# Устаналвиваем cron

yum install -y cronie cronie-anacron crontabs sysstat -y


# Добавляем cron в автозагрузку и запускаем

 /etc/init.d/crond start && chkconfig crond on


# Настраиваем mariadb

nano /etc/my.cnf


[mysqld]
skip-name-resolve
default_storage_engine=InnoDB
innodb_file_per_table = 1

# network
connect_timeout                 = 60
wait_timeout                    = 28800
max_connections                 = 200
max_allowed_packet              = 512M
max_connect_errors              = 1000

# performance
query_cache_size = 32M
tmp_table_size = 32M
max_heap_table_size = 32M
thread_cache_size = 16
table_open_cache = 600
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
transaction-isolation = READ-COMMITTED

log_error                       = /var/log/mysql/mysql-error.log
#slow_query_log_file             = /var/log/mysql/mysql-slow.log


# Добавляем mariadb в автозагрузку

chkconfig --levels 235 mysqld on && /etc/init.d/mysqld start


Настройка окружения gw.local


Необходимо создать контейнер OpenVZ (New CT) с окружением CentOS 64. Эта виртуальная машина будет обслуживать нашу публичную и приватную сеть.

Нам понадобится сетевые интерфейсы vmbr0 с именем eth0 (наша публичная сеть провайдера) и vmbr1 для сети eth1 (приватная сеть для взаимодействия с другими контейнерами).


Для этой виртуальной машины понадобиться не более 128 МБ ОЗУ



Приступаем к настройке сети в самом контейнере gw.local

Сеть внутри контейнера:

vi /etc/sysconfig/network-scripts/ifcfg-eth0


DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=x.x.x.237
NETMASK=255.255.255.0
GATEWAY=x.x.x.1


vi /etc/sysconfig/network-scripts/ifcfg-eth1


DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.1
NETWORK=192.168.8.0


# Сохраняем текущие правила iptables

 /etc/init.d/iptables save


# Дописываем правила в раздел *nat для нашего внешнего служебного адреса

vi /etc/sysconfig/iptables


-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.8.2:80
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.8.2:443
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.8.5:25
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.8.5:110
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 145 -j DNAT --to-destination 192.168.8.5:145
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 995 -j DNAT --to-destination 192.168.8.5:995
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 465 -j DNAT --to-destination 192.168.8.5:465
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.8.5:587
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.8.5:143
-A PREROUTING -d *.*.*.237/32 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.8.5:993
-A POSTROUTING -o eth0 -j MASQUERADE


# Разрешаем форвардинг трафика

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p


Настройка окружения front01.local



Необходимо создать контейнер OpenVZ (New CT) с окружением CentOS 64. Эта виртуальная машина будет обслуживать порты 80 и 443, проброшенные с нашего gw.local. На этом контейнере установлен nginx, который проксирует все запросы к нашим сайтам на app01.local
Сама процедура настройки nginx хорошо описана в этой статье «Идеальный» www кластер. Часть 1. Frontend: NGINX + Keepalived (vrrp) на CentOS

У этого контейнера будет адрес в приватной сети (vmbr1) 192.168.8.2, для работы потребуется не больше 1024 MБ ОЗУ

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

vi /etc/sysconfig/network-scripts/ifcfg-eth1


DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.2
NETWORK=192.168.8.0
GATEWAY=192.168.8.1


Настройка окружения isp.


Необходимо создать контейнер OpenVZ (New CT) с окружением CentOS 64. Эта виртуальная машина будет обслуживать нашу панель управления ISPConfig. Вначале статьи мы показали, что панель будет обслуживаться служебным публичным адресом и будет доступна на портах 8080 и 8081.

У этого контейнера будет адрес в приватной сети (vmbr1) 192.168.8.3, и потребуется около 384 МБ ОЗУ.



# Настройки сети для этого контейнера:

/etc/sysconfig/network-scripts/ifcfg-eth1


DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.3
NETWORK=192.168.8.0
GATEWAY=192.168.8.100


# Устанавливаем компоненты web-сервера для панели ISPConfig

yum install php-mysql php nginx php-fpm postfix patch -y


# Удаляем конфиги со стандартным приветствием nginx

rm -f /etc/nginx/conf.d/default.conf
rm -f /etc/nginx/conf.d/virtual.conf
rm -f /etc/nginx/conf.d/ssl.conf


# Добавляем nginx и php-fpm в автозагрузку и запускаем

chkconfig --levels 235 php-fpm on && /etc/init.d/php-fpm start
chkconfig --levels 235 nginx on && /etc/init.d/nginx start


# Разрешаем агентам ISPConfig, подключаться к центральной базе данных isp.local за своими параметрами

mysql


CREATE USER 'root'@'192.168.8.%' IDENTIFIED BY 'c2HZqsMmiBKa';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.8.%' IDENTIFIED BY 'c2HZqsMmiBKa' WITH GRANT OPTION;
flush privileges;


# Устанавливаем phpMyAdmin

yum install phpmyadmin -y


# Создаем симлинк phpMyAdmin на phpmyadmin

ln -s /usr/share/phpMyAdmin/ /usr/share/phpmyadmin


nano /etc/phpMyAdmin/config.inc.php


$cfg['blowfish_secret'] = '46a30e4ed1cf83.14522379'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['Servers'][$i]['host']          = 'db01.local'; // MySQL hostname or IP address
$cfg['Servers'][$i]['port']          = '3306';          // MySQL port - leave blank for default port
$cfg['Servers'][$i]['auth_type']     = 'cookie';      // Authentication method (config, http or cookie based)?


# Устанавливаем ISPConfig

cd /usr/src/
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ISPConfig-3-stable.tar.gz
cd ispconfig3_install/install/
php -q install.php


# Отвечаем на вопросы интерактивного мастера установки
>> Initial configuration

Operating System: Redhat or compatible, unknown version.

Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with .
Tap in «quit» (without the quotes) to stop the installer.

Select language (en,de) [en]:

Installation mode (standard,expert) [standard]: expert

Full qualified hostname (FQDN) of the server, eg server1.domain.tld [isp.local]:

MySQL server hostname [localhost]:

MySQL root username [root]:

MySQL root password []:

MySQL database to create [dbispconfig]:

MySQL charset [utf8]:

The next two questions are about the internal ISPConfig database user and password.
It is recommended to accept the defaults which are 'ispconfig' as username and a random password.
If you use a different password, use only numbers and chars for the password.

ISPConfig mysql database username [ispconfig]:

ISPConfig mysql database password [1850fcffe2fc0b1ca2707c3e27c5eec4]:

Shall this server join an existing ISPConfig multiserver setup (y,n) [n]:

Apache and nginx detected. Select server to use for ISPConfig: (apache,nginx) [apache]: nginx

Adding ISPConfig server record to database.

Configure Mail (y,n) [y]: n

Configure Jailkit (y,n) [y]: n

Configure FTP Server (y,n) [y]: y

Configuring Pureftpd
Configure DNS Server (y,n) [y]: n

Hint: If this server shall run the ISPConfig interface, select 'y' in the 'Configure nginx Server' option.

Configure nginx Server (y,n) [y]: y

Configuring nginx
Configuring Apps vhost
Configure Firewall Server (y,n) [y]: y

Configuring Bastille Firewall
Install ISPConfig Web Interface (y,n) [y]: y

Installing ISPConfig
ISPConfig Port [8080]:

Enable SSL for the ISPConfig web interface (y,n) [y]: y

Generating RSA private key, 4096 bit long modulus
................................................................++
.......................................................................................................................++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
— Country Name (2 letter code) [XX]:Ru
State or Province Name (full name) []:Moscow
Locality Name (eg, city) [Default City]:Moscow
Organization Name (eg, company) [Default Company Ltd]:isp.local
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:isp.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
writing RSA key
Configuring DBServer
Installing ISPConfig crontab
no crontab for root
Reloading php-fpm: [ OK ]
Reloading nginx: [ OK ]
Installation completed.



# У нас панель ISPConfig проброшена на порт 8080 служебного публичного интерфейса

https://ваш_служебный_ip:8080/




По умолчанию логин и пароль: admin

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

cd /usr/local/ispconfig/server/scripts
wget http://www.ispconfig.org/downloads/ispconfig_patch
chmod 700 ispconfig_patch
chown root:root ispconfig_patch
ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch


# Вот список доступных, на момент написания, заплаток
Patches for ISPConfig 3.0.5.3

Patch ID: 3053_langedit
Date: 2013-09-25
Description: This patch solves a UTF-8 encoding issue in the language file editor.

Patch ID: 3053_langimport
Description: This patch adds a strict parsing routine to the language file importer.

Patch ID: 3053_backupdownload
Description: This patch fixes an issue with downloading and restoring website backups.

Patch ID: 3053_apsdelete
Description: This patch fixes an issue when deleting APS instances.

Patch ID: 3053_ftpuser
Description: This patch fixes FS#3089 – FTP User Options – ERROR You have no permission for this domain.

Patch ID: 3053_phpversion
Description: This patch fixes an issue that prevents clients from changing the php version for their website. The only php select option that is presented in the client interface is “default”.

Patch ID: 3053_sysini
Description: This patch fixes FS#3086 – SQL query warning about sys_ini access in multiserver setups.

Patch ID: 3053_dashboard
Description: This patch fixes a display issue (overlapping quota tables) on the dashboard.


# Раскомментируем секцию, отвечающую за phpMyAdmin

nano /etc/nginx/sites-enabled/000-ispconfig.vhost


location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       include /etc/nginx/fastcgi_params;
                       fastcgi_pass unix:/var/lib/php5-fpm/ispconfig.sock;
                       fastcgi_param  HTTPS on;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }


 /etc/init.d/nginx reload


Настройка окружения app01.local (apache2+php-fpm)



Необходимо создать контейнер OpenVZ (New CT) с окружением CentOS 64. Эта виртуальная машина будет обслуживать наши сайты написаные на php. Вообще, apache2 гораздо медленнее nginx-а отдает статические файлы (графику, скрипты, стили и др.), а в сочетании с mod_php еще и тратит очень много памяти на обслуживание входящих запросов. Это связано с самой архитектурой apache2. Если проблему расхода памяти можно победить, используя php-fpm, то с медленной статикой нам остается лишь смириться и частично компенсировать это кешем на стороне nginx в front.local.
Использовать apache2 имеет смысл лишь тогда, когда необходимо использовать .htaccess или модули специфичные только apache2.
Для этой виртуальной машины с служебного публичного адреса проброшен порт ssh, 80 порт проксируется с нашего front.local

У этого контейнера будет адрес в приватной сети (vmbr1) 192.168.8.4, экономить на ОЗУ для этой виртуальной машины не стоит, в общем случае я ставлю от 4 до 20 ГБ.

# Настройки сети для этого контейнера:

vi /etc/sysconfig/network-scripts/ifcfg-eth1


DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.4
NETWORK=192.168.8.0
GATEWAY=192.168.8.100


# Устанавливаем компоненты web-сервера

yum install mod_rpaf memcached ntp httpd php php-mysql php-mbstring php-mcrypt rpm-build openssl-devel cyrus-sasl-devel pkgconfig zlib-devel pcre-devel openldap-devel postgresql-devel expect libtool-ltdl-devel openldap-servers libtool gdbm-devel pam-devel gamin-devel mod_ssl php-fpm php-cli php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-magpierss php-snmp php-tidy spawn-fcgi openssl perl-TimeDate httpd-devel ruby ruby-devel webalizer perl-DateTime-Format-HTTP perl-DateTime-Format-Builder perl-TimeDate libevent-devel php-pecl-memcache mod_fcgid  subversion git php-soap -y
yum install --enablerepo=rpmforge mod_fastcgi mod_suphp -y


# Добавляем службы в автозагрузку и запускаем их

chkconfig --levels 235 php-fpm on && /etc/init.d/php-fpm start
chkconfig --levels 235 httpd on && /etc/init.d/httpd start
chkconfig --levels 235 memcached on && /etc/init.d/memcached start


# Для ручной сборки модулей php, устанавливаем компоненты разработчиков

yum groupinstall 'Development Tools' -y


# Минимальные изменения в php.ini

sed -i "s/^error_reporting =.*/error_reporting = E_ALL \& \~E_NOTICE/g"  /etc/php.ini
sed -i "s/^;cgi.fix_pathinfo =.*/cgi.fix_pathinfo = 1/g"  /etc/php.ini
sed -i "s/^;date.timezone =.*/date.timezone = Europe\/Moscow/g"  /etc/php.ini
sed -i "s/^max_execution_time =.*/max_execution_time = 600/g"  /etc/php.ini
sed -i "s/^max_input_time =.*/max_input_time = 600/g"  /etc/php.ini
sed -i "s/^memory_limit =.*/memory_limit = 512M/g"  /etc/php.ini
sed -i "s/^post_max_size =.*/post_max_size = 500M/g"  /etc/php.ini
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 2000M/g"  /etc/php.ini
sed -i "s/^max_file_uploads =.*/max_file_uploads = 200/g"  /etc/php.ini
sed -i "s/^short_open_tag =.*/short_open_tag = On/g"  /etc/php.ini
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 500M/g"  /etc/php.ini
sed -i "s/;realpath_cache_size =.*/realpath_cache_size = 4096k/g"  /etc/php.ini


# Собираем модуль xdebug (полезно для отладки кода и выявления проблем)

yum install php-devel php-pear
pecl install Xdebug


nano /etc/php.d/xdebug.ini


[xdebug]
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable = 1


php -v


No log handling enabled - turning on stderr logging
Created directory: /var/lib/net-snmp/mib_indexes
PHP 5.4.24 (cli) (built: Jan 13 2014 12:36:47)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Retha


# Устанавливаем модуль php — Zend Guard

cd /usr/src/ && wget wget http://downloads.zend.com/guard/6.0.0/ZendGuardLoader-70429-PHP-5.4-linux-glibc23-x86_64.tar.gz
tar xzvf  ZendGuardLoader-7* -C /usr/local/
chmod -R 755 /usr/local/ZendGuardLoader-70429-PHP-5.4-linux-glibc23-x86_64/
mv /usr/local/ZendGuardLoader-70429-PHP-5.4-linux-glibc23-x86_64/ /usr/local/Zend


nano /etc/php.d/zend.ini


zend_extension=/usr/local/Zend/php-5.4.x/ZendGuardLoader.so


php -v


PHP 5.4.24 (cli) (built: Jan 13 2014 12:36:47)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
    with Zend Guard Loader v3.3, Copyright (c) 1998-2013, by Zend Technologies


# Включаем модуль кеширования opcode для php — apc

sed -i "s/^apc.enabled=.*/apc.enabled=1/g" /etc/php.d/apc.ini
sed -i "s/^apc.shm_size=.*/apc.shm_size=256M/g" /etc/php.d/apc.ini
sed -i "s/;apc.num_files_hint=.*/apc.num_files_hint=20000/g" /etc/php.d/apc.ini
sed -i "s/;apc.user_entries_hint=.*/apc.user_entries_hint=20000/g" /etc/php.d/apc.ini
sed -i "s/;apc.ttl=.*/apc.ttl=86400/g" /etc/php.d/apc.ini
sed -i "s/;apc.user_ttl=.*/apc.user_ttl=7200/g" /etc/php.d/apc.ini
sed -i "s/;apc.gc_ttl=.*/apc.gc_ttl=86400/g" /etc/php.d/apc.ini
sed -i "s/;apc.cache_by_default=.*/apc.cache_by_default=1/g" /etc/php.d/apc.ini
sed -i "s/;apc.max_file_size=.*/apc.max_file_size=10M/g" /etc/php.d/apc.ini


# Настраиваем модуль suphp

mkdir -p /root/backup/etc
mv /etc/httpd/conf.d/suphp.conf /root/backup/ && nano /etc/httpd/conf.d/suphp.conf


LoadModule suphp_module modules/mod_suphp.so
suPHP_Engine on 
suPHP_ConfigPath /etc/suphp.conf


mv /etc/suphp.conf /root/backup/etcsuphp.conf && nano /etc/suphp.conf


[global]
;Path to logfile
logfile=/var/log/httpd/suphp.log
;Loglevel
loglevel=info
;User Apache is running as
webserver_user=apache
;Path all scripts have to be in
docroot=/
;Path to chroot() to before executing script
;chroot=/mychroot
; Security options
allow_file_group_writeable=true
allow_file_others_writeable=false
allow_directory_group_writeable=true
allow_directory_others_writeable=false
;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true
;Send minor error messages to browser
errors_to_browser=false
;PATH environment variable
env_path=/bin:/usr/bin
;Umask to set, specify in octal notation
umask=0077
; Minimum UID
min_uid=100
; Minimum GID
min_gid=100

[handlers]
;Handler for php-scripts
x-httpd-suphp="php:/usr/bin/php-cgi"
;Handler for CGI-scripts
x-suphp-cgi="execute:!self"


# Настраиваем mod_rpaf, третий адрес — публичный web-адрес нашего сервера

nano /etc/httpd/conf.d/mod_rpaf.conf


<IfModule mod_rpaf.c>
  RPAF_Enable       On
  RPAF_ProxyIPs     127.0.0.1 192.168.8.2 *.*.*.237
  RPAF_Header       X-Forwarded-For
  RPAF_SetHostName  On
  RPAF_SetHTTPS     On
  RPAF_SetPort      On
</IfModule>


# Выключаем FastCgiWrapper

nano /etc/httpd/conf.d/fastcgi.conf


sed -i "s/^FastCgiWrapper .*/FastCgiWrapper Off/g" /etc/httpd/conf.d/fastcgi.conf


# Устанавливаем ISPConfig

cd /usr/src/
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ISPConfig-3-stable.tar.gz
cd ispconfig3_install/install/
php -q install.php


# Отвечаем на вопросы интерактивного мастера установки

>> Initial configuration

Operating System: Redhat or compatible, unknown version.

Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with .
Tap in «quit» (without the quotes) to stop the installer.

Select language (en,de) [en]:

Installation mode (standard,expert) [standard]: expert

Full qualified hostname (FQDN) of the server, eg server1.domain.tld [app01.local]:

MySQL server hostname [localhost]:

MySQL root username [root]:

MySQL root password []:

MySQL database to create [dbispconfig]:

MySQL charset [utf8]:

The next two questions are about the internal ISPConfig database user and password.
It is recommended to accept the defaults which are 'ispconfig' as username and a random password.
If you use a different password, use only numbers and chars for the password.

ISPConfig mysql database username [ispconfig]:

ISPConfig mysql database password [8b8295ae2a50a39a1a00da65df0bee72]:

Shall this server join an existing ISPConfig multiserver setup (y,n) [n]: y

MySQL master server hostname []: isp.local

MySQL master server root username [root]:

MySQL master server root password []: c2HZqsMmiBKa

MySQL master server database name [dbispconfig]:

Adding ISPConfig server record to database.

Configure Mail (y,n) [y]: n

Configure Jailkit (y,n) [y]: n

Configure FTP Server (y,n) [y]: y

Configuring Pureftpd
Stopping pure-ftpd: [ OK ]
Starting pure-ftpd: [ OK ]
Configure DNS Server (y,n) [y]: n

Hint: If this server shall run the ISPConfig interface, select 'y' in the 'Configure Apache Server' option.

Configure Apache Server (y,n) [y]: y
Configuring Apache
Configuring Vlogger
Configuring Apps vhost
Configure Firewall Server (y,n) [y]: y

Configuring Bastille Firewall
Install ISPConfig Web Interface (y,n) [n]: n

Configuring DBServer
Installing ISPConfig crontab
no crontab for root
Stopping httpd: [ OK ]
[Thu Jan 23 13:46:44 2014] [warn] NameVirtualHost *:80 has no VirtualHosts
[Thu Jan 23 13:46:44 2014] [warn] NameVirtualHost *:443 has no VirtualHosts
[Thu Jan 23 13:46:44 2014] [warn] NameVirtualHost *:80 has no VirtualHosts
Starting httpd: [ OK ]
Installation completed.


Настройка окружения db01.



Необходимо создать контейнер OpenVZ (New CT) с окружением CentOS 64. На этой витруальной машине будет находится mariadb для наших сайтов.
Я опишу только добавление этого узла в кластер ISPConfig. Вопросы оптимизации MySQL я оставлю для следующих статей.

У этого контейнера будет адрес в приватной сети (vmbr1) 192.168.8.5, экономить на объеме ОЗУ для сервера баз данных не стоит, в нашем случае пусть будет 4 ГБ ОЗУ, но на серьезных задачах и 20 ГБ будет мало.

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

vi /etc/sysconfig/network-scripts/ifcfg-eth1


DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.5
NETWORK=192.168.8.0
GATEWAY=192.168.8.100


# Устанавливаем компоненты php для панели ISPConfig

yum install php-mysql php -y


# Убираем из автозагрузки и выключаем apache2

chkconfig httpd off && /etc/init.d/httpd stop


# Устанавливаем ISPConfig

cd /usr/src/
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ISPConfig-3-stable.tar.gz
cd ispconfig3_install/install/
php -q install.php


# Отвечаем на вопросы интерактивного мастера установки

>> Initial configuration

Operating System: Redhat or compatible, unknown version.

Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with .
Tap in «quit» (without the quotes) to stop the installer.

Select language (en,de) [en]: en

Installation mode (standard,expert) [standard]: expert

Full qualified hostname (FQDN) of the server, eg server1.domain.tld [db01.local]:

MySQL server hostname [localhost]:

MySQL root username [root]:

MySQL root password []:

MySQL database to create [dbispconfig]:

MySQL charset [utf8]:

The next two questions are about the internal ISPConfig database user and password.
It is recommended to accept the defaults which are 'ispconfig' as username and a random password.
If you use a different password, use only numbers and chars for the password.

ISPConfig mysql database username [ispconfig]:

ISPConfig mysql database password [06cd6c11370b50a83eb0a3d3907a3581]:

Shall this server join an existing ISPConfig multiserver setup (y,n) [n]: y

MySQL master server hostname []: isp.local

MySQL master server root username [root]:

MySQL master server root password []: c2HZqsMmiBKa

MySQL master server database name [dbispconfig]:

Adding ISPConfig server record to database.

Configure Mail (y,n) [y]: n

Configure Jailkit (y,n) [y]: n

Configure FTP Server (y,n) [y]: n

Configure DNS Server (y,n) [y]: n

Hint: If this server shall run the ISPConfig interface, select 'y' in the 'Configure Apache Server' option.

Configure Apache Server (y,n) [y]: n

Configure Firewall Server (y,n) [y]: y

Configuring Bastille Firewall
Install ISPConfig Web Interface (y,n) [n]: n

Configuring DBServer
Installing ISPConfig crontab
no crontab for root
Stopping httpd: [FAILED]
Starting httpd: [ OK ]
Installation completed.


Введение в ISPConfig:


После авторизации в web-панели ISPConfig вы попадает на стартовую страницу:



ToolsPassword and Language, меняем язык и создаем сильный пароль для доступа в панель управления.

СистемаСлужбы сервера, убираем у серверов лишние для них роли.
Хочу обратить Ваше внимание на то, что ISPConfig умеет делать отдельный узел зеркалом другого. Т.е. у вас будет одинаковая конфигурация служб и пользователей на нескольких серверах одновременно. Нужно выбрать какой из узлов является зеркалом в Зеркале Сервера

Конфигурация сервера — в каждом сервере в разделе сервер ставим Loglevel на Debug. Теперь мы можем просмотреть все действия, которые выполняет ISPConfig на узлах нашего кластера

tail -f -n 1000 /var/log/ispconfig/ispconfig.log

Тут же в Конфигурация сервера есть раздел Web, в нем Permissions, если у вас несколько зеркал web-сервера на одном файловом хранилище (ceph, ocfs2 и пр.) нужно установить галочки Set folder permissions on update и Connect Linux userid to webid. Это позволит избежать проблем с различием guid/uid и пользователей и групп и их именами/группами на разных зеркалах. Если вы хотите изменить структуру папок у своих пользователей, то снимите галочку Make web folders immutable (extended attributes). Если вы забыли сделать это, то вам на помощь прийдет комманда chattr -i. Следующий важный раздел: Rescue, включите режим автоматического запуска важных служб в случае их падения, но не забудьте отключить перезапуск тех служб, которые не должны перезапускаться.

Создадим тестового пользователя: КлиентДобавить клиента, Адрес, Обязательно заполняем Контактное лицо, Логин и Пароль (тут же есть удобный генератор паролей). Дальше в Лимиты: выбираем Web-сервер по-умолчанию и разрешенные режимы работы web-сервера:


Мы настроили app01.local на поддержку php-fpm и mod_php одновременно. Возвращаемся к списку клиентов и входим в только что созданный:


СайтыДобавить новый вебсайт


Указываем имя сайта и необходимый php-бекенд.

Обратите внимание, ISPConfig в кластерной конфигурации требует времени на распространение всех изменений



В качестве средства доступа к файлам наших сайтов, мы будем пользоваться ssh, под windows удобно использовать WinSCP. Такой способ гораздо безопасней, чем традиционный FTP.
Для доступа нам потребуется создать пользователя SSH, в разделе Пользователь Shell.
Требуется указать логин, пароль и если это необходимо — ключ. Обратите внимание, к вашему пользователю добавляется префикс вашей учетной записи в личном кабинете ISPConfig.

Для работы с MySQL нужно создать его пользователя в разделе Database users, к логину добавиться ваш ID в системе ISPConfig.



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



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



и оказываемся в phpMyAdmin



Финал


app01.local на котором живут наши сайты, доступны в служебной публичной сети на порту 22. В окне настроек WinSCP указываем адрес нашего сервера, логин и пароль созданного пользователя:



Ожидается, что наш сайт находится в папке web



Удалим файл index.html и создадим index.php

<?php

// Показывать всю информацию, по умолчанию INFO_ALL
phpinfo();

// Показывать информацию только о загруженных модулях.
// phpinfo(8) выдает тот же результат.
phpinfo(INFO_MODULES);

?>


Убеждаемся, что в режиме php-fpm/mod_php сайт работает как и ожидалось





Если у вас возникнут вопросы, трудности или потребуется совет:
Мои контакты в профиле
Acronis
117.09
Company
Share post

Comments 2

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

    Only users with full accounts can post comments. Log in, please.