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

от автора

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

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

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

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

Виртуальном кластере на hetzner
Я поделился рецептом создания виртуального кластера на базе доступного по цене сервера в немецком дата-центре hetzner.

Frontend: NGINX + Keepalived (vrrp) на CentOS
Мы описали способ организации проксирующего сервера nginx

Теперь мы поговорим о нескольких важных аспектах:
  • Как развернуть безопасную, масштабируемую 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] 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  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 ГБ ОЗУ

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

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)?

# Раскомментируем секцию, отвечающую за 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

# Устанавливаем 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.

Настройка окружения 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

nano /etc/php.ini
error_reporting = E_ALL & ~E_NOTICE cgi.fix_pathinfo=1 short_open_tag = On date.timezone = "Europe/Moscow" max_execution_time = 600 max_input_time = 600 memory_limit = 512M post_max_size = 500M upload_max_filesize = 2000M max_file_uploads = 200

# Собираем модуль 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

nano /etc/php.d/apc.ini
apc.enabled=1 apc.shm_size=512M

# Настраиваем модуль 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
FastCgiWrapper off

# Устанавливаем 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, экономить на объеме ОЗУ для сервера баз данных не стоит, в нашем случае пусть будет 4084 ГБ ОЗУ, но на серьезных задачах и 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 сайт работает как и ожидалось

Вот и все!

Если у вас возникнут трудности или потребуется специальный человек, чтобы сделать сказку былью — всегда буду рад помочь! мои контакты — welcome

ссылка на оригинал статьи http://habrahabr.ru/company/acronis/blog/209934/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *