Виртуальный хостинг в Gentoo

Данная статья подойдет для организации либо небольшого провайдера, желающего предоставлять услуги виртуального хостинга: место под веб страницы, фтп, почта, домены, база данных и т. д. В качестве панели управления выбрана бесплатная панель Virtualmin, которая является модулем Webmin.

Что мы получим в итоге? Хостинг-клиентам можно будет предоставлять следующие услуги:
- размещение WEB сайтов, в том числе и SSL
- создание персонального FTP сервера (в случае, если для клиента имеется уникальный IP)
- поддержка DNS зоны
- поддержка базы данных MySQL
- поддержка сервисов электронной почты для домена клиента
- отчеты по WEB сайту (Webalizer)
- доступ к панели управления собственным аккаунтом (редактирование настроек, создание баз данных, поддоменов, почтовых ящиков и т. д.)
- дисковая квота и возможность установки лимитов на сервер

Для каждого клиента будет создаваться свой домашний каталог, в /var/www:

/var/www/client/cgi-bin             каталог для размещения CGI скриптов
/var/www/client/logs                логи WEB сервера и FTP сервера
/var/www/client/public_html         DocumentRoot для основного WEB сайта клиента
/var/www/client/public_html/stats   директория с отчетами по WEB сайту (генерируются ежедневно)
/var/www/client/php.ini             персональный файл конфигурации PHP

Если у клиента несколько доменов/поддоменов, то они создаются в каталоге /var/www/client/domains и имеют аналогичную структуру.

Итак, приступаем! Сначала необходимо установить Gentoo на сервер, как описано в статье «Установка Gentoo«, затем нужно поставить почтовый сервер, как описано в статье «Почтовый сервер на Gentoo«. Сервер должен иметь доменное имя, (например devel.spnet.ru) и два IP адреса в разных подсетях класса С для поддержания DNS зон. Если все эти формальности соблюдены – идем дальше.

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

cat >> /etc/portage/package.use << end-of-text
media-gfx/imagemagick jpeg png tiff truetype xml wmf
www-apache/mod_suphp mode-force
end-of-text
cat >> /etc/portage/package.keywords << end-of-text
dev-php5/ZendOptimizer ~x86
end-of-text

Устанавливаем пакеты, которые нужны большинству php программистов. Сначала скачайте дистрибутив ZendOptimizer с http://www.zend.com/products/zend_optimizer (в моем случае это ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz) и поместите его в папку /usr/portage/distfiles

emerge dev-php5/ZendOptimizer imagemagick PEAR-PEAR

Устанавливаем mod_suphp и другие необходимые пакеты

emerge mod_suphp Net-SSLeay bind bind-tools webalizer proftpd quota

Устанавливаем webmin

cd /tmp ; wget http://prdownloads.sourceforge.net/webadmin/webmin-1.470.tar.gz http://download.webmin.com/download/virtualmin/virtual-server-3.69.gpl.wbm.gz http://download.webmin.com/download/virtualmin/virtual-server-theme-7.1.wbt.gz http://klyaznik.ru/files/webmin.tgz; tar zxvf webmin-1.470.tar.gz -C /usr/libexec; mv /usr/libexec/webmin-1.420 /usr/libexec/webmin

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

/usr/libexec/webmin/setup.pl ; emerge --config bind ; rc-update add proftpd default ; rc-update add named default ; rc-update add quota default ; sed -i -e 's#-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT#-A INPUT -p tcp -m tcp --dport 22 -j ACCEPTn-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT#g' /var/lib/iptables/rules-save ; /etc/init.d/iptables restart

Заходим в https://devel.spnet.ru:10000, идем в Webmin -> Webmin Configuration -> Webmin Modules. «Install from» устанавливаем в значение «From local file», в поле пишем «/tmp/virtual-server-3.59.gpl.wbm.gz», жмем кнопку «Install Module». теперь «Return to Webmin configuration» -> Webmin Themes. Устанавливаем тему, в поле рядом с «From local file» пишем «/tmp/virtual-server-theme-6.0.wbt.gz» и жмем кнопку «Install Theme». Теперь «Return to themes list», в окне «Current theme :» выбираем «Virtualmin Framed Theme» и жмем рядом кнопочку «Change».

Теперь конфигурируем virtualmin и другие пакеты:

tar zxvf /tmp/webmin.tgz -C /etc/webmin ;cp /etc/proftpd/proftpd.conf.sample /etc/proftpd/proftpd.conf

Правим файл /etc/suphp.conf

cat > /etc/suphp.conf << end-of-text
[global]
;Path to logfile
logfile=/var/log/apache2/suphp_log
;Loglevel
loglevel=warn
;User Apache is running as
webserver_user=apache
;Path all scripts have to be in
docroot=/var/www
; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false
;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=false
;Send minor error messages to browser
errors_to_browser=true
;PATH environment variable
env_path=/bin:/usr/bin
;Umask to set, specify in octal notation
umask=0027
; Minimum UID
min_uid=1000
; Minimum GID
min_gid=100
[handlers]
;Handler for php-scripts
x-httpd-php=php:/usr/lib/php5/bin/php-cgi
x-httpd-php5=php:/usr/lib/php5/bin/php-cgi
x-httpd-php4=php:/usr/lib/php4/bin/php-cgi
x-httpd-phtml=php:/usr/lib/php5/bin/php-cgi
;Handler for CGI-scripts
x-suphp-cgi=execute:!self
end-of-text

Активируем mod_suphp в apache, изменяем список DNS серверов, делаем дополнительные действия, которые требуются для установки

sed -i -e 's#-D PHP5"#-D SUPHP"#g' /etc/conf.d/apache2 ; sed -i -e 's#dns_servers=".*"#dns_servers="127.0.0.1"#g' /etc/conf.d/net ; sed -i -e 's#nameserver .*#nameserver 127.0.0.1#' /etc/resolv.conf ; touch /var/log/user.log ; mkdir /etc/skel-www ; cp /etc/php/cgi-php5/php.ini /etc/skel-www
cat > /chroot/dns/etc/bind/named.conf << end-of-text
logging {
category lame-servers {
null;
};
category default {
null;
};
};
options {
directory "/var/bind";
listen-on-v6 { none; };
auth-nxdomain yes;
allow-recursion { 127.0.0.1; };
check-names master ignore;
check-names slave ignore;
check-names response ignore;
version "[REFUSED]";
pid-file "/var/run/named/named.pid";
};
zone "COM" { type delegation-only; };
zone "NET" { type delegation-only; };
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "pri/localhost.zone";
allow-update { none; };
notify no;
};
zone "127.in-addr.arpa" IN {
type master;
file "pri/127.zone";
allow-update { none; };
notify no;
};
end-of-text
sed -i -e 's#/dev/md3                /               ext3            noatime         0 1#/dev/md3                /               ext3            noatime,grpquota,usrquota         0 1#g' /etc/fstab

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

crontab -e
0 3 * * 0 /usr/sbin/quotacheck -avugf

Добавляем пользователя localhost, от которого будут работать почтовые веб интерфейсы и вносим необходимые изменения в конфигурацию apache (замените 192.168.2.1 на Ваш первый IP адрес)

useradd -s /sbin/nologin -d /var/www/localhost localhost ; usermod -a -G localhost apache ; chown localhost:localhost /var/www/localhost ; chown localhost:localhost /var/www/localhost/htdocs/squirrelmail -R ; chown localhost:localhost /var/local/squirrelmail/attach -R
sed -i -e 's#<VirtualHost *:80>#<VirtualHost 192.168.2.1:80>#g' -e 's#^NameVirtualHost *:80##NameVirtualHost *:80#g' /etc/apache2/vhosts.d/00_default_vhost.conf
sed -i -e 's#DocumentRoot "/var/www/localhost/htdocs"#DocumentRoot "/var/www/localhost/htdocs"\nSuPHP_UserGroup localhost localhost#g' /etc/apache2/vhosts.d/default_vhost.include

Заходим в https://devel.spnet.ru:10000, Webmin -> Servers -> MySQL Database Server. Вводим логин root и пароль на базу данных. Теперь жмем Refresh Modules. Идем в Webmin -> System -> Disk Quotas. Жмем «Enable Quotas». После этого идем в Virtualmin -> System Settings -> Re-Check Config. Теперь идем в System Information -> Status и запускаем все не запущенные до сих пор службы. Идем в Virtualmin -> System Settings -> Server Templates. Жмем на «Custom» в столбце «BIND?». В окне «BIND DNS records for new domains» вписываем вместо 192.168.1.1 свой второй IP адрес, жмем внизу кнопочку «Save». Аналогично меняем 192.168.1.1 на свой второй IP в шаблонах «Email message». Идем в Virtualmin -> System Settings -> Bandwidth Monitoring, ставим «Bandwidth monitoring active?» в «Yes», жмем кнопку «Save».

Дополнительно можно включить автообновления Webmin и Vurtualmin: Webmin -> Webmin Configuration -> Upgrade Webmin -> Scheduled update. Ставим крыжики «Scheduled updating currently enabled», «Update from http://www.webmin.com», «Install modules that are not currently installed», «Update non-core modules as well», жмем «Save and Apply».

Немного повысим безопасность сервера, убрав лишние атрибуты на чтение

chmod o-rwx /etc/proftpd /etc/skel-www

Добавляем ротацию логов для proftpd

cat >>/etc/logrotate.d/syslog-ng <<end-of-text
# proftpd
/var/log/xferlog {
sharedscripts
postrotate
/etc/init.d/syslog-ng reload > /dev/null 2>&1 || true
endscript
}
end-of-text

За рамками данной статьи остались настройки лимитов и других параметров хостинга, а также grsec RBAC (Role Based Access Control), однако я готов ответить на Ваши вопросы. Приятного хостинга!

Комментарии запрещены.