Построение виртуального массового хостинга на базе 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&gtltest.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

Оригинал: http://howtoforge.org/how-to-set-up-mass-virtualhosting-with-apache2-mod_rewrite-mod_userdir-mod_suexec-on-centos-5.3


 

Система Orphus

 


 

Comments: 3

  1. ArtemZ June 20th, 2009 at 2:19 pm

    Мда, ну и для чего это? На апаче только домашние странички клепать, да говнохостинги делать. Под серьёзной нагрузкой у вас всё это мигом ляжет.

  2. Andrjuxa June 23rd, 2009 at 5:22 am

    можно почитать…

    В этой статье описан один из методов построения системы виртуального хостинга с использованием mod_rewrite для определения соответствий[...]…

  3. Евгений April 30th, 2010 at 3:13 pm

    А что с безопасностью? Php-шелл будет видеть все сайты на сервере.

Add a Comment