Установка связки Centos + OpenVZ + httpd

Упала на голову задачка, нужно было попробовать сделать за сутки...

Задача такова:

1. Поднять телегу с CentOS 5.5;
2. Накатить сверху OpenVZ и поднять 3 виртуалки;
3. На трех разных виртуалках поднять такую штуку:
3.1 Первая виртуалка DNS c каким-нить хостом, HTTP: NginX + PHP-FPM;
3.2 Вторая и третья виртуалка с MySQL c репликацией через реплицирование;
4. Попробовать всё в деле, путем установки какой-нибудь CMS на созданный хост;

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

Процесс настройки выглядел таким образом:

1. Установка Centos 5.5.

Первым делом скачал CentOS 5.5 Network Install отсюда, затем нарезал его на сидюк.

Установка выглядела таким образом и заняла примерно 3 часа потому что интернет - бяка. С одним отличием сервер как и в примере mirror.centos.org, а папка и дистрибом /centos/5.5/os/i386

2. Установка OpenVZ на CentOS 5.5

Для установки OpenVZ нам необходимо добавить репозиторий в yum:

cd /etc/yum.repos.d
wget http://download.openvz.org/openvz.repo
rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ


Данный репо содержит много различных ядер для OpenVZ
Дополнительно о различных ядрах читаем тут

Следующая команда покажет все возможные ядра
yum search ovzkernel


[root@server1 yum.repos.d]# yum search ovzkernel
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: ftp.halifax.rwth-aachen.de
* openvz-kernel-rhel5: openvz.proserve.nl
* updates: ftp.halifax.rwth-aachen.de
* addons: ftp.halifax.rwth-aachen.de
* openvz-utils: openvz.proserve.nl
* extras: ftp.halifax.rwth-aachen.de
openvz-kernel-rhel5 100% |=========================| 951 B 00:00
primary.xml.gz 100% |=========================| 22 kB 00:00
openvz-ker: ################################################## 14/14
openvz-utils 100% |=========================| 951 B 00:00
primary.xml.gz 100% |=========================| 6.7 kB 00:00
openvz-uti: ################################################## 26/26
ovzkernel-ent.i686 : The Linux kernel compiled for huge mem capable machines.
ovzkernel-PAE.i686 : The Linux kernel compiled for PAE capable machines.
ovzkernel-ent-devel.i686 : Development package for building kernel modules to match the ent kernel.
ovzkernel-PAE-devel.i686 : Development package for building kernel modules to match the PAE kernel.
ovzkernel.i686 : Virtuozzo Linux kernel (the core of the Linux operating system)
ovzkernel-xen.i686 : The Linux kernel compiled for Xen VM operations
ovzkernel-xen-devel.i686 : Development package for building kernel modules to match the kernel.
ovzkernel-devel.i686 : Development package for building kernel modules to match the kernel.

Выбираем одно из ядер и устанавливаем следующим образом:

yum install ovzkernel


Данная команда автоматически обновит GRUB. В любом случае открываем /boot/grub/menu.lst; и первый вариант загрузки должен содержать строку с OpenVZ ядром. Название "CentOS" лучше сменить на что-то более понятное типа: CentOS_OpenVZ.

# nano /boot/grub/menu.lst

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS OpenVZ (2.6.18-53.1.19.el5.028stab053.14)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-53.1.19.el5.028stab053.14 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-53.1.19.el5.028stab053.14.img
title CentOS (2.6.18-92.1.1.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-92.1.1.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-92.1.1.el5.img
title CentOS (2.6.18-92.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-92.el5.img


Так, теперь необходимо установить пользовательские примочки для OpenVZ:

yum install vzctl vzquota


Открываем /etc/sysctl.conf и проверяем наличие следующих опций:

# nano /etc/sysctl.conf

[...]
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1
[...]


Если необходимо изменить настройки /etc/sysctl.conf, запустите

sysctl -p /etc/sysctl.conf


Далее очень важный шаг, если IP - адреса виртуалок из других подсетей чем хостовая тележка очень важно сделать следующий шаг, или сеть на виртуалках работать не будет!!!

Открываем /etc/vz/vz.conf и устанавливаем значение NEIGHBOUR_DEVS на all:

# nano /etc/vz/vz.conf

[...]
NEIGHBOUR_DEVS=all
[...]

SELinux необходимо отключить если мы хотим использовать OpenVZ. Jnrhsdftv /etc/sysconfig/selinux и устанавливаем значение SELINUX в disabled:

# nano /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted


Всё, теперь необходимо перезабутить тележку:

# reboot


Если тележка поднялась без проблем - отлично!

Смотрим:

uname -r


[root@server1 ~]# uname -r
2.6.18-53.1.19.el5.028stab053.14
[root@server1 ~]#


3. Поднимаем виртуальные тележки:

Итак как и говорилось необходимо поднять 3 тележки, сразу определимся с их назначением:

1. Полноценный Веб-сервер Bind+Nginx+php-fpm с айпи адресом 10.0.0.2;
2. Мастер сервер MySQL c айпи адресом 10.0.0.3;
3. Слейв сервер MySQL куда будет реплицироваться база с айпи 10.0.0.4;

Итак, перед тем как создавать виртуальные машины на OpenVZ, нам необходимо иметь так называемый тимплейт - заготовку виртуалки, которую мы хотим использовать и положить его в /vz/template/cache директорию. Виртуальные машины будут создаваться из этого тимплейта. Мы можем найти список уже созданных тимплейтов на OpenVZ WiKi.

И, т.к. мы хотим использовать CentOS 5 в наших виртуалках, то мы должны скачать CentOS 5 template:

cd /vz/template/cache
wget http://download.openvz.org/template/precreated/contrib/centos-5-i386-default.tar.gz


Теперь разберем небольшой списочек команд, которые могут нам понадобиться при работе с виртуальнымим машинами OpenVZ:

Для создания VPS из дефолтного тимплейта CentOS 5 - мы должны запустить следующую команду:

vzctl create 2 --ostemplate centos-5-i386-default --config vps.basic


2 - Уникальный номер - каждая машина должна иметь свой уникальный айди. Например очень удобно создавать виртуальные машины по последнему значению IP-адреса, например: если айпи адрес вашей машины 10.0.0.2, то вы можете использовать 2 как ID или любой другой ;).

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

vzctl set 2 --onboot yes --save


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

vzctl set 2 --hostname test.example.com --save
vzctl set 2 --ipadd 10.0.0.2--save


Далее нам необходимо указать количество используемых сокетов и используемые ДНС:

vzctl set 2 --numothersock 120 --save
vzctl set 2 --nameserver 213.133.98.98 --save


Так же можно напрямую редактировать файл конфигурации виртуальной машины в обход использования vzctl, хранящийся в
/etc/vz/conf директории. Если айди машины 2,то конфиг будет /etc/vz/conf/2.conf.

Запустить виртуалку:

vzctl start 2


Чтобы установить пароль рута для виртуалки запустим:

vzctl exec 2 passwd


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

vzctl enter 2


Для выхода с консоли наберите:

exit


Для остановки машины набрать следующее:

vzctl stop 2


Перезапуск:

vzctl restart 2


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

vzctl destroy 2


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

vzlist -a


[root@server1 cache]# vzlist -a
      VEID      NPROC STATUS  IP_ADDR         HOSTNAME
       101         18 running 192.168.0.101   test.example.com
[root@server1 cache]#


Ресурсы занятые конкретной виртуалкой:

vzctl exec 2 cat /proc/user_beancounters


[root@server1 cache]# vzctl exec 2 cat /proc/user_beancounters
Version: 2.5
       uid  resource           held    maxheld    barrier      limit    failcnt
      101:  kmemsize        1508202    1661695   11055923   11377049          0
            lockedpages           0          0        256        256          0
            privvmpages        5430       7102      65536      69632          0
            shmpages            381        381      21504      21504          0
            dummy                 0          0          0          0          0
            numproc              19         21        240        240          0
            physpages          2489       2775          0 2147483647          0
            vmguarpages           0          0      33792 2147483647          0
            oomguarpages       2489       2775      26112 2147483647          0
            numtcpsock            5          5        360        360          0
            numflock              3          4        188        206          0
            numpty                0          1         16         16          0
            numsiginfo            0          2        256        256          0
            tcpsndbuf         44720          0    1720320    2703360          0
            tcprcvbuf         81920          0    1720320    2703360          0
            othersockbuf      13144      14356    1126080    2097152          0
            dgramrcvbuf           0       8380     262144     262144          0
            numothersock         11         13        120        120          0
            dcachesize            0          0    3409920    3624960          0
            numfile             503        531       9312       9312          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            numiptent            10         10        128        128          0
[root@server1 cache]#


Хорошо если failcnt колонка содержит одни нули; Если нет, это означает, что ВМ необходимо больше ресурсов. Откройте файл конфигурации /etc/vz/conf и увеличте необходимое значение, потом перезапустите ВМ.

Для автозапуска сервиса OpenVZ выполним следующую команду:

# /sbin/service vz start


Настройка сети в VM через нат

# vzctl set 2 --ipadd 10.0.0.2 --save
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


После этого в контейнере мы уже можем использовать инет.

Если нужно чтобы контейнер с частным (private) ip был доступен из внешнего мира, к примеру чтобы apache в VM и в контейнере были доступны.

# iptables -t nat -A PREROUTING -p tcp -d ip --dport 8080 -i eth1 -j DNAT --to-destination vps_ip:80
# iptables -t nat -A POSTROUTING -s vps_ip -o eth1 -j SNAT --to ip


После примернения этих правил, по ip у нас будет доступна HN, по ip:8080 будет доступен NGINX в контейнере.

Днс решено всё-таки поставить на хостовую тележку, потому как не известно как будет вести себя bind из под виртуалок, слишком много неизвестных)

Приятная статейка по настройка DNS на CentOS;

Находим named.conf и добавляем в него описание новой зоны:

zone "sdl.local"
{
    type master;
    file "data/sdl.local";
    allow-update
    notify no;
};


Файл зоны выглядит примерно так:

$ORIGIN .
$TTL 86400    ; 1 day
sdl.local        IN SOA<>host.sdl.local. root.host.sdl.local. (
                         2009060613 ; serial
                         43200      ; refresh (12 hours)
                         3600       ; retry (1 hour)
                         604800     ; expire (1 week)
                         3600       ; minimum (1 hour)
                          )
                         NS           localhost.
                         A              127.0.0.0
$ORIGIN m-i.home.
vm2                            A            10.0.0.2
vm3                            A            10.0.0.3
vm4                            A            10.0.0.4



3.1 Итак создаем первую виртуалку с Веб-сервером:

Первая виртуалчка с ID 2, т.к. первый айпи и айди оставим за хостом.

vzctl create 2 --ostemplate centos-5-i386-default --config vps.basic


Поставим её в автозапуск
vzctl set 2 --onboot yes --save


Назначим хостнейм:
vzctl set 2 --hostname test.sdl.local --save
vzctl set 2 --ipadd 10.0.0.2--save

vzctl set 2 --numothersock 120 --save
vzctl set 2 --nameserver 127.0.0.1 --save


Запускаем:
vzctl start 2


Задаем рутовый пароль:
vzctl exec 2 passwd


ГОЛИМЫЙ МЕТОД!!!!
Устанавливаем Nginx + PHP-FPM(Установке потребуется MySQL, поэтому ставим на пример на виртуалку с ID 2)

Вот статейка по которой буду делать
Вот еще одна.

Сначала установим некоторые зависимости:

# yum install gcc libjpeg-devel libpng-devel libmcrypt libmcrypt-devel pcre pcre-devel libxml2-devel mysql-devel


последние две зависимости необходимы для корректного конфигурирования сорцов

теперь тянем патч и сорцы

# wget http://php-fpm.org/downloads/php-5.2.14-fpm-0.5.14.diff.gz
# wget http://ru2.php.net/get/php-5.2.14.tar.gz/from/ar.php.net/mirror

Разархивируем и применим патч

# tar xvf php-5.2.14.tar.gz
# gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1

# yum -y install curl-devel

Конфигурим получившееся и устанавливаем:

# ./configure --enable-fastcgi --enable-fpm --with-mcrypt --enable-mbstring --enable-mysql --with-mysql=/usr/include/mysql --with-mysql-sock=/tmp/mysql.sock --with-curl --with-sockets --with-gd --with-zlib --with-iconv --with-dom --with-jpeg-dir=/usr/lib
make
make install 


Устанавливаем init-script PHP-FPM

# cd /etc/init.d/
# ln -s /usr/local/sbin/php-fpm php-fpm


Делаем автозапуск php-fpm

# nano /etc/rc.local
/etc/init.d/php-fpm start

Добавим юзера для PHP-FPM

# useradd www-data
# usermod www-data -G www-data


Редактируем /usr/local/etc/php-fpm.conf

# nano /usr/local/etc/php-fpm.conf


НОРМАЛЬНЫЙ МЕТОД!!!!

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

rpm -Uvh http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
yum  --enablerepo=epel install php-fpm

# nano /etc/php-fpm.conf

# /etc/init.d/php-fpm start



Установка Nginx
Подключим репозиторий EPEL

]# yum  --enablerepo=epel install nginx


Приведу пример части конфига из ветки http:
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$gzip_ratio"'
'"$got" "$sent_http_set_coockie"';

access_log /var/log/nginx/access.log main;
'"$got" "$sent_http_set_coockie"'; — это мне требуется для логгирования с установленным модулем custom-nginx-session-module (Модуль для определения куки и установки уникальной сессии). О процессе установки и настройки могу рассказать позже, если кому-то будет интересно. А то, что выше — обычное логгирование.

Еще подразумевалось использование виртуальных хостов, поэтому для удобства я решил вынести это в отдельные файлы:
include /etc/nginx/conf.d/*.conf;

Приведу пример — файл /etc/nginx/conf.d/one.conf:
server {
listen 80;
server_name www.sdl.local;
# Разумеется, мне нужен лог для каждого виртуального хоста
access_log /var/log/sdl_local-access.log;
error_log /var/log/sdl_local-error.log;

# Указываем корень где будет лежать сайт
root /var/www/sdl.local/html;

# Всю статику отдаем nginx
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js|bmp)$ {
root /path/to/www;
}

# Помните прикол с свн? :) На всякий случай учел
location ~ /.svn/ {
deny all;
}

# Переписывание всех запросов к несуществующему документу на index.php,
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}

# Передача файлов, имена которых заканчиваются на .php на интерфейс fastCGI (php-fpm)
location ~ \.php$ {

# Адрес и порт, который мы указали в конфиге php-fpm.conf
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param script_FILENAME /var/www/sdl.local/html$fastcgi_script_name;
include fastcgi_params;
}
}


Разумеется, это пример стандартного минимального конфига, все остальное вписывается\убирается\редактируется в зависимости от поставленных задач.

Вроде ничего не забыл. Запускаем php-fpm и nginx:
/etc/init.d/php-fpm start
/etc/init.d/nginx start
[/blockquote]


3.2 Вторую и третью машины создадим по подобию и установим на них MySQL, как показано ниже:

Установка MySQL:

Удаляем всё старое, если было:

yum remove mysql-server
yum remove mysql


Для установки МуСкуля запустим эти команды, которые должны привезти всё нам необходимое

yum install mysql-server
yum install mysql
yum install mysql-devel


Если используем MySQL совместно с PHP, а мы используем, поэтому ставим пакетик:
# yum install php-mysql


По умолчанию MySQL устанавливается без пароля, поэтому нам необходимо установить пароль на рута, сделать можно следующим образом:

# mysql
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD('rootpwd') WHERE user='root';
mysql> FLUSH PRIVILEGES;


Поднимаем репликацию между серверами:

Итак, представим, что у нас есть 2 виртуальных сервачка первый сервак с айпи 10.0.0.1 и резервный 10.0.0.2. Смотрим чтобы не мешался сетевой экран. На основном сервере мы должны создать специального пользователя для целей репликации и дать ему необходимые права:

# mysql -u root -p
mysql> use mysql;
mysql> INSERT INTO user (Host,User,Password) VALUES('%','replicant',PASSWORD('mysql'));
mysql> flush privileges;



GRANT REPLICATION SLAVE, REPLICATION CLIENT
    ON *.*
    TO 'replicant'@'10.0.0.2'
    IDENTIFIED BY 'mysql';


где соответственно replicant вы можете заменить на любое другое имя пользователя, а mysql на придуманый вами пароль

Далее в наш /etc/my.cnf, в секцию [mysqld] вы должны добавить строчки:

server-id = 1
log-bin = /var/log/mysql/bin.log


Перед перезапуском MySQL-сервера с этими строчками в /etc/my.cnf озаботьтесь, чтобы каталог /var/log/mysql существовал, чтобы владелец и группа у него были "mysql" и чтобы у пользователя "mysql" были полные права на этот каталог.

На дополнительном сервере настройка несколько сложней. В /etc/my.cnf в секцию [mysqld] вы должны добавить строки:

server-id = 2

master-host = 10.0.0.1
master-port = 3306
master-user = replicant
master-password = mysql

log-bin = /var/log/mysql/bin.log
log-bin-index = /var/log/mysql/log-bin.index
log-error = /var/log/mysql/error.log

relay-log = /var/log/mysql/relay.log
relay-log-info-file = /var/log/mysql/relay-log.info
relay-log-index = /var/log/mysql/relay-log.index


Как и на основном сервере, не забудьте про каталог /var/log/mysql! Также не забудьте подставить вместо replicant то самое имя пользователя и вместо mysql тот самый пароль, как было сказано выше.

Перезапустите основной и дополнительный серверы

Теперь на основном сервере вы делаете дамп БД с помощью mysqldump:

mysqldump --user=root --password=rootpwd \
      --extended-insert --all-databases \
      --master-data  > /tmp/backup.sql


Не забудьте, что вместо rootpwd вы должны написать реальный пароль пользвателя root для MySQL. Специальный ключ --master-data добавит в файл дампа строки вида:

--
-- Position to start replication from
--

CHANGE MASTER TO MASTER_LOG_FILE='bin.000846' ;
CHANGE MASTER TO MASTER_LOG_POS=427 ;


которые впоследствие укажут резервному серверу какие данные с момента выполнения резервной копии на нём отсутствуют.

Далее, скопируйте файл /tmp/backup.sql на резервный севрер и загрузите его командой:

mysql --user=root --password=rootpwd < /tmp/backup.sql


А теперь, выполните на резервном сервере команду:

START SLAVE;


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

Резервное копирование:

Теперь, всё что нужно для выполнения резервного копирования, это на резервном сервере дать команду:

STOP SLAVE;


которая остановит репликацию с основным сервером. Затем выполнить на резервном сервере резервное копирование БД и снова запустить репликацию, командой:

START SLAVE;


Вы можете автоматизировать весь процесс, с помощью вот такого скрипта и крона:

#!/bin/sh

date = `date +%Y%m%d`

mysqladmin --user=root --password=root_password stop-slave
mysqldump --user=root --password=my_pwd --lock-all-tables \
          --all-databases > /backups/mysql/backup-${date}.sql
mysqladmin --user=root --password=root_password start-slave



Проверить работу php-fpm можно при помощи простенького php-файлика:

# nano index.php

 





Вас также может заинтересовать:

Установка Centos 6
Установка GeoIP (Centos, Red Hat)
Установка 1C 8.2 под PostgreSQL на CentOS 6.3
Установка GitWeb на Centos 5.5
Установка PHP-SQLite в CentOS из SRC-RPM
OpenVZ Web Panel - Open Virtuozzo Web Panel, веб-панелька для управления виртуальными машинами на Parallels OpenVZ