Apache Версия 2.0 Сервера HTTP
этот документ описывает, как эффективно служить произвольному числу действительных хозяев с Apacheским httpd webserver.
mod_rewrite
mod_rewrite
методы, описанные здесь представляют интерес если ваш
httpd.conf
содержит многих
<VirtualHost>
секции, которые являются существенно тем же самым, например:
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.customer-1.com
DocumentRoot /www/hosts/www.customer-1.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.44>
ServerName www.customer-2.com
DocumentRoot /www/hosts/www.customer-2.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin
</VirtualHost>
# blah blah blah
<VirtualHost 111.22.33.44>
ServerName www.customer-N.com
DocumentRoot /www/hosts/www.customer-N.com/docs
ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin
</VirtualHost>
основная идея должна заменить все статические
<VirtualHost>
конфигурации с механизмом, который решает их динамически. Это имеет множество преимуществ:
главное неудобство - то, что Вы не можете иметь различного файла системного журнала для каждого действительного хозяина; однако, если Вы имеете много действительных хозяев, делая это может быть плохая идея так или иначе, из-за числа необходимых описателей файла. Лучше регистрировать на трубу или первым прибыл, первым обслужен, и принимать меры, чтобы процесс в другом конце распределил регистрации клиентам. (Это может также использоваться, чтобы накопить статистику, и т.д.).
действительный хозяин определен двумя информациями: его IP адрес, и содержание
Host:
удар головой в запросе HTTP. Динамическая массовая действительная техника оказания гостеприимства, используемая здесь основана на автоматической вставке этой информации в имя пути файла, который используется, чтобы удовлетворить запрос. Это может быть наиболее легко сделано при использовании
mod_vhost_alias
с Apache 2.0. Альтернативно,
mod_rewrite
может использоваться. Оба из этих модулей - инвалиды по умолчанию; Вы должны позволить одного из них, формируя и строя Apacheа, если Вы хотите использовать эту технику.
несколько вещей должны быть 'фальшивыми', чтобы заставить динамического действительного хозяина быть похожий на нормальный. Самое важное - название сервера, которое используется Apache, чтобы произвести самосправочные URL и т.д. Это формируется с
ServerName
директива, и это доступно для CGIs через
SERVER_NAME
переменная окружающей среды. Фактической ценностью, используемой во время, которым управляют, управляют
UseCanonicalName
урегулирование. С
UseCanonicalName Off
, название сервера взято от содержания
Host:
удар головой в запросе. С
UseCanonicalName DNS
, это взято от обратного поиска DNS IP адреса действительного хозяина. Прежнее урегулирование используется для динамического действительного оказания гостеприимства на основе названия, и последний используется для оказания гостеприимства на основе IP. Если Apache не может решить название сервера, потому что есть нет
Host:
удар головой, или поиск DNS терпит неудачу, тогда ценность, формируемая с
ServerName
используется вместо этого.
другая вещь, чтобы 'фальсифицировать' - корень документа (формируемый с
DocumentRoot
и доступный для CGIs через
DOCUMENT_ROOT
переменная окружающей среды). В нормальной конфигурации, это используется основным модулем, нанося на карту URIs к именам файла, но когда сервер формируется, чтобы сделать динамическое действительное оказание гостеприимства, та работа должна быть принята другим модулем (также
mod_vhost_alias
или
mod_rewrite
), который имеет различный способ сделать картографию. Ни один из этих модулей не ответственен чтобы установить
DOCUMENT_ROOT
переменная окружающей среды так, если какой-нибудь CGIs или документы ПЕРВОЙ СТЕПЕНИ ИНТЕГРАЦИИ используют это, они получат вводящую в заблуждение ценность.
это извлечение от
httpd.conf
осуществляет действительную договоренность хозяина, выделенную в
Motivation
секция выше, но в родовой моде использовать
mod_vhost_alias
.
# get the server name from the Host: header
UseCanonicalName Off
# this log format can be split per-virtual-host based on the first field
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot /www/hosts/%0/docs
VirtualScriptAlias /www/hosts/%0/cgi-bin
эта конфигурация может быть изменена в действительное решение для оказания гостеприимства на основе IP, только поворачиваясь
UseCanonicalName Off
в
UseCanonicalName DNS
. название сервера, которое вставлено в имя файла, тогда получено из IP адреса действительного хозяина.
это - регулирование вышеупомянутой системы, скроенной для сервера начальных страниц ISP. Используя немного более сложную конфигурацию, мы можем выбрать подвереницы названия сервера, чтобы использовать в имени файла так, чтобы, например, документы для
www.user.isp.com
найдены в
/home/user/
. это использует единственное
cgi-bin
справочник вместо одного в действительного хозяина.
# all the preliminary stuff is the same as above, then
# include part of the server name in the filenames
VirtualDocumentRoot /www/hosts/%2/docs
# single cgi-bin directory
ScriptAlias /cgi-bin/ /www/std-cgi/
есть примеры более сложных
VirtualDocumentRoot
параметры настройки в
mod_vhost_alias
документация.
с более сложными установками, Вы можете использовать нормального Апача
<VirtualHost>
директивы, чтобы управлять возможностями различных действительных конфигураций оказания гостеприимства. Например, Вы могли иметь один IP адрес для начальных страниц общих клиентов, и другого для коммерческих клиентов, со следующей установкой. Это может, конечно, быть объединено с обычным
<VirtualHost>
секции конфигурации.
UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
<Directory /www/commercial>
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /www/homepages>
Options FollowSymLinks
AllowOverride None
</Directory>
<VirtualHost 111.22.33.44>
ServerName www.commercial.isp.com
CustomLog logs/access_log.commercial vcommon
VirtualDocumentRoot /www/commercial/%0/docs
VirtualScriptAlias /www/commercial/%0/cgi-bin
</VirtualHost>
<VirtualHost 111.22.33.45>
ServerName www.homepages.isp.com
CustomLog logs/access_log.homepages vcommon
VirtualDocumentRoot /www/homepages/%0/docs
ScriptAlias /cgi-bin/ /www/std-cgi/
</VirtualHost>
изменения конфигурации предложили повернуться the first example в действительное оказание гостеприимства на основе IP установка приводят к довольно неэффективной установке. Новый поиск DNS требуется для каждого запроса. Чтобы избегать этого наверху, файловая система может быть устроена, чтобы соответствовать IP адресам, вместо к названиям хозяина, таким образом отрицая потребность в поиске DNS. Заготовка леса также должна будет быть приспособлена, чтобы соответствовать этой системе.
# get the server name from the reverse DNS of the IP address
UseCanonicalName DNS
# include the IP address in the logs so they may be split
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
# include the IP address in the filenames
VirtualDocumentRootIP /www/hosts/%0/docs
VirtualScriptAliasIP /www/hosts/%0/cgi-bin
mod_rewrite
это извлечение от
httpd.conf
делает ту же самую вещь как
the first example
. первая половина очень подобна соответствующей части выше, за исключением некоторых изменений, требуемых для обратной совместимости и сделать
mod_rewrite
работа части должным образом; вторая половина формирует
mod_rewrite
сделать фактическую работу.
есть несколько особенно хитрых битов: по умолчанию,
mod_rewrite
пробеги перед другими модулями перевода ТУРОВ (
mod_alias
и т.д.) - так, если Вы желаете использовать эти модули,
mod_rewrite
должен формироваться, чтобы приспособить их. Кроме того, некоторое волшебство обязано делать "в динамического действительного хозяина" эквивалентный из
ScriptAlias
.
# 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
<Directory /www/hosts>
# ExecCGI is needed here because we can't force
# CGI execution in the way that ScriptAlias does
Options FollowSymLinks ExecCGI
</Directory>
# now for the hard bit
RewriteEngine On
# a ServerName derived from a Host: header may be any case at all
RewriteMap lowercase int:tolower
## deal with normal documents first:
# allow Alias /icons/ to work - repeat for other aliases
RewriteCond %{REQUEST_URI} !^/icons/
# allow CGIs to work
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# do the magic
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1
## and now deal with CGIs - we have to force a MIME type
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]
# that's it!
mod_rewrite
это делает ту же самую вещь как the second example .
RewriteEngine on
RewriteMap lowercase int:tolower
# allow CGIs to work
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# check the hostname is right so that the RewriteRule works
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$
# concatenate the virtual host name onto the start of the URI
# the [C] means do the next rewrite on the result of this one
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
# now create the real file name
RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2
# define the global CGI directory
ScriptAlias /cgi-bin/ /www/std-cgi/
эта договоренность использует более передовой
mod_rewrite
особенности, чтобы решить перевод от действительного хозяина, чтобы документировать корень, от отдельного файла конфигурации. Это обеспечивает больше гибкости, но требует более сложной конфигурации.
vhost.map
файл должен выглядеть кое-что как это:
www.customer-1.com /www/customers/1
www.customer-2.com /www/customers/2
# ...
www.customer-N.com /www/customers/N
httpd.conf
должен содержать следующее:
RewriteEngine on
RewriteMap lowercase int:tolower
# define the map file
RewriteMap vhost txt:/www/conf/vhost.map
# deal with aliases as above
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
# this does the file-based remap
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/docs/$1
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/cgi-bin/$1 [T=application/x-httpd-cgi]