Pull to refresh

Создание хостинга сайтов на базе Proxmox + HP ProLiant

Reading time 11 min
Views 22K
Доброе время суток.

Итак, обратились ко мне с задачей переезда на собственный сервер с трех VPS около 100 сайтов, в том числе новостей с базой данных MySQL размером около 20 Гб, и общим весом мелких (в основном) файлов на хостинге около 500 Гб.
Сам сервер был установлен без моего участия в стойку провайдера, даны два IP адреса — доступ к админке сервера и IP адрес хостинга.
Картинки для привлечения внимания:
imageimage

Конфигурация сервера:

Proc 1: 2267 MHz
Execution technology: 6/6 cores; 12 maximum threads
Memory technology: 64-bit capable
Processor 1 Internal L1 Cache: 192 KB
Processor 1 Internal L2 Cache: 1536 KB
Processor 1 Internal L3 Cache: 12288 KB
Proc 2: 2267 MHz
Execution technology: 6/6 cores; 12 maximum threads
Memory technology: 64-bit capable
Processor 2 Internal L1 Cache: 192 KB
Processor 2 Internal L2 Cache: 1536 KB
Processor 2 Internal L3 Cache: 12288 KB

HDD:
1 PLEXTOR PX-256M
2 WDC WD1000DHTZ

ОЗУ
PROC 1 DIMM 4B: 16384 MB 1333 MHz
PROC 1 DIMM 6C: 16384 MB 1333 MHz
PROC 2 DIMM 4B: 16384 MB 1333 MHz
PROC 2 DIMM 6C: 16384 MB 1333 MHz


По желаемому на сервере:
1. Windows 2012 Server для каких-то целей, связанных с 1С.
2. Основной хостинг (высоконагруженный).
3. Машина для тестов

В процессе настройки убедил хозяев приобрести еще один IP — адрес для тестовой машины

Приобретены две лицензии ISP Panel для основного хостинга и тестового хостинга.

Собственно с выбором *nix ОС вариантов не было, настаивали на CentOS 6.

Приятно поразила админка сервера — все удобно, понятно.
Итак, виртуализацию (исходя из задач) решил делать на ProxMox, для чего качнул образ диска .
В админке зацепил образ со своей машины, как образ CD- диска в разделе virtual media. Был удивлен тем, что образ не был залит на сервер, а вытягивался прямо с моей машины по мере загрузки. Весь процесс установки занял около 1.5 часов. У меня канал 60 Мб, но тут еще народ работает смотрит онлайн и качает медиа-файлы.
Что надо отметить: на ssd установлен proxmox, разметку диска отдал на откуп инсталляции, все «по умолчанию». То есть WD остался девственно-чистым.
В итоге на IP адресе хостинга имеем админку Proxmox по адресу: IP:8006/.
Надо сказать, что по времени был ограничен, поэтому сильно не ковырялся с машинами «CT», попробовал залить и взлететь взлететь шаблон CentOS, однако он показывал только черный экран. Надо сказать, что до этого я поднимал шаблоны для CT машин у себя на локальном сервере. ИМХО их преимущество — доступ ко всем ресурсам сервера.

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

С WD (/dev/sdb), который должен быть основным хранилищем поступил следующим в консоли Proxmox образом по статье отсюда:

0. aptitude update && aptitude upgrade
1. pvcreate /dev/sdb
2. vgcreate ws /dev/sdb
3. lvcreate -n data -L980G ws (размер 980 не помню как вычислил, по моему понижал от Террабайта по 10 гигов)
4. mkfs.ext4 -L data /dev/ws/data
тут пришлось достаточно долго посидеть глядя на циферки, бегущие в консоли, поэтому между пунктом 0 и пунктом 1 лучше вставить aptitude install screen. Тогда пункт 4 изменится таким образом: screen -dmS createfs mkfs.ext4 -L data /dev/ws/data
5. echo "/dev/ws/data /var/lib/ws ext4 defaults 0 1" >> /etc/fstab
6. mount -a


Таким образом я получил дополнительное хранилище для виртуальных дисков машин.
А вот swap файлы было решено размещать на ssd. Про это ниже.

Про настройки прав доступа. Так как пользователь будет не root, то заводим его и даем права доступа на хранилище и машины. Для этого зашел в датацентр, закладка группы, создал группу «users». Ввел пользователя в группу «users», в закладке пользователи.
Надо отметить, что если мы заходим рутом, то в форме авторизации Proxmox необходимо выбрать авторизацию ОС — «pam», пользователя я же завел уже с авторизацией непосредственно из базы пользователей proxmox, поэтому при входе необходимо выбирать тип авторизации «pve».
Так же очередной «ЗЮ» в сторону создателей Proxmox — прикрутить бы генерацию паролей в админку, неудобно заводить пользователей количеством более одного.
Идем в Датацентр, закладка Разрешения и добавляем группе «users» админские права (ну хозяева же) на доступ к хранилищу ws, и на создание виртуальных машин. Пока достаточно.

Сначала решил создать машину для тестового хостинга. Создаем VM «tests» (машина 100) со следующими характеристиками:
ОЗУ 4 Гб; процессор «по умолчанию kvm64», СД — привод образ CentOS, HDD — образ диска от vmvare (vmdk), кэширование write back, 120 Gb на хранилище ws, сетевая Intel на бридже vmbr0. Про сетевые функции расскажу чуть ниже, когда будем делать хостинг для рабочих сайтов.
Ставим centos, цепляем репозитории, обновляемся, ставим mc. atop, настраиваем resolv.conf и прочее прочее. На этом остановил виртуальную машину подумал.
Так как я потратил на установку образа ОС час, то я решил оптимизировать этот процесс для следующих n-машин. Поэтому в консоли зашел /var/lib/ws/images/100, и скопировал образ диска vmdk в папку /home
Устанавливаем ip адрес интерфейса eth0 виртуальной машины (пока из консоли proxmox).

cd /etc/sysconfig/network-scripts
cat ifcfg-eth0
DEVICE=eth0
HWADDR= (ваш mak адрес, можно посмотреть в админке proxmox)
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=<то, что дал провайдер>
NETMASK= <то, что дал провайдер>
GATEWAY= <то, что дал провайдер>
DNS1=8.8.8.8
DNS2=8.8.4.4

service network restart


Далее с сайта ISPmanager раздел установка разворачиваем необходимые сервисы. Некоторое время прошло, машина взлетела, заработала. Ничего не стал трогать в конфах, оставил все по-умолчанию.

Что касается опций proxmox для виртуальной машины, то необходимо оговориться:
1. Запуск при загрузке — ставлю «Да» или «Нет» руками. По-умолчанию «Нет», будьте внимательны.
2. CPU units -совершенно неясная штука, которая тем не менее влияет на производительность виртуалок. Пошел следующим путем:

vzcpucheck в консоли proxmox. 
vzcpucheck Current CPU utilization: 4000 
OpenVZ VM is getting 1000 divided by 906755 and multiplied by 100 = 0.1% of the CPU time
So if I want to give 5 percent of guaranteed time to my VPS, I would enter CPU Units = 45337


Надо сказать для каждой созданной машины так и сделал — CPU Units = 45000.

Что делать с высоко нагруженным хостингом мысль зрела давно:
Создать виртуалок по принципу один сервер — один сервис. Кроме того, раз у нас proxmox имеет внешний IP хостинга, то будем ipfirewall разводить подключения в нужные нам машины. Так же создаем «внутреннюю» сетку, например 192.168.12.0/24.
В Proxmox для этого решил поднять интерфейс dummy:

modprobe dummy

Далее в админке Proxmox, Датацентр — Сеть создаем vmbr1 (бридж) на базе интерфейса dummy.
Задаем ip адрес proxmox 192.168.12.1. Подготовка сделана.
Поехали.
1 машина: mysql (vm101). Опытным путем было выяснено, что база такого объема данных (20Гб) хорошо существует на 27 Гб ОЗУ. Процессор 4 сокета по 3 ядра. А вот хард цепляем как и машина №1. Когда Proxmox создает машину, копирую из /home образ hdd первого CentOS (если Вы помните, там не настроена сеть и hostname, но все уже обновлено и готово к запуску). Сетевая карта на бридже vmbr1
Настраиваем сетевой интерфейс. Так как eth0 у нас остался на машине для тестов, то нужно создать в /etc/sysconfig/network-scripts файл ifcfg-eth1 следующего содержания:
cd /etc/sysconfig/network-scripts
cat ifcfg-eth1
DEVICE=eth1
HWADDR= (ваш mak адрес, можно посмотреть в админке proxmox)
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.12.10
NETMASK= 255.255.255.0
GATEWAY= 192.168.12.1
DNS1=8.8.8.8
DNS2=8.8.4.4

service network restart


Ставим необходимый репозиторий Percona и сам Percona.
Конфиг mysql привел ниже (частично он переехал со старого сервера, частично был оптимизирован) :
cat my.cnf
[mysqld]
user=mysql
skip-external-locking
low-priority-updates

port= 3306
wait_timeout = 120

#На случай погибели базы раскомментировать
#innodb_force_recovery = 5

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0

key_buffer              = 256M
key_buffer_size         = 256M
max_allowed_packet      = 4M
thread_stack            = 2048K
thread_cache_size       = 8086
thread_concurrency      = 8

query_cache_limit       = 1G
query_cache_size        = 1G

#myisam-recover          = BACKUP
max_connections         = 1400
table_definition_cache  = 8000

join_buffer_size       =4M

tmp_table_size         = 768M
max_heap_table_size    = 768M
max_tmp_tables = 500
character-set-server = utf8
expire_logs_days=2
innodb_data_home_dir=/var/lib/mysql
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/lib/mysql
innodb_file_per_table=1

# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_open_files=1200
innodb_buffer_pool_size = 22G
innodb_buffer_pool_instances = 22
innodb_additional_mem_pool_size = 512M

# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
innodb_lock_wait_timeout = 50
innodb_flush_log_at_trx_commit = 2
innodb_flush_method=O_DIRECT
innodb_doublewrite=0
innodb_support_xa=0
innodb_checksums=0
innodb_io_capacity = 120
max-connect-errors = 10000

back_log = 500
binlog_cache_size = 1M
sync_binlog = 0
key_cache_division_limit=70

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 64M
write_buffer = 64M
key_cache_division_limit=70

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


Что касается установки nginx как proxy к apache, то на эту тему куча статей. Плюс в той же виртуалке завожу exim + dovecot с базой в MySQL.
Виртуальная машина nginx (vm102). Образ диска взят так же копированием после создания виртуальной машины. CPU 3 сокета, 3 ядра; ОЗУ 4 Гб. Сетевая карта на бридже vmbr1.
Приведу конфиг nginx.
cat nginx.conf
user  nginx;
worker_processes  6;
#Если будет чудить, раскомментировать следующие две строки, а предыдущую закомментировать. 
#worker_processes auto;
#worker_cpu_affinity 010000 100000 001000 000100 000010 000001;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  2048;
    }

http {
    include       /etc/nginx/mime.types;
    default_type   text/html;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout   20;
    tcp_nodelay        on;

    gzip  on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_types  text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    client_max_body_size 64m;

    include /etc/nginx/conf.d/*;
}

cd /etc/nginx/conf.d
cat default

server {
        listen   *:80; ## listen for ipv4; this line is default and implied
        access_log /var/log/nginx/access.log;
        location /nginx_status {
            stub_status on;
            access_log  off;
            allow       127.0.0.1;
            deny        all;
        }
        server_name nginx.xxx.ru;

location / {
        proxy_pass http://192.168.12.20:80/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 60;
        proxy_send_timeout 60;
        proxy_read_timeout 90;
    }

}


192.168.12.20 — адрес apache с ISPManager-ом
192.168.12.30 — адрес nginx (и exim), то бишь машина, которая смотрит в сеть, на которую будем заворачивать траффик по портам http/https/mail


Создаем apache (vm103). CPU 4 сокета по 2 ядра, ОЗУ 16 Гб, 1-ый HDD 120 Gb для готового образа, второй HDD 500Gb для сайтов, Сетевая карта на бридже vmbr1. Переливаем образ уже установленного CentOS, настраиваем:

cd /etc/sysconfig/network-scripts
cat ifcfg-eth1
DEVICE=eth1
HWADDR= (ваш mak адрес, можно посмотреть в админке proxmox)
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.12.20
NETMASK= 255.255.255.0
GATEWAY= 192.168.12.1
DNS1=8.8.8.8
DNS2=8.8.4.4

service network restart


Как нам установить ISPManager на хостинг, расположенный внутри локальной сети? Ничего более умного в голову не пришло, кроме как задать ProxMox другой доступный нам IP адрес — от машины tests, машине tests отключить автозапуск, и на время перевести сетевой интерфейс в бридж vmbr0. После ребута Proxmox, внутри машины apache(vm103):
cd /etc/sysconfig/network-scripts
cat ifcfg-eth1
DEVICE=eth1
HWADDR= (ваш mak адрес, можно посмотреть в админке proxmox)
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=<то, что дал провайдер>
NETMASK= <то, что дал провайдер>
GATEWAY= <то, что дал провайдер>
DNS1=8.8.8.8
DNS2=8.8.4.4

service network restart


Цепляем HDD 500 GB на /var/www:

fdisk /dev/sdb
<<создаем раздел размером с диск>>
mkfs.ext4 -L data /dev/sdb1
echo "/dev/sdb1 /var/www ext4 defaults 0 1" >> /etc/fstab
6. mount -a


Далее с сайта ISPmanager раздел установка разворачиваем необходимые сервисы.
Отключаем Posfix, courier (у нас же почтовик не тут), прочие ненужные сервисы по вкусу. Выключаем mysql, говорим ISPmanager-у что сервер mysql находится на другой машине. Это делается из ISPManager-а в разделе MySQL.
Возвращаем настройки как было (apache vmbr1, 192.168.12.20; tests автозапуск при загрузке; proxmox ip — адрес хостинга).
В proxmox (192.168.12.1; <Реальный IP>) добавляю в rc.local проброс порта 1500 (админка ISPManager) на apache (192.168.12.20), проброс ssh к виртуалкам, проброс портов на nginx:
cat /etc/rc.local
/sbin/iptables -F
/sbin/iptables -X

/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 22003 -j DNAT --to-destination 192.168.12.10:22003
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 22002 -j DNAT --to-destination 192.168.12.20:22002
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 22004 -j DNAT --to-destination 192.168.12.30:22004
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 1500 -j DNAT --to-destination 192.168.12.20:1500

#nginx
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 80 -j DNAT --to-destination 192.168.12.30:80
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 445 -j DNAT --to-destination 192.168.12.30:445
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 443 -j DNAT --to-destination 192.168.12.30:443
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 25 -j DNAT --to-destination 192.168.12.30:25
/sbin/iptables -t nat -A PREROUTING -p tcp -d <реальный IP> --dport 110 -j DNAT --to-destination 192.168.12.30:110



Что касается запуска IPSManager, который требует на локальной машине ip, к которому привязана лицензия, то решил так же через интерфейс dummy. Ему выдаю необходимый ip адрес, потом делаю ifconfig dummy down. Раньше этого не делал, но сайты настроены так, что берут картинки для отображения по адресу вида имя сайта/images/.../.../...jpg.
Поэтому если интерфейс не гасить, то получается так:
nslookup <имя сайта> возвращает <ip реальный> 
- Где у нас IP реальный? - спрашивает httpd. 
- Да вот же он, у меня тут поднят - отвечает ОС. 
А там апач не запущен, нет ничего. Соответственно получаем пустоту вместо картинки. 


Обещал рассказать про swap раздел на SSD-диске. Тут все достаточно просто, создаем образ диска в хранилище default, собственно куда и ставили Proxmox. Задаем необходимый размер образа. Затем подключаем разделы так:

mkswap /dev/sd<буква диска>
cat /proc/swaps 
swapoff -v /dev/sda<номер раздела своп> (это выключает старый swap
swapon /dev/sd<буква диска>


Напоследок приведу fstab машины с apache (там виртуальных дисков больше всего).

 cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Tue Mar 11 15:57:46 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=43977fc1-b315-4c84-8d4e-147f4063a60e /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2
/dev/sdc                      swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb1          /var/www         ext4    defaults        1 2 noatime,nodiratime,noacl,data=writeback,commit=15


Обратите внимание на последнюю строку файла fstab. Значительно ускорил работу файловой системы установкой после 1 2. До этого долго рыл всевозможные форумы и слепил такую строку из того, что накопал. Сборная солянка, так сказать.

В принципе так или иначе все работает и летает уже 2 недели, то есть тестовый период прошел.
Что касается бекапа (BACKUP), то предложил пойти очень простым путем — взять WD Live Book гига этак на 3, включить на нем ftp и лить туда снапшоты виртуальных машин, которые успешно создает ProxMox.
Что касается проброса пассивного FTP, я его еще не сделал. Смысл в том, что необходимо пробросить на apache порты 20, 21 и некое количество портов для пассивного соединения, а у меня этот проброс не получается. Ну не цепляется фтп из вне к моему серверу никак. Пока не горит, так что решаю по мере прихода вдохновения. Буду признателен за подсказку. Стоит сервер proftpd. Идея была следующая — жестко в конфиге прописать пул портов для пассивного режима FTP, и пробросить его внутрь из ProxMox. Пока не докопался как это делается.

Спасибо за внимание!
P.S. Тут пишут, что я статью эту редактировать не могу, вычитывал 30 минут, вроде все чисто. Приношу извинения за вольные и невольные вульгаризмы в тексте, ошибки или опечатки.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+1
Comments 24
Comments Comments 24

Articles