Построение виртуального массового хостинга на базе Apache2 + mod_rewrite + mod_userdir + mod_suexec
В этой статье описан один из методов построения системы виртуального хостинга с использованием mod_rewrite для определения соответствий виртуальных хостов физическим директориям на сервере. Вдобавок, используя сопоставление хоста имени пользователя мы сможем запускать CGI-скрипты с правами юзера через suEXEC
В качестве ОС мы используем CentOS 5.3.
Адрес виртуального хоста www.example.com, IP-адрес сервера 192.168.1.1, сайт физически расположен в директории /home/vhosts/example.com/public_html
Установим apache
yum install httpd
В пакет httpd в CentOS уже включены модули mod_rewrite, mod_userdir и mod_suexec
Настройка Apache
vim /etc/httpd/conf/httpd.conf
Добавьте загрузку модуля rewrite
LoadModule rewrite_module modules/mod_rewrite.so
В конец файла добавьте следующие строки
## get the server name from the Host: header
UseCanonicalName Off
## splittable logs
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
RewriteEngine On
## Create a handle to convert upper or mixed-case to lower-case
RewriteMap lowercase int:tolower
##-----------------------------------
## where hostname has www prefix
##-----------------------------------
## Firstly create custom variable that contains the host without the www prefix
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule .? - [E=noWWWHost:%1]
## Map the virtualhost to the documentroot
RewriteCond %{REQUEST_URI} !^/~
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^/(.*)$ /home/vhosts/${lowercase:%{ENV:noWWWHost}}/public_html/$1
##-----------------------------------
## where hostname *does not* have www prefix
##-----------------------------------
## Map the virtualhost to the documentroot
RewriteCond %{REQUEST_URI} !^/~
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^/(.*)$ /home/vhosts/${lowercase:%{HTTP_HOST}}/public_html/$1
Рассмотрим подробнее
- Наши сайты располагаются в директории
/home/vhosts- каждая поддиректория - это доменное имя сайта (без www), например/home/vhosts/example.com - Если запрашивается
www.example.com, то произойдет перенаправление наexample.com - document_root имеет имя
public_html, это необходимо для suEXEC, как мы увидим позже. Если вы не планируете использовать suEXEC, то можете изменить имя на любое другое, но не забудьте поправить правила rewrite
Перезапустите apache
/etc/init.d/httpd restart
Создайте файл index.html в директории виртуального хоста
echo “index.html Hello World” > /home/vhosts/example.com/public_html/index.html
Теперь зайдите браузером на www.example.com, вы должны увидеть строку index.html Hello World. Если ее нет, то посмотрите log-файл apache
tail /var/log/httpd/error_log
Выполняем CGI-скрипты с помощью mod_suexec и mod_userdir
На массовой хостинг-площадке расположено много сайтов и зарегестрировано много пользователей. Естественно, что мы хотим, чтобы пользователи выполняли CGI-скрипты со своими правами, а не правами web-сервера. suEXEC позволяет реализовать нам это либо вручную, при помощи конфигурирования виртуального хоста, либо динамически, с помощью mod_userdir
Во-первых, имя каждого пользователя в системе должно совпадать с именем виртуального хоста. Например, наш example.com
useradd -d /home/vhosts/example.com example.com
Эта команда создаст пользователя example.com с домашней директорией /home/vhosts/example.com. Все файлы, доступные через web должны располагаться в /home/vhosts/example.com/public_html
Вы можете добавлять каждого пользователя в /etc/passwd вручную или настроить LDAP на вашем хосте.
Включим mod_userdir
LoadModule userdir_module modules/mod_userdir.so
<ifmodule>
UserDir public_html
</ifmodule>
Теперь, при запросе вида http://192.168.1.1/~example.com Apache будет искать директорию public_html в домашней директории пользователя example.com Не очень красиво, что пользователям придется использовать ~ в адресах, поэтому мы “молча” будем выполнять перенаправление. Но не для всех страниц, лишь для CGI-скриптов. Для “обычных” файлов мы используем rewrite-правила, описанные выше
Добавьте следующие строки в конфиг Apache после существующих
## Rewrite script to userdir so we can use suEXEC
RewriteCond %{REQUEST_URI} !^/~
RewriteCond %{SCRIPT_FILENAME} /home/vhosts/(.*)/public_html/(.*\.(pl|cgi))
RewriteRule .* /~%1/%2 [PT,L]
<directory>
AddHandler cgi-script .pl .cgi
Options +ExecCGI
</directory>
И перезагрузите web-сервер
/etc/init.d/httpd restart
Создайте тестовый perl-скрипт со следующим содержанием
#!/usr/bin/perl print "Content-type: text/html\n\n"; print " <h1>ltest.pl Hello World</h1> \n";
Дайте ему права на выполнение и смените владельца
chmod +x test.pl
chown example.com:example.com test.pl
Теперь, зайдя по адресу http://www.example.com/test.pl вы должны увидеть строку test.pl Hello World. Если что-то не так, то, как обычно, смотрите логи
tail /var/log/httpd/error_log
tail /var/log/httpd/suexec.log
Оригинал:
20.06.09 | *NIX, web-servers |
Мда, ну и для чего это? На апаче только домашние странички клепать, да говнохостинги делать. Под серьёзной нагрузкой у вас всё это мигом ляжет.
можно почитать…
В этой статье описан один из методов построения системы виртуального хостинга с использованием mod_rewrite для определения соответствий[…]…