Как создать свой хостинг "с нуля"

ОГЛАВЛЕНИЕ

Собственно говоря, только ленивый не писал на тему виртуального вебхостинга. Это хорошо. Плохо то, что бОльшая часть информации очень слабо структурирована и не имеет отношения к собственно высокопроизводительному, безопасному и массовому виртуальному вебхостингу. В этой статье описано создание полностью рабочей системы "с нуля".

Задачи

- создать максимально производительный и в то же время безопасный вебхостинг

- позволить mod_php создавать файлы от имени пользователя, а не с правами вебсервера

- обезопасить пользователей друг от друга

- обезопасить систему от вторжения пользователей

- обезопасить систему от вторжения извне

Общая схема построения хостинга

В качестве вебсервера будем использовать Apache 1.3 с модулем mod_php и возможностью запуска cgi скриптов, как наиболее популярный среди вебмастеров. СУБД - MySQL 5.1.

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

Чтобы снизить нагрузку на Apache, установим акселерирующий прокси-сервер. Из собственной многолетней практики, наиболее подходящим акселератором на данный момент является nginx - стабильный и качественный многофункциональный вебсервер/акселератор, разрабатываемый Игорем Сысоевым.

Таким образом, сначала запрос от пользователя поступает на акселератор nginx, который ожидает приема всех данных и проксирует данные на Apache только после полного его получения. Этим мы снижаем нагрузку на Apache, который каждый запрос обрабатывает в отдельном тяжеловесном процессе.

Для по-настоящему безопасной работы необходимо чтобы программы на площадке каждого клиента выполнялись от своего пользователя. Для CGI скриптов эта задача решается путем настройки suexec. Модуль PHP, который по определению является частью Apache, выполняется с правами пользователя, от которого запущен вебсервер. Есть альтернативный вариант с использованием suphp, однако это очень сильно грузит систему и потому такая схема для массового вебхостинга неприменима.

Мы выберем компромиссный вариант: PHP будет работать как модуль Apache, а безопасность обеспечим настройками файловой системы и модуля PHP.

Осталось решить последнюю проблему, а именно - создание файлов при работе mod_php с правами пользователя-владельца площадки, а не с правами вебсервера. Обратимся к руководству по команде mount(8) , из которого следует, что для наследования владельца при создании объектов внути каталога, необходимо замонтировать раздел с опцией suiddir.

Доступ по FTP следует предоставлять только через виртуальных пользователей. Это требование обусловлено тем, что пароли по протоколу FTP передаются в нешифрованном виде и их очень легко перехватить. Чтобы исключить возможность вторжения в систему по SSH, перехватив пароль для FTP и необходимы виртуальные пользователи - не существующие в системе, следовательно, бесполезные для потенциального взломщика.

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

+--------------+ http +-------------------+ http +--------+
| пользователь | ---> | Акселератор nginx | ---> | Apache |
+--------------+      +-------------------+      +--------+
                                                  |
                                                  |   +---------+    
                                                  |-> | mod_php | >-+--------------+
                                                  |   +---------+   | suiddir      |
                                                  |   +---------+   |              |
                                                  |-> |   cgi   | >-|              |
                                                  |   +---------+   | Каталог      |
                                                  |   +---------+   | пользователя |
                                                  |-> |   SSI   | >-|              |
                                                      +---------+   |              |
                                                                    |              |
+-----------------+ ssh   +-----------+  Пользователь               |              |
| клиент хостинга | ----> | SSHD      | --------------------------> |              |
+-----------------+       +-----------+                             |              |
                                                                    |              |
+-----------------+ ftp   +-----------+  Виртуальный пользователь   |              |
| клиент хостинга | ----> | Pure-FTPD | --------------------------> |              |
+-----------------+       +-----------+                             +--------------+

Помните, все сервисы, собранные в одном месте - не более чем тестовая машина. В реальной конфигурации, способной обслуживать тысячи запросов в секунду, сервер MySQL должен быть на отдельной машине. Это же касается и акселератора nginx. Попытка собрать все воедино на одном физическом сервере резко снизит скорость работы всего комплекса ПО из-за слишком высокой нагрузки на дисковую систему.