* <intro::Services>
Итак, в первую очередь важно определиться с тем, какие именно сервисы наш хостинг будет предоставлять клиентам. Основные вещи, которые любой хостинг предоставить обязан - это Web + PHP/Perl, FTP, БД и статистику посещений сайта. Многие хостеры подходят к вопросу поднятия хостинга просто: купили Cpanel, запустили install.sh и продаем аккаунты юзерам. Мы же соберем свой собственный хостинг, с самого начала и до победного конца .
* Выбор софта
Сразу оговорюсь, что предпочитаю использовать стабильный и надежный софт, нежели новый и крутой. Нам важна стабильность и функциональность. А всякие, грубо говоря, свистелки и перделки мы оставим скрипткидисам на разнос. Итак, для www, я думаю, не возникнет сомнений - Apache. Ветка 2.* еще довольно сыровата, да и почти под каждую новую версию двойки появлялся бронебойный эксплойт, зачастую даже в паблике. Использовать будем проверенный временем 1.3. FTP - тут выбор не столь однозначен, есть много разных FTPd, но мы остановимся на pure-ftpd. У него удобный и понятный конфиг, отлично реализована работа с виртуальными юзерами, достаточная функциональность и много других достоинств, о которых - ниже. БД, разумеется, MySQL. И опять мы берем самую стабильную версию - 4.0.*. Статистика: можно взять Webalaizer, но лично я предпочитаю AwStats. Его отчетность намного лучше выглядит, интуитивно более понятна, да и подробности анализа ему не занимать.
Структура директорий
Условимся, что мы используем следующую структуру директорий:
* /usr/home/юзер – домашняя дира юзеров;
* /usr/home/юзер/web – рутовая веб-папка юзера;
* /usr/home/юзер/tmp – темп-дира юзера;
* /usr/home/юзер/cgi-bin – cgi-bin юзера;
* /etc и /usr/local/etc – папки с конфигами;
* /etc/awstats – папка конфигов статистики;
* /var/db/awstats – папка с БД статистики;
* /var/log/www – папка с логами виртуальных хостов
* Apache
Кроме обычных клиентов с мега-порталами и домашними страничками, услугами хостинга пользуются еще и много коммерческих организаций, в частности, инет-магазины. Поэтому нам нужна возможность предоставлять им https. На сегодняшний день существуют две основные релизации SSL для Apache. Это Apache-ssl, поддерживаемый самой Apache Group и сторонняя разработка – mod_ssl. Последняя дает намного больше возможностей и намного активней поддерживается, поэтому используем ее. Итак, собираем Apache:
Код:
# cd /usr/ports/www/apache13-modssl
# make install clean
И переходим к настройке. Основной конфиг Апача лежит в /usr/local/etc/apache и зовется httpd.conf. Конфиг совсем не маленький, поэтому я опишу лишь самые основные и важные параметры, а полностью ты сможешь найти его на диске.
Код:
# Запускаем сервер через inetd или самостоятельным демоном, # inetd у нас в системе выключен, так что выбор невелик :).
ServerType standalone
# Рутовая директория веб-сервера
ServerRoot "/usr/local"
# Таймаут соединений в секундах.
Timeout 300
# А вот об этом – поподробней. KeepAlive - механизм, позволяющий, не прерывая # соединения с сервером, отправить ему несколько запросов. Это позволяет
# экономить ресурсы за счет того, что не создается новый процесс, а на запросы
# отвечает уже существующий. Количество запросов и таймаут указываются
# следующими опциями:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
# Следующие три настройки сильно зависят от загруженности веб-сервера. Они
# указывают на то, сколько серверов минимум и максимум может быть загружено, и сколько # процессов сервера запускать при старте.
MinSpareServers 10
MaxSpareServers 70
StartServers 10
# Сколько клиентов может одновременно обслуживать сервер
MaxClients 150
# Сколько запросов может одновременно обрабатывать один процесс сервера
# (0 – не ограничено). Ноль ставить не рекомендуется.
MaxRequestsPerChild 7000
Дальше у нас идут настройки Listen и Bind - тут ничего хитрого нет. А сразу за ними – список модулей, которые подгружает сервер. Смело комментируй ненужные:
Код:
mod_userdir, mod_info, mod_proxy, mod_imap, mod_auth_db
Обрати внимание, что каждый модуль нужно закомментировать дважды – в секции LoadModule и в секции AddModule. Дальше идет конфигурация основного сервера, но мы там почти ничего менять не станем, т.к. «основной» сервер использоваться у нас не будет – мы будем основываться на виртуальном хостинге. Смело стираем блок
Код:
<mod_userdir> и раскомментируем строки:
AddType text/html .shtml
AddHandler server-parsed .shtml
Затем находим и раскомментируем строчку “NameVirtualHost *:80” – она включит виртуальные хосты. Настройки SSL - по вкусу, но лучше ничего не трогай, если точно не знаешь, что значит тот или иной параметр. И, наконец, последней строчкой конфига добавим:
Код:
Include etc/apache/vhosts/
Эта строчка скажет серверу, где находятся дополнительные конфиги. Учти, что перед дирой, которую мы укажем, добавляется значение ServerRoot.
* PHP/Perl/CGI
Веб-сервер это, конечно, хорошо, но на голом хтмл далеко не уедешь. И сейчас мы добавим использование php, perl и cgi-скриптов. Начнем с php:
Код:
# cd /usr/ports/lang/php4/
# make config
Появится менюшка, поставим галочку на Apache, на zend multibyte support, и, если надо, на IPv6.
Код:
# make install clean
Модуль должен поставиться без проблем и сам вписать себя в конфиг Apache. Открой на всякий случай конфиг и проверь, что все прошло нормально, конфиг жив и никто не пострадал. Теперь к нашему модулю нужно собрать расширения PHP.
Код:
# cd /usr/ports/lang/php4-extensions/
# make install clean
Опять появится менюшка с кучей расширений на выбор. Нам обязательно установить следующие (кроме уже отмеченных):
Код:
Bcmath, bz2, curl, ftp, gd, iconv, mbstring и sockets
Остается лишь откинуться на спинку стула и наслаждаться установкой . Как только установка завершится, идем в /usr/local/etc и копируем рекомендуемый конфиг:
Код:
# cd /usr/local/etc
# cp php.ini-recommended php.ini
Открываем php.ini и вносим следующие изменения:
Код:
; Включаем safe_mode
safe_mode = On
; Максимальное время выполнения скрипта
max_execution_time = 20
; Максимальное время обработки скриптом данных
max_input_time = 40
; Максимум выделяемой памяти
memory_limit = 64M
; Максимальный размер файла для аплоада
upload_max_filesize = 128M
Разумеется, эти настройки варьируются в зависимости от специфики хостящихся сайтов. Я указал наиболее оптимальные значения, проверенные опытным путем, но, разумеется, тебе ничего не мешает указать их по-своему. Некоторые важные настройки, касающиеся безопасности PHP, мы затронем подробнее в разделе «Защита».
Теперь нам нужно установить Zend Optimizer, чтобы юзеры хостинга смогли запускать скрипты, зашифрованые зендом. Тут все не так просто, и придется сделать небольшой финт ушами. Идем на zend.com, выбираем Products -> Zend Optimizer, free download. Нас попросят зарегистрироваться: мыло можно вводить любое, оно не проверяется. После регистрации нас перебросит на страницу закачки оптимайзера. В разделе Zend Optimizer 3.0.0 выбирай FreeBSD x86 5.x. Полученный файл ZendOptimizer-3.0.0-freebsd5.4-i386.tar.gz клади в /usr/ports/distfiles и собирай порт:
Код:
# cd /usr/ports/devel/ZendOptimizer
# make install clean
Установка не должна занять много времени. Обрати внимание, что Zend попросит тебя добавить несколько строк в конец файла php.ini. В моем случае:
Код:
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429-zts/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429-zts/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429-zts/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429-zts/ZendExtensionManager_TS.so"
Обычно это происходит автоматически при установке, но проверить лишний раз не помешает. Теперь, по аналогии с php, нам нужно собрать еще и mod_perl. Можно, конечно, дать веб-юзерам использовать системный перл – но делать это крайне не рекомендуется, хотя бы по тем же соображениям безопасности. О производительности я уже молчу. Собираем mod_perl:
Код:
# cd /usr/ports/www/mod_perl
# make install clean
Модуль перла так же пропишет себя в конфиг httpd.conf, не лишним будет проверить, что все ок. Разумеется, таким образом можно добавить многие полезные модули, например поддержку Python, различные модули авторизации, поддержку frontpage extensions и много других нужных вещей.
* Vhosts
Как известно, протокол HTTP 1.1 дает возможность передавать в запросе параметр Host, что позволяет держать несколько сайтов на одном IP адресе. Это называется виртуальным хостингом. Для каждого сайта, который будет у нас хоститься, мы создадим отдельный конфиг, что позволит делать гибкие настройки для каждого домена в отдельности. Первый конфиг, который мы создаем, будет служебного характера. Для начала создадим папку для конфигов, которую мы указали Apache:
Код:
# mkdir /usr/local/etc/apache/vhosts
# cd /usr/local/etc/apache/vhosts
И создаем там первый конфиг:
Код:
# touch 001.hosting.ru
Открываем конфиг и пишем:
Код:
# Мыло админа (будет показываться при HTTP ошибках)
ServerAdmin admin@hosting.ru
# Рутовая папка вхоста
DocumentRoot /home/revol.ru/web
# Домен и алиасы, по которым мы будем видеть вхост
ServerName hosting.ru
ServerAlias www.hosting.ru
ServerAlias main.hosting.ru
# Где располагаются логи
ErrorLog /var/log/www/hosting.ru -error.log
CustomLog /var/log/www/hosting.ru-custom.log combined
# Настройки .htaccess и запрет просматривать его из браузера
AccessFileName .htaccess
<Files ~ ^.ht>
Order allow,deny
Deny from all
</Files>
</VirtualHost>
Чтобы применить настройки апача и вхостов – используй команду apachectl graceful.
* MySQL
Теперь нам необходимо установить базу данных, в нашем случае - MySQL. Как обычно, собираем из портов, однако, в целях оптимизации, мы немного поправим Makefile.
Код:
# cd /usr/ports/databases/mysql40-server
На всякий случай сделаем бэкап Makefile
Код:
# cp Makefile Makefile.back
Открываем Makefile, находим там строчку:
Код:
--enable-thread-safe-client \
И после нее добавляем:
Код:
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--enable-assembler \
--with-named-thread-libs='-lpthread -D_THREAD_SAFE'
Закрываем, сохраняем и собираем порт с помощью трех магических слов – make install clean. Установка порта MySQL должна пройти без проблем. После установки топаем в /var/db/mysql и находим там несколько дефолтных конфигов:
* my-huge.cnf – для серверов, работающих с огромными по размеру базами (сотни гиг)
* my-large.cnf – если базы просто большие .
О значении my-medium.cnf и my-small.cnf, думаю, догадаться не сложно . В целом, конфиг my-large.cnf нам подойдет. Оптимизировать MySQL в конфиге имеет смысл только в том случае, когда ты точно знаешь, какие запросы составляют большинство нагрузки. Так как на хостинге сайты будут разные, и работать их движки с БД будут по-разному – оставим пока дефолтные настройки. Потом, исходя из специфики сайтов, некоторые параметры можно будет подкрутить.
* phpMyAdmin
Однако управлять MySQL из консоли очень и очень неудобно. Поставим phpMyAdmin: скачаем его с сайта, и – в бой:
Код:
# tar zxvf phpMyAdmin-2.8.1.tar.gz
# mkdir /usr/home/hosting.ru/web/pmadmin
# cp -rf phpMyAdmin-2.8.1/* /usr/home/hosting.ru/web/pmadmin
# chown –R hosting.ru:hosting.ru /usr/home/hosting.ru/web/pmadmin
# cd /usr/home/hosting.ru/web/pmadmin
Открываем файл config.inc.php и меняем там:
Код:
$cfg['Servers'][$i]['auth_type'] = 'config';
на
Код:
$cfg['Servers'][$i]['auth_type'] = 'http';
Идем на
http://hosting.ru/pmadmin/, вводим свой логин и пароль к SQL и наслаждаемся

.
Источник: Хакер-СПЕЦ (2006, #7)