Apache2 virtualhost настройка: Настройка виртуальных хостов на Apache для начинающих / Песочница / Хабр

Содержание

Настройка виртуальных хостов на Apache для начинающих / Песочница / Хабр

В прошлых статьях мы установили и настроили на локальном компьютере сервер Apache. В принципе, на этом можно было бы остановиться, так как сервер находится в рабочем состоянии и его можно спокойно использовать в работе. Но, по личному опыту, могу сказать, что использование только одного хоста localhost не очень удобно при разработке нескольких сайтов, так как для каждого сайта нужно будет создавать в каталоге localhost отдельный каталог и со временем в ней (папке localhost) будет очень трудно разобраться и что-то найти. Да и при тестировании разрабатываемого проекта гораздо удобнее набирать в браузере адрес вида test, чем localhost/test. Поэтому мы приступаем к настройке виртуальных хостов на локальном сервере.

Вообще, существует два способа конфигурирования виртуальных хостов: на основе имени и на основе IP-адреса. Но, так как мы настраиваем локальный сервер и у нас только один IP (кстати, для локалки он 127.0.0.1), то вариант с привязкой к IP нам не подходит и мы будем рассматривать вариант с привязкой к имени.

В прошлой статье я уже упоминал, что в файле конфигурации httpd.conf сервера есть строчка Include conf/extra/httpd-vhosts.conf. Мы ее уже раскомментировали, поэтому собственно и переходим к этому файлу. Найти его можно в папке Apache/conf/extra/.

Начнем рассматривать содержимое файла.
Первая директива – это NameVirtualHost *:80 привязывает виртуальные хосты, указываемы далее, к именам сайтов указанных в секциях <VirtualHost …>. Здесь вместо звездочки можно вписать IP 127.0.0.1, но тогда во всех секциях <VirtualHost> нужно будет указать то же самый IP. Принцип работы этой директивы заключается в том, что при обращении, допустим, к адресу localhost, сервер проверяет, соответствует ли входящий адрес и порт, описанным в секциях VirtualHost и имеется ли запись 127.0.0.1:80 в директиве NameVirtualHost. Если соответствует, то он перебирает секции VirtualHost, в заголовках которых указан входящий адрес. Таким образом, запрос 127.0.0.1:80 будет распределяться только между виртуальными хостами, в которых он указан.

Дальше в файле идут секции VirtualHost. Как видно из названия, каждая секция описывает настройки каждого виртуального хоста. Обязательно должна быть хотя бы одна такая секция, которая описывает настройки для localhost.
<VirtualHost *:80>
DocumentRoot “D:/server/localhost/www”
ServerName localhost
ErrorLog “D:/server/logs/localhost.error.log”
CustomLog “D:/server/logs/localhost.access.log” common

Директива DocumentRoot в этой секции указывает на папку, к которой будет происходить обращение при вызове адреса localhost.
ServerName как раз содержит имя нашего виртуального хоста, то есть его адрес. Сюда можно вписывать как адреса вида

localhost, test, site, так и адреса localhost.ru, test.com, www.site.org.
В ErrorLog и CustomLog мы указываем, где будут хранится логи этого виртуального хоста. Обратите внимание, имеет смысл для каждого хоста добавлять в имя файла лога название этого хоста, чтобы в будущем было легко найти лог требуемого хоста. Эти директивы можно и не указывать, но тогда логи этого виртуального хоста будут храниться в общих логах сервера.

В таком виде секция виртуального хоста уже работоспособна и на этом можно остановиться. Но можно добавить такие директивы как:

  • ServerAdmin [email protected] – адрес электронки администратора виртуального хоста
  • ServerAlias www.site.ru – зеркало хоста

Кроме того, можно добавить секции для индивидуальной настройки хоста:

<IfModule alias_module>
ScriptAlias /cgi-bin/ “d:/server/host_name/cgi-bin”

Создает ссылку на папку скриптов cgi-bin для хоста host_name.

<Directory “d:/server/host_name/www”>
Options Indexes Includes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all

Настройки директории хоста host_name, их мы разбирали в прошлой статье.

После настройки файла httpd-vhosts.conf проверим правильность его конфигурации. В каталоге D:\server\Apache\bin\ создайте файл httpd-S.cmd с содержимым:
“D:\server\Apache\bin\httpd.exe” –S
pause

После запуска этого файла вы увидите окно с отчетом о проверке, Syntax OK в конце говорит о том, что все настройки в порядке.

Теперь нужно прописать созданные хосты в файл C:\Windows\system32\drivers\etc\hosts. Для этого открываем его текстовым редактором и вносим следующие записи:

127.0.0.1 www.host1.ru host1.ru #Чтобы не набирать www перед именем сайта, создаем зеркало
127.0.0.1 www.host2 host2 #Можно и без .ru создавать хосты
127.0.0.1 host3 #Самый распространенный вариант для локалки
127.0.0.1 localhost # Обычно уже указано, проследите чтобы случайно не удалили и не закомментировали.

Сохраните файл и перезапустите Apache. Попробуйте разместить в каталогах созданных вами виртуальных хостов какие-нибудь тестовые файлы (например index.html) и из браузера открыть хосты по адресам, указанным в директории ServerName каждого хоста.

Если вам приходится часто создавать виртуальные хосты и не очень хочется каждый раз редактировать все эти файлы и перезапускать Apache вручную, создайте в папке сервера (

D:\server\) файл createVH.cmd с таким содержимым:

@cls
@rem Получаем текущую папку. Если у вас структура папок сервера как у меня, но он установлен, например на другом диске, укажите здесь вместо %~dp0 путь с нему (например, D:\server\) косая черта в конце обязательна.
@set server_path=%~dp0
:dir_exist
@set /P new_dir="Enter new VHost name:"
@set /P ip_add="Enter your IP address:"
@ if exist %server_path%%new_dir% echo "VHost %new_dir% already exist. Please re-enter Vhost name."
@ if exist %server_path%%new_dir% goto dir_exist
@md %server_path%%new_dir%

@rem Здесь указывается путь до конфиг файла виртуальных хостов, если у вас другой , поменяйте
@set outputfile=%server_path%Apache\conf\extra\httpd-vhosts.conf
@echo. >> %outputfile%

@echo ^<VirtualHost %ip_add%:80^> >> %outputfile%
@echo ServerName %new_dir% >> %outputfile%
@echo DocumentRoot «%server_path%%new_dir%» >> %outputfile%
@echo ErrorLog «%server_path%logs\%new_dir%.error.log» >> %outputfile%
@echo CustomLog «%server_path%logs\%new_dir%.access.log» common >> %outputfile%
@echo ^</VirtualHost^> >> %outputfile%
@if %ip_add%==* set ip_host=127.0.0.1
@if not %ip_add%==* set ip_host=%ip_add%
@set hostfile=%windir%\system32\drivers\etc\hosts
@echo. >> %hostfile%
@echo %ip_host% %new_dir% >> %hostfile%
@set htmlfile=%server_path%%new_dir%\index.html
@echo ^<html^> >> %htmlfile%
@echo ^<head^> >> %htmlfile%
@echo ^<title^>%new_dir%^</title^> >> %htmlfile%
@echo ^</head^> >> %htmlfile%
@echo ^<body^> >> %htmlfile%
@echo %new_dir% >> %htmlfile%
@echo ^</body^> >> %htmlfile%
@echo ^</html^> >> %htmlfile%
@rem Здесь путь до самого сервера, если у вас другой, поменяйте
@start %server_path%Apache\bin\httpd.exe -k restart

Теперь для создания хоста просто запустите этот файл, впишите в ответ имя нового хоста и IP, который будет указываться в секции VirtualHost файла httpd-vhosts.conf. По окончанию работы программа сама закроется. Вам останется только проверить созданный хост, набрав в адресной строке браузера имя, которое вы вписали в программу. Если все успешно прошло, то вы увидите страницу с именем нового хоста.

Обратите внимание, программа рассчитана на то, что структура каталогов сервера соответствует той, которую я указывал в первой статье. Если у вас установлен сервер по другим путям, поправьте файл в соответствии с ними.

Настройка virtualhost в apache2 как сделать виртуальный хост

Для настройки виртуальных хостов на web сервере apache2 под ubuntu 7.10, 8.04, 8.10, 9.04, 9.10, Debian 5 необходимо в самое начало или конец (вне инструкций ) файла /etc/apache2/sites-available/default добавить директиву:

NameVirtualHost 192.168.0.1

Там необходимо указать IP адрес либо DNS имя компютера на котором размещён вебсервер, можно указать localhost или 127.0.0.1

Затем, учитывая организацию конфигов apache2 в Debian, необходимо создать файл виртуального хоста в директории: /etc/apache2/sites-available/
например ваш сайт называется supebreys.ru, значит логичнее создать чтото вроде /etc/apache2/sites-available/supebreys_ru.conf. В любом случае это название должно вам говорить для чего этот файл и будет лучше если вы будете придерживаться какого то одного правила создания таких файлов. Затем в этот файл добавляем такой текст:

<VirtualHost *:80>
        DocumentRoot "/home/httpd/breys.ru/www"
        ServerName    breys.xxx
        <Directory />
                allow from all
                Options +Indexes
       </Directory>
        ScriptAlias /cgi-bin/ "/home/httpd/breys.ru/cgi-bin/"
        CustomLog  /home/httpd/breys.ru/access.log common
        ErrorLog /home/httpd/breys.ru/error.log
</VirtualHost>

Здесь мы создали виртуальный хост которых будет обрабатывать запросы на 80 порту с любого доступного адреса

Также тут указана корневая директория сайта, директория с cgi скриптами и пути к файлам журналов работы вебсервера

Для корневой директори указаны дополнительные(необязательные) опции: разрешение доступа с любого адреса и включение модуля обработки индексного файла, в принципе эти опции не обязательны и нужны только если прихоится переопределять глобальные политики доступа и загрузки модулей вебсервером

После создания этого файла веб сервер ещё не видит его. Если внимательно посмотреть на файлы в директориях /etc/apache2/sites-enabled/ и /etc/apache2/sites-available/ то должно стать ясно, то что в директории /etc/apache2/sites-available лежат файлы описывающие виртуальные хосты, а в папке/etc/apache2/sites-enabled/ лежат симлинки на файлы в sites-available.  Исходя из названий становится ясно, что:
sites-available — все доступные виртуальных хосты
sites-enabled — включаемые вебсервером
то есть, чтобы добавить виртульный хост в apache2, необходимо либо создать файл нового виртуального хоста в sites-available либо дописать(не желательно) его в уже имеющийся там файл, а чтобы включить виртуальный хост, необходимо чтобы директории sites-enabled была ссылка на файл описывающий виртуальных хост

Это сделанно для того, чтобы разделить виртуальные домены на уровне хостинга. Например, хостер чтобы временно удалить какой то домен удаляет ссылку из папки sites-enabled и перезапускает вебсервер и так же быстро включает домен снова, без правки единого конфига, как это было реализованно ранее.

Итак, включаем наш, только что созданный, новых виртуальный хост:

ln -s /etc/apache2/sites-available/breys_ru.conf /etc/apache2/sites-enabled/breys_ru.conf

Этой командой мы создаём симлинк(символическую ссылку на один файл в другой директории) на рабочий файл виртуального хоста, который будет обработан при следующем перезапуске вебсервера

Возможно вам потребуется расширить поведение вашего виртуального хоста — может потребоваться чтобы он был доступен по нескольким адреса

Например, у меня имеются зеркала моих сайтов и я работаю с ними дома используя имена сайтов + моя домашняя зона .xxx, тоесть для сайта breys.ru у меня есть домашнее зеркало breys.xxx, но вполне вероятна ситуация когда нужно показать зеракло ещё кому то, тогда я могу использовать DNS зону зарегистрированную за мной на DYNDNS.COM, тоесть это зеркало имеет дополнительный адрес в виде:breys.ffsdmad.homelinux.org, ещё более частая ситуация когда нужно иметь имя www.breys.ru и соответственноwww.breys.ffsdmad.homelinux.org
Чтобы включить этого необходимо в файл виртального хоста, внутри инструкций .. добавить список необходимых алиасов:

<VirtualHost *:80>
....другие инструкции
 ServerName breys.xxx
 ....
 ServerAlias www.breys.xxx
 ServerAlias breys.ffsdmad.homelinux.org
 ServerAlias www.breys.ffsdmad.homelinux.org
 ....
</VirtualHost>

Вполне возможно придётся заниматься отладкой модуля mod_rewrite, для этого необходимо в файл виртуального хоста добавить строки:

<VirtualHost *:80>
....другие инструкции
RewriteLog /home/httpd/breys.ru/rewrite.log
RewriteLogLevel 9
</VirtualHost>

Начните с небольшого примера и постепенно расширяйте возможности своего виртуального хостинга различными возможностями вебсервера apache2 (а их у него предостаточно) и постепенно вы поймёте насколько проста и логична такая структура в условиях такого сложного сервиса как вебхостинг

Также следует заметить, что если вы поставили на локальную машину сервер apache2 и виртуальные хосты прописаны в /etc/hosts (соответствия имени ip адресу), то начинаются тормоза при обращении к вебсерверу. Дело в том, что браузер сначала пытается распознать ip адрсе у dns сервера, который у вас прописан в /etc/resov.conf, а не проверять файл /etc/hosts. Это можно исправить заменив в файле /etc/host.conf последовательность перебора сервисов разрешения имён, но лучше всего настроить bind и забыть про тормоза и проблемы с обратным разрешением имени по IP

Вот тут можно прочитать как настроить bind для домашней сети, а здесь можно взять скрипт автоматического создания виртуальных хостов в условиях домашнего хостинга

Эта заметка висит здесь уже второй год и на неё не прекращается поток запроса, а это наталкивает меня на мысль, что люди не могут разобраться с этой системой, а значит нужно объяснять ещё более доходчиво, в этоге эта заметка переписывалась уж три раза

Если у вас остались или возникли какие то вопросы или неясности, не стесьняйтесь, спрашивайте, система коментариев мгновенно оповещает меня через Jabber, таким образом я реагирую практически моментально

 

Как настроить виртуальные хосты Apache в Ubuntu 20.04

Виртуальный хост – это директива конфигурации Apache, которая позволяет вам запускать более одного веб-сайта на одном сервере. С помощью виртуальных хостов вы можете указать корневой каталог документа сайта (каталог, содержащий файлы сайта), создать отдельную политику безопасности для каждого сайта, использовать разные сертификаты SSL и многое другое.

В этой статье описывается, как настроить виртуальные хосты Apache в Ubuntu 20.04.

 

Предпосылки

Убедитесь, что вы выполнили следующие требования, прежде чем продолжить статью:

  • Один или несколько доменных имен, указывающих на IP вашего публичного сервера.
  • Apache установлен в вашей системе Ubuntu.
  • Вы вошли как root или пользователь с привилегиями sudo.

 

Создание структуры каталогов

Корень документа – это каталог, в котором файлы веб-сайта для доменного имени хранятся и обслуживаются в ответ на запросы. Вы можете установить корневой каталог документа в любое место, которое вы хотите, в этом примере мы будем использовать следующую структуру каталогов:

/var/www/
├── domain1.ru
│   └── public_html
├── domain2.ru
│   └── public_html

 

Для каждого домена, размещенного на сервере, корневой каталог документа будет установлен на /var/www/<domain_name>/public_html.

Начните с создания корневого каталога для домена:

sudo mkdir -p /var/www/domain1.ru/public_html

 

Мы также создадим файл index.html в корневом каталоге документов домена, который будет отображаться при посещении домена в браузере:

/var/www/domain1.ru/public_html/index.html

 

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Добро пожаловать на domain1.ru</title>
  </head>
  <body>
    <h2>Успех! Главная страница domain1.ru!</h2>
  </body>
</html>

 

Поскольку приведенные выше команды выполняются от имени пользователя sudo, вновь созданные файлы и каталоги принадлежат пользователю root. Чтобы избежать каких-либо проблем с разрешениями, измените владельца корневого каталога документов домена и всех файлов в этом каталоге на пользователя apache (www-data):

sudo chown -R www-data: /var/www/domain1.ru

 

Создание виртуальных хостов

В системах Ubuntu файлы конфигурации Apache Virtual Hosts находятся в каталоге /etc/apache2/sites-available. Их можно включить, создав символические ссылки на каталог /etc/apache2/sites-enabled, которые Apache прочитал при запуске.

Откройте выбранный вами текстовый редактор и создайте следующий базовый файл конфигурации виртуального хоста:

/etc/apache2/sites-available/domain1.ru.conf

 

<VirtualHost *:80>
    ServerName domain1.ru
    ServerAlias www.domain1.ru
    ServerAdmin [email protected]
    DocumentRoot /var/www/domain1.ru/public_html

    <Directory /var/www/domain1.ru/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/domain1.ru-error.log
    CustomLog ${APACHE_LOG_DIR}/domain1.ru-access.log combined
</VirtualHost>

 

  • ServerName: Домен, который должен соответствовать этой конфигурации виртуального хоста. Это должно быть ваше доменное имя.
  • ServerAlias: Все другие домены или субдомены, которые должны соответствовать этому виртуальному хосту, например, субдомен www.
  • DocumentRoot: Каталог, из которого Apache будет обслуживать файлы домена.
  • Options: Эта директива, какие особенности сервера доступны в каталоге конкретного.
    • -Indexes: Предотвращает списки каталогов.
    • FollowSymLinks: Когда эта опция включена, Apache будет переходить по символическим ссылкам.
  • AllowOverride: Указывает, какие директивы, объявленные в файле .htaccess, могут переопределять директивы конфигурации.
  • ErrorLog, CustomLog: Указывает местоположение для файлов журнала.

Вы можете назвать файл конфигурации как вам угодно, но лучше всего использовать имя домена в качестве имени файла конфигурации виртуального хоста.

Чтобы включить новый файл виртуального хоста, используйте a2ensiteвспомогательный скрипт, который создает символическую ссылку из файла виртуального хоста в каталог sites-enabled:

sudo a2ensite domain1.ru

 

Другой вариант – создать символическую ссылку вручную, как показано ниже:

sudo ln -s /etc/apache2/sites-available/domain1.ru.conf /etc/apache2/sites-enabled/

 

После этого проверьте конфигурацию на наличие синтаксических ошибок с помощью:

sudo apachectl configtest

 

Если ошибок нет, вы увидите следующий вывод:

Syntax OK

 

Перезапустите службу Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

 

Наконец, чтобы убедиться, что все работает должным образом, откройте http://domain1.ru в вашем браузере, и вы увидите содержимое страницы index.html:

 

Вывод

Вы узнали, как создать конфигурацию виртуального хоста Apache для размещения нескольких доменов на одном сервере Ubuntu.

Повторите шаги, описанные выше, чтобы создать дополнительные виртуальные хосты для всех ваших доменов.

Если вы столкнулись с какой-либо проблемой, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

настройка для работы с несколькими сайтами в Debian

В большинстве случаев, если вы имеете собственный веб-сервер с «белым» ip-адресом, то после установки Apache2  в Debian 8, сайт «заливается» в директорию /var/www/html — которая прописана в файле /etc/apache2/sites-available/000-default.conf

Однако, если мы хотим разместить несколько сайтов? Допустим, что у нас есть несколько приобретенных доменных имен. Например:

  • school.ru
  • moodle.school.ru
  • школа.рф
  • support.org

и один «белый» ip-адрес. Что нужно делать?

В Apache2 такая возможность, конечно-же, предусмотрена.

Но тут нужно понимать, как работает механизм обработки запросов к серверу. Представить это можно так:

а) В соответствии со схемой, нам нужно настроить на DNS-записи на DNS-сервере.

б) Настроить Веб-сервер для работы с несколькими виртуальными хостами.

Допустим, что с первым пунктом мы разобрались, приступаем к следующему этапу:

1. Устанавливаем веб-сервер, если он еще не установлен:

2. Для того, чтобы обезопасить работу на сервере, в директориях, которые будут созданы для размещения сайтов передадим права на директории пользователю (у меня это webuser, под которым будем работать с файлами сайта). Для этого установим модуль apache2-mpm-itk:

apt-get install apache2-mpm-itk

3. Создаем директорию для нашего сайта в /var/www/ и передаем права на нее нашему пользователю webuser :

mkdir /var/www/school.ru
chown webuser:webuser /var/www/school.ru

4. Создаем файл конфигурации виртуального хоста для school.ru:

touch /etc/apache2/sites-available/school.ru.conf

И прописываем в нем:

<VirtualHost *:80>

ServerName school.ru
ServerAdmin [email protected]
ServerAlias www.school.ru
DocumentRoot /var/www/school.ru
CustomLog ${APACHE_LOG_DIR}/school.ru.access.log combined
ErrorLog ${APACHE_LOG_DIR}/school.ru.error.log
AssignUserID webuser webuser

<Directory /var/www/school.ru>
Options -Includes -Indexes -ExecCGI
</Directory>

</VirtualHost>

Сохраняем изменения.

5. «Включаем» сайт. Это можно сделать путем создания символьной ссылки на конфигурационный файл виртуального хоста school.ru.conf в директорию /etc/apache2/sites-enabled, либо специальной утилитой apache2:

«Выключить» сайт можно командой:

6. Перезапускаем apache2:

7. Для того, чтобы проверить работу виртуального хоста school.ru создадим в директории /var/www/school.ru файл index.html c содержимым:

<body><h2>Hello!</h2></body>

touch /var/www/school.ru/index.html

8. Запускаем браузер и переходим по адресу http://school.ru

Источники: 
Интересная статья? Поделитесь ей с друзьями!

Похожие записи:

Примеры

VirtualHost — HTTP-сервер Apache, версия 2.4

Этот документ пытается ответить на часто задаваемые вопросы о настройка виртуальных хостов. Эти сценарии включают несколько веб-сайты, работающие на одном сервере через виртуальные хосты на основе имен или IP.

Support Apache!

См. Также

У вашего сервера есть несколько имен хостов, которые разрешаются в один адрес, и вы хотите ответить по-другому: www.example.com и www.example.org .

Note

Создание виртуального конфигурации хоста на вашем сервере Apache не волшебным образом вызывают создание записей DNS для этих имен хостов. Вы должен иметь имена в DNS, разрешающие ваш IP адрес, иначе никто не сможет увидеть ваш сайт. Вы можно поместить записи в файл хостов для локальных тестирование, но это будет работать только на машине с теми

содержит записей.

 # Убедитесь, что Apache прослушивает порт 80
Слушай 80

    DocumentRoot "/ www / example1"
    ServerName www.example.com

    # Другие директивы здесь



    DocumentRoot "/ www / example2"
    ServerName www.example.org

    # Другие директивы здесь
 

Звездочки соответствуют всем адресам, поэтому главный сервер не обслуживает Запросы. В связи с тем, что виртуальный хост с ServerName www.example.com — первый в файле конфигурации он имеет наивысший приоритет и его можно увидеть как по умолчанию или основной сервер . Это значит что если получен запрос, который не соответствует ни одному из указанных ServerName , он будет обслуживаться этим первым <виртуальный хост> .

Вышеуказанная конфигурация — это то, что вы захотите использовать почти в все ситуации виртуального хостинга на основе имен. Единственное, что это конфигурация не будет работать, когда вы обслуживаете различный контент на основе разных IP-адресов или портов.

Примечание

Вы можете заменить * конкретным IP-адресом. в системе. Такие виртуальные хосты будут использоваться только для HTTP-запросы, полученные при подключении к указанному IP адрес.

Однако дополнительно полезно использовать * в системах, где IP-адрес непредсказуем — для например, если у вас есть динамический IP-адрес у вашего интернет-провайдера, и вы используете различные решения для динамического DNS.поскольку * соответствует любому IP-адресу, эта конфигурация будет работать без изменений всякий раз, когда ваш IP-адрес меняется.

Примечание

Любой из обсуждаемых здесь методов можно распространить на любой количество IP-адресов.

У сервера два IP-адреса. По одному ( 172.20.30.40 ) мы будет обслуживать «основной» сервер, server.example.com и на другое ( 172.20.30.50 ) мы будем обслуживать два и более виртуальных хоста.

 Слушайте 80

# Это «основной» сервер, работающий на 172.20.30.40
Имя сервера server.example.com
DocumentRoot "/ www / mainserver"


    DocumentRoot "/ www / example1"
    ServerName www.example.com

    # Остальные директивы здесь ...



    DocumentRoot "/ www / example2"
    ServerName www.example.org

    # Остальные директивы здесь ...
 

Любой запрос на адрес, отличный от 172.20.30.50 будет обслуживается с главного сервера. Запрос на номер 172.20.30.50 с неизвестное имя хоста или отсутствие заголовка Host: , будет обслуживаться из www.example.com .

Серверная машина имеет два IP-адреса ( 192.168.1.1 и 172.20.30.40 ). Машина находится между внутренняя (интранет) сеть и внешняя (интернет) сеть. за пределами сети имя server.example.com разрешает внешний адрес ( 172.20.30.40 ), но внутри сеть, то же имя преобразуется во внутренний адрес ( 192.168.1.1 ).

Сервер может отвечать на внутренние и внешние запросы с тем же содержанием, только с одним разделом .

 
    DocumentRoot "/ www / server1"
    Имя сервера server.example.com
    ServerAlias ​​сервер
 

Теперь запросы из обеих сетей будут обслуживаться из одной <виртуальный хост> .

Примечание:

На внутреннем сети, можно просто использовать имя server скорее чем полное имя хоста server.example.com .

Обратите внимание, что в приведенном выше примере вы можете заменить список IP-адресов с * , что приведет к отвечают одинаково на все адреса.

У вас несколько доменов, подключенных к одному IP-адресу, и вы также хотите обслуживать несколько портов.Пример ниже показывает, что сопоставление имен происходит после наиболее подходящей комбинации IP-адреса и порта определен.

 Слушайте 80
Слушай 8080


    ServerName www.example.com
    DocumentRoot "/ www / domain-80"



    ServerName www.example.com
    DocumentRoot "/ www / domain-8080"



    ServerName www.example.организация
    DocumentRoot "/ www / otherdomain-80"



    ServerName www.example.org
    DocumentRoot "/ www / otherdomain-8080"
 

Сервер имеет два IP-адреса ( 172.20.30.40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно.

 Слушайте 80


    DocumentRoot "/ www / example1"
    Имя сервера www.example.com



    DocumentRoot "/ www / example2"
    ServerName www.example.org
 

Запросы на любой адрес, не указанный в одном из директив (например, localhost , например) перейдет на главный сервер, если существует один.

Серверный компьютер имеет два IP-адреса ( 172.20.30.40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно. В каждом случае мы хотим запускать хосты на портах 80 и 8080.

 Слушайте 172.20.30.40:80
Слушайте 172.20.30.40:8080
Слушайте 172.20.30.50:80
Слушайте 172.20.30.50:8080


    DocumentRoot "/ www / example1-80"
    ServerName www.example.com



    DocumentRoot "/ www / example1-8080"
    ServerName www.example.com



    DocumentRoot "/ www / example2-80"
    ServerName www.example.org



    DocumentRoot "/ www / example2-8080"
    ServerName www.example.org
 

Любой адрес, указанный в аргументе виртуального хоста, который никогда не появляется в другом виртуальном хосте, это виртуальный хост строго на основе IP.

 Слушайте 80

    DocumentRoot "/ www / example1"
    Имя сервера www.example.com



    DocumentRoot "/ www / example2"
    ServerName www.example.org



    DocumentRoot "/ www / example3"
    ServerName www.example.net


# На основе IP

    DocumentRoot "/ www / example4"
    ServerName www.example.edu



    DocumentRoot "/ www / example5"
    ServerName www.example.gov
 

В следующем примере интерфейсная машина может проксировать виртуальный хост через сервер, работающий на другой машине.в пример, виртуальный хост с таким же именем настроен на машине по телефону 192.168.111.2 . ProxyPreserveHost На используется директива, чтобы желаемое имя хоста было пройдено, если мы проксируем несколько имен хостов на одиночная машина.

 
    ProxyPreserveHost On
    ProxyPass "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com
 

_default_ vhosts для всех портов

Перехват каждый запрос на любой неуказанный IP-адрес и порт, и.е. , комбинация адрес / порт, которая не используется для любой другой виртуальный хост.

 
    DocumentRoot "/ www / default"
 

Использование такого виртуального хоста по умолчанию с портом с подстановочными знаками эффективно предотвращает любой запрос, идущий на главный сервер.

Vhost по умолчанию никогда не обслуживает запрос, который был отправлен адрес / порт, который используется для виртуальных хостов на основе имен. Если запрос содержит неизвестный заголовок Host: или отсутствует, он всегда обслуживается с основного виртуального хоста на основе имени (виртуальный хост для этого адрес / порт, указанные первым в файле конфигурации).

Вы можете использовать AliasMatch или RewriteRule для перезаписи любого запрос на единую информационную страницу (или скрипт).

_default_ vhosts для разных портов

То же, что и установка 1, но сервер прослушивает несколько портов, и мы хотим использовать второй vhost _default_ для порта 80.

 
    DocumentRoot "/ www / default80"
    # ...



    DocumentRoot "/ www / default"
    #...
 

Vhost по умолчанию для порта 80 ( должен быть перед любым vhost по умолчанию с портом с подстановочными знаками) ловит все отправленные запросы на неуказанный IP-адрес. Главный сервер никогда не используется для обслуживания запрос.

_default_ vhosts для одного порта

Мы хотим иметь виртуальный хост по умолчанию для порта 80, но не использовать другое значение по умолчанию. . виртуальные домены

 
    DocumentRoot "/ www / default"
,..
 

Запрос на неуказанный адрес на порту 80 обслуживается из по умолчанию vhost. Любой другой запрос на неуказанный адрес и порт обслуживается с главного сервера.

Любое использование * в объявлении виртуального хоста будет иметь более высокий приоритет, чем _default_ .

Vhost на основе имени с именем хоста www.example.org (из нашего примера на основе имени, установка 2) должен получить собственный IP-адрес. адрес.Чтобы избежать проблем с серверами имен или прокси, которые кэшировали старый IP-адрес для виртуального хоста на основе имени, который мы хотим предоставить как варианты на этапе миграции.

Решение простое, потому что мы можем просто добавить новый IP-адрес. ( 172.20.30.50 ) на VirtualHost директивы.

 Слушайте 80
ServerName www.example.com
DocumentRoot "/ www / example1"


    DocumentRoot "/ www / example2"
    Имя сервера www.example.org
    # ...



    DocumentRoot "/ www / example3"
    ServerName www.example.net
    ServerAlias ​​* .example.net
    # ...
 

Теперь к виртуальному хосту можно получить доступ через новый адрес (как Vhost на основе IP) и через старый адрес (как имя на основе ВХост).

У нас есть сервер с двумя именами vhosts. Чтобы соответствовать правильный виртуальный хост, клиент должен отправить правильный Host: заголовок.Старые клиенты HTTP / 1.0 не отправляют такой заголовок, а Apache имеет не знаю, какой vhost клиент пытался достичь (и обслуживает запрос с первичного хоста). Чтобы обеспечить такую ​​же обратную совместимость, как возможно, мы создаем первичный vhost, который возвращает одну страницу содержащие ссылки с префиксом URL на виртуальный хосты.

 
    # основной vhost
    DocumentRoot "/ www / поддомен"
    RewriteEngine On
    RewriteRule "." «/ WWW / поддомен / индекс.(/sub2/.*) "" / www / subdomain $ 1 "
    # ...
 

Из-за ServerPath директива запрос к URL http: //www.sub1.domain.tld/sub1/ — это всегда обслуживается от sub1-vhost.
Запрос на URL http: //www.sub1.domain.tld/ только обслуживается с sub1-vhost, если клиент отправил правильный Хост: заголовок . Если нет Host: заголовок отправляется клиент получает информационную страницу с основного хоста.

Обратите внимание, есть одна странность: запрос на http: //www.sub2.domain.tld/sub1/ также обслуживается с sub1-vhost, если клиент не отправил заголовок Host: .

Директивы RewriteRule используются, чтобы убедиться, что клиент, отправивший правильный Host: заголовок может использовать оба варианта URL: , то есть , с префиксом URL или без него.

,

Как настроить конфигурацию виртуального хоста Apache (с примерами)

Используя виртуальный хост Apache, вы можете запускать несколько веб-сайтов на одном сервере.

Например, я могу запустить и thegeekstuff.com, и top5freeware.com на одном физическом сервере, на котором работает один веб-сервер Apache.

Рис. Виртуальный хост Apache (несколько веб-сайтов, один Apache)


Существует два типа конфигураций виртуального хоста Apache: 1) виртуальный хост на основе IP и 2) виртуальный хост на основе имени.Виртуальный хост на основе имени рекомендуется для большинства сценариев.

Виртуальный хост на базе IP

В этой конфигурации, когда вы указываете два веб-сайта (с разными IP-адресами) на сервер, на котором работает Apache, на этом физическом сервере должны быть настроены два разных IP-адреса.

Это означает, что на сервере должны быть две карты Ethernet, каждая из которых настроена на IP-адрес соответствующего веб-сайта, который будет обслуживать виртуальный хост Apache. Таким образом, это непрактично для большинства аспектов, и вам не следует его использовать.

В следующем примере сервер содержит две карты NIC, одна из которых настроена с IP-адресом 192.168.101.1 для thegeekstuff.com, другая — с 192.168.102.1 для top5freeware.com. Оба эти IP-адреса обслуживаются одним веб-сервером Apache, работающим на этом сервере с использованием виртуального хоста на основе IP.

Рис. Виртуальный хост на базе IP Apache

Виртуальный хост на основе имени

В этой конфигурации, когда веб-сервер Apache получает запрос, он ищет имя хоста в заголовке HTTP и, в зависимости от имени хоста, обслуживает разные веб-сайты.Это очень просто, так как вам нужен только один IP-адрес на этом физическом сервере; но вы обновляете DNS, добавляя несколько имен веб-сайтов, указывающих на один и тот же IP-адрес. Для всех практических целей вы будете использовать только конфигурацию виртуального хоста на основе имени.

В следующем примере сервер содержит только одну карту NIC, для которой настроен IP-адрес 192.168.101.1. Запись DNS для веб-сайтов thegeekstuff.com и top5freeware.com указывает на IP-адрес 192.168.101.1. Когда Apache получает запрос, он ищет запись имени хоста в заголовке HTTP и обслуживает соответствующий веб-сайт.

Рис. Виртуальный хост на основе имени Apache

1. Раскомментируйте httpd-vhosts.conf в httpd.conf

Если вы установили Apache 2 из исходного кода, по умолчанию следующая строка будет прокомментирована в файле httpd.conf. Раскомментируйте эту строку.

 # vi /usr/local/apache2/conf/httpd.conf
Включите conf / extra / httpd-vhosts.conf 

2. Настройка виртуальных хостов

Измените httpd-vhosts.conf, как показано ниже, чтобы настроить именованный виртуальный хост для двух хостов.

  • NameVirtualHost *: 80 — указывает, что все виртуальные хосты на основе имен будут прослушивать порт по умолчанию 80
  • — заключите все параметры конфигурации apache для каждого виртуального хоста между этими тегами VirtualHost. В контейнере виртуального хоста можно использовать любые директивы apache.
  • В следующем примере мы настраиваем виртуальный хост для thegeekstuff.com и top5freeware.com, прослушивающих один и тот же порт 80.Итак, будет два , по одному для каждого веб-сайта.
  • Когда вы переходите на thegeekstuff.com, файлы в / usr / local / apache2 / docs / thegeekstuff будут обслуживаться Apache; и access_log и error_log для этого сайта будут находиться в / usr / local / apache2 / logs / thegeekstuff
 # vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
ИмяVirtualHost *: 80


    ServerAdmin [email protected]
    DocumentRoot "/ usr / local / apache2 / docs / thegeekstuff"
    Имя сервера thegeekstuff.ком
    ServerAlias ​​www.thegeekstuff.com
    ErrorLog "журналы / thegeekstuff / error_log"
    CustomLog "журналы / thegeekstuff / access_log" общий



    ServerAdmin [email protected]
    DocumentRoot "/ usr / local / apache2 / docs / top5freeware"
    ServerName top5freeware.com
    ServerAlias ​​www.top5freeware.com
    ErrorLog "журналы / top5freeware / error_log"
    CustomLog "журналы / top5freeware / access_log" общие
 

3.Проверьте синтаксис конфигурации VirtualHost

Проверьте синтаксис виртуальной конфигурации с помощью «httpd -S», как показано ниже. Когда все настроено правильно, отображается просто «Синтаксис ОК».

 # / usr / локальный / apache2 / bin / httpd -S
Конфигурация VirtualHost:
Синтаксис OK 

Если что-то не настроено должным образом, будет отображаться предупреждающее сообщение, в том числе сообщение «каталог не выходит», как показано ниже.

 # / usr / локальный / apache2 / bin / httpd -S
Предупреждение: DocumentRoot [/ usr / local / apache2 / docs / top5freeware] не существует
Предупреждение: ErrorLog [/ usr / local / apache2 / logs / thegeekstuff] не существует
Синтаксис OK 

4.Перезагрузите Apache и проверьте

 # / usr / local / apache2 / bin / apachectl перезапуск 

Теперь, когда вы переходите на thegeekstuff.com (или www.thegeekstuff.com), apache будет обслуживать файлы из каталога / usr / local / apache2 / docs / thegeekstuff.

Когда вы переходите на top5freeware.com (или www.top5freeware.com), тот же apache, работающий на том же сервере, будет обслуживать файлы из каталога / usr / local / apache2 / docs / top5freeware.

Повторим, что для правильной работы виртуального хоста на основе имени запись DNS для обоих этих веб-сайтов должна указывать на один и тот же внешний IP-адрес физического сервера, на котором запущен веб-сервер Apache.

Если вам понравилась эта статья, возможно, вам также понравится ..



,Примеры

VirtualHost — HTTP-сервер Apache версии 2.5

Этот документ пытается ответить на часто задаваемые вопросы о настройка виртуальных хостов. Эти сценарии включают несколько веб-сайты, работающие на одном сервере через виртуальные хосты на основе имен или IP.

Контекстное примечание

Виртуальные хосты должны быть указаны в глобальный охват. Сторонние дистрибутивы сервера могут использовать альтернативный файл начальной конфигурации или несколько файлов конфигурации которые все принимают директивы с глобальной областью действия.Эти распределения могут также предложить соглашение об указании виртуальных хостов в их собственном индивидуальном файлы, включенные в глобальную конфигурацию через Включить директиву . Дальнейшие подробности может быть предоставлен в стороннем README, например /usr/share/doc/apache2/README.Debian.gz на базе Debian и Ubuntu Распределения.

У вашего сервера есть несколько имен хостов, которые разрешаются в один адрес, и вы хотите по-другому ответить на www.example.com и www.example.org .

Note

Создание виртуального конфигурации хоста на вашем сервере Apache не волшебным образом вызывают создание записей DNS для этих имен хостов. Вы должен иметь имена в DNS, разрешающие ваш IP адрес, иначе никто не сможет увидеть ваш сайт. Вы можно поместить записи в файл хостов для локальных тестирование, но это будет работать только на машине с теми содержит записей.

 # Убедитесь, что Apache прослушивает порт 80
Слушай 80

    DocumentRoot "/ www / example1"
    ServerName www.example.com

    # Другие директивы здесь



    DocumentRoot "/ www / example2"
    ServerName www.example.org

    # Другие директивы здесь
 

Звездочки соответствуют всем адресам, поэтому главный сервер не обслуживает Запросы. В связи с тем, что виртуальный хост с ServerName www.example.com — первый в файле конфигурации он имеет наивысший приоритет и его можно увидеть как по умолчанию или основной сервер. Это значит что если получен запрос, который не соответствует ни одному из указанных ServerName , он будет обслуживаться этим первым <виртуальный хост> .

Вышеуказанная конфигурация — это то, что вы захотите использовать почти в все ситуации виртуального хостинга на основе имен. Единственное, что это конфигурация не будет работать, когда вы обслуживаете различный контент на основе разных IP-адресов или портов.

Примечание

Вы можете заменить * конкретным IP-адресом. в системе. Такие виртуальные хосты будут использоваться только для HTTP-запросы, полученные при подключении к указанному IP адрес.

Однако дополнительно полезно использовать * в системах, где IP-адрес непредсказуем — для например, если у вас есть динамический IP-адрес у вашего интернет-провайдера, и вы используете различные решения для динамического DNS.поскольку * соответствует любому IP-адресу, эта конфигурация будет работать без изменений всякий раз, когда ваш IP-адрес меняется.

Примечание

Любой из обсуждаемых здесь методов можно распространить на любой количество IP-адресов.

У сервера два IP-адреса. По одному ( 172.20.30.40 ) мы будет обслуживать «основной» сервер, server.example.com и на другие ( 172.20.30.50 ) мы будем обслуживать два или более виртуальных хоста.

 Слушайте 80

# Это «основной» сервер, работающий на 172.20.30.40
Имя сервера server.example.com
DocumentRoot "/ www / mainserver"


    DocumentRoot "/ www / example1"
    ServerName www.example.com

    # Остальные директивы здесь ...



    DocumentRoot "/ www / example2"
    ServerName www.example.org

    # Остальные директивы здесь ...
 

Любой запрос на адрес, отличный от 172.20.30.50 будет обслуживается с главного сервера. Запрос на номер 172.20.30.50 с неизвестное имя хоста или отсутствие заголовка Host: , будет обслуживаться из www.example.com .

Серверная машина имеет два IP-адреса ( 192.168.1.1 и 172.20.30.40 ). Машина находится между внутренняя (интранет) сеть и внешняя (интернет) сеть. за пределами сети имя server.example.com разрешает внешний адрес ( 172.20.30.40 ), но внутри сеть, то же имя преобразуется во внутренний адрес ( 192.168.1.1 ).

Сервер может отвечать на внутренние и внешние запросы с тем же содержанием, только с одним разделом .

 
    DocumentRoot "/ www / server1"
    Имя сервера server.example.com
    ServerAlias ​​сервер
 

Теперь запросы из обеих сетей будут обслуживаться из одной <виртуальный хост> .

Примечание:

На внутреннем сети, можно просто использовать имя server скорее чем полное имя хоста server.example.com .

Обратите внимание, что в приведенном выше примере вы можете заменить список IP-адресов с * , что приведет к отвечают одинаково на все адреса.

У вас несколько доменов, подключенных к одному IP-адресу, и вы также хотите обслуживать несколько портов.Пример ниже показывает, что сопоставление имен происходит после наиболее подходящей комбинации IP-адреса и порта определен.

 Слушайте 80
Слушай 8080


    ServerName www.example.com
    DocumentRoot "/ www / domain-80"



    ServerName www.example.com
    DocumentRoot "/ www / domain-8080"



    ServerName www.example.организация
    DocumentRoot "/ www / otherdomain-80"



    ServerName www.example.org
    DocumentRoot "/ www / otherdomain-8080"
 

Сервер имеет два IP-адреса ( 172.20.30.40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно.

 Слушайте 80


    DocumentRoot "/ www / example1"
    Имя сервера www.example.com



    DocumentRoot "/ www / example2"
    ServerName www.example.org
 

Запросы на любой адрес, не указанный в одном из директив (например, localhost , например) перейдет на главный сервер, если существует один.

Серверный компьютер имеет два IP-адреса ( 172.20.30.40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно. В каждом случае мы хотим запускать хосты на портах 80 и 8080.

 Слушайте 172.20.30.40:80
Слушайте 172.20.30.40:8080
Слушайте 172.20.30.50:80
Слушайте 172.20.30.50:8080


    DocumentRoot "/ www / example1-80"
    ServerName www.example.com



    DocumentRoot "/ www / example1-8080"
    ServerName www.example.com



    DocumentRoot "/ www / example2-80"
    ServerName www.example.org



    DocumentRoot "/ www / example2-8080"
    ServerName www.example.org
 

Любой адрес, указанный в аргументе виртуального хоста, который никогда не появляется в другом виртуальном хосте, это виртуальный хост строго на основе IP.

 Слушайте 80

    DocumentRoot "/ www / example1"
    Имя сервера www.example.com



    DocumentRoot "/ www / example2"
    ServerName www.example.org



    DocumentRoot "/ www / example3"
    ServerName www.example.net


# На основе IP

    DocumentRoot "/ www / example4"
    ServerName www.example.edu



    DocumentRoot "/ www / example5"
    ServerName www.example.gov
 

В следующем примере интерфейсная машина может проксировать виртуальный хост через сервер, работающий на другой машине.в пример, виртуальный хост с таким же именем настроен на машине по телефону 192.168.111.2 . ProxyPreserveHost На используется директива, чтобы желаемое имя хоста было пройдено, если мы проксируем несколько имен хостов на одиночная машина.

 
    ProxyPreserveHost On
    ProxyPass "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com
 

_default_ vhosts для всех портов

Перехват каждый запрос на любой неуказанный IP-адрес и порт, и.е. , комбинация адрес / порт, которая не используется для любой другой виртуальный хост.

 
    DocumentRoot "/ www / default"
 

Использование такого виртуального хоста по умолчанию с портом с подстановочными знаками эффективно предотвращает любой запрос, идущий на главный сервер.

Vhost по умолчанию никогда не обслуживает запрос, который был отправлен адрес / порт, который используется для виртуальных хостов на основе имен. Если запрос содержит неизвестный заголовок Host: или отсутствует, он всегда обслуживается с основного виртуального хоста на основе имени (виртуальный хост для этого адрес / порт, указанные первым в файле конфигурации).

Вы можете использовать AliasMatch или RewriteRule для перезаписи любого запрос на единую информационную страницу (или скрипт).

_default_ vhosts для разных портов

То же, что и установка 1, но сервер прослушивает несколько портов, и мы хотим для использования второго виртуального хоста _default_ для порта 80.

 
    DocumentRoot "/ www / default80"
    # ...



    DocumentRoot "/ www / default"
    #...
 

Vhost по умолчанию для порта 80 ( должен быть перед любым vhost по умолчанию с портом с подстановочными знаками) ловит все отправленные запросы на неуказанный IP-адрес. Главный сервер никогда не используется для обслуживания запрос.

_default_ vhosts для одного порта

Мы хотим иметь виртуальный хост по умолчанию для порта 80, но не использовать другое значение по умолчанию. . виртуальные домены

 
    DocumentRoot "/ www / default"
,..
 

Запрос на неуказанный адрес на порту 80 обслуживается из по умолчанию vhost. Любой другой запрос на неуказанный адрес и порт обслуживается с главного сервера.

Любое использование * в объявлении виртуального хоста будет иметь более высокий приоритет, чем _default_ .

Vhost на основе имени с именем хоста www.example.org (из нашего примера на основе имени, установка 2) должен получить собственный IP-адрес. адрес.Чтобы избежать проблем с серверами имен или прокси, которые кэшировали старый IP-адрес для виртуального хоста на основе имени, который мы хотим предоставить как варианты на этапе миграции.

Решение простое, потому что мы можем просто добавить новый IP-адрес. ( 172.20.30.50 ) на VirtualHost директивы.

 Слушайте 80
ServerName www.example.com
DocumentRoot "/ www / example1"


    DocumentRoot "/ www / example2"
    Имя сервера www.example.org
    # ...



    DocumentRoot "/ www / example3"
    ServerName www.example.net
    ServerAlias ​​* .example.net
    # ...
 

Теперь к виртуальному хосту можно получить доступ через новый адрес (как Vhost на основе IP) и через старый адрес (как имя на основе ВХост).

У нас есть сервер с двумя именами vhosts. Чтобы соответствовать правильный виртуальный хост, клиент должен отправить правильный Host: заголовок.Старые клиенты HTTP / 1.0 не отправляют такой заголовок, а Apache имеет не знаю, какой vhost клиент пытался достичь (и обслуживает запрос с первичного хоста). Чтобы обеспечить такую ​​же обратную совместимость, как возможно, мы создаем первичный vhost, который возвращает одну страницу содержащие ссылки с префиксом URL на виртуальный хосты.

 
    # основной vhost
    DocumentRoot "/ www / поддомен"
    RewriteEngine On
    RewriteRule "." «/ WWW / поддомен / индекс.(/sub2/.*) "" / www / subdomain $ 1 "
    # ...
 

Из-за ServerPath директива запрос к URL http: //www.sub1.domain.tld/sub1/ — это всегда обслуживается от sub1-vhost.
Запрос на URL http: //www.sub1.domain.tld/ только обслуживается с sub1-vhost, если клиент отправил правильный Хост: заголовок . Если нет Host: заголовок отправляется клиент получает информационную страницу с основного хоста.

Обратите внимание, есть одна странность: запрос на http: //www.sub2.domain.tld/sub1/ также обслуживается с sub1-vhost, если клиент не отправил заголовок Host: .

Директивы RewriteRule используются, чтобы убедиться, что клиент, отправивший правильный Host: заголовок может использовать оба варианта URL, , то есть , с префиксом URL или без него.

,

Примеры VirtualHost — HTTP-сервер Apache версии 2.2

Обратите внимание на

Этот документ относится к версии Apache httpd 2.2 , которая больше не поддерживается. Здесь задокументирован активный выпуск. Если вы еще не обновились, перейдите по этой ссылке для получения дополнительной информации.

Вы можете перейти по этой ссылке, чтобы перейти к текущей версии этого документа.

Этот документ пытается ответить на часто задаваемые вопросы о настройка виртуальных хостов.Эти сценарии включают несколько веб-сайты, работающие на одном сервере через виртуальные хосты на основе имен или IP.

У вашего сервера один IP-адрес и несколько псевдонимов (CNAMES) укажите на эту машину в DNS. Вы хотите запустить веб-сервер для www.example.com и www.example.org об этом машина.

Note

Создание виртуального конфигурации хоста на вашем сервере Apache не волшебным образом вызывают создание записей DNS для этих имен хостов.Вы должен иметь имена в DNS, разрешающие ваш IP адрес, иначе никто не сможет увидеть ваш сайт. Вы может помещать записи в файл хостов для локальных тестирование, но это будет работать только на машине с теми размещает записи.

Конфигурация сервера

# Убедитесь, что Apache прослушивает порт 80
Listen 80

# Прослушивает запросы виртуального хоста на всех IP-адресах
NameVirtualHost *: 80


DocumentRoot / www / example1
ServerName www.example.com

# Другие директивы здесь


DocumentRoot / www / example2
ServerName www.example.org

# Другие директивы здесь

Звездочки соответствуют всем адресам, поэтому главный сервер не обслуживает Запросы. В связи с тем, что www.example.com является первым в файле конфигурации он имеет наивысший приоритет и его можно увидеть как по умолчанию или основной сервер .Это значит что если получен запрос, который не соответствует ни одному из указанных ServerName , он будет обслуживаться этим первым VirtualHost .

Примечание

При желании можно заменить * на актуальный IP-адрес системы. В этом случае аргумент VirtualHost должен соответствовать аргументу ИмяVirtualHost :

Именович 172.20.30.40


# и т. Д.

Однако дополнительно полезно использовать * в системах, где IP-адрес непредсказуем — для например, если у вас есть динамический IP-адрес у вашего интернет-провайдера, и вы используете различные решения для динамического DNS. поскольку * соответствует любому IP-адресу, эта конфигурация будет работать без изменений всякий раз, когда ваш IP-адрес меняется.

Вышеуказанная конфигурация — это то, что вы захотите использовать почти в все ситуации виртуального хостинга на основе имен. Единственное, что это конфигурация не будет работать, когда вы обслуживаете различный контент на основе разных IP-адресов или портов.

Примечание

Любой из методы, обсуждаемые здесь, могут быть распространены на любое количество IP адреса.

У сервера два IP-адреса. На одном ( 172.20.30.40 ), ср будет обслуживать «главный» сервер, server.domain.com и на другой ( 172.20.30.50 ), мы будем обслуживать два и более виртуальных хоста.

Конфигурация сервера

Listen 80

# Это «главный» сервер, работающий на 172.20.30.40
ServerName server.domain.com
DocumentRoot / www / mainserver

# Это другой адрес
NameVirtualHost 172.20.30.50


DocumentRoot / www / example1
ServerName www.example.com

# Другие директивы здесь …


DocumentRoot / www / example2
ServerName www.example.org

# Другие директивы здесь …

Любой запрос на адрес, отличный от 172.20.30.50 , будет обслуживается с главного сервера. Запрос на номер 172.20.30.50 с неизвестное имя хоста или отсутствие Host: заголовок , будет обслуживаться из www.example.com .

Серверная машина имеет два IP-адреса ( 192.168.1.1 и 172.20.30.40 ). Машина находится между внутренняя (интранет) сеть и внешняя (интернет) сеть. за пределами сети имя server.example.com преобразуется в внешний адрес ( 172.20.30,40 ), но внутри сеть, то же имя преобразуется во внутренний адрес ( 192.168.1.1 ).

Сервер может отвечать на внутренние и внешние запросы с тем же контентом, всего с одним VirtualHost раздел.

Конфигурация сервера

NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40


DocumentRoot / www / server1
ServerName server.example.com
ServerAlias ​​server

Теперь запросы из обеих сетей будут обслуживаться из одной VirtualHost .

Примечание:

На внутреннем сети, можно просто использовать имя server скорее чем полное имя хоста server.example.com .

Обратите внимание, что в приведенном выше примере вы можете заменить список IP-адресов с * , что заставит сервер отвечают одинаково на все адреса.

У вас есть несколько доменов с одним и тем же IP-адресом, и вы также хотите обслуживать несколько портов. Определив порты в «NameVirtualHost» тег, вы можете позволить этому работать. Если вы попробуете использовать без NameVirtualHost name: port или вы пытаетесь использовать Директива Listen, ваша конфигурация работать не будет.

Конфигурация сервера

Слушать 80
Слушать 8080

NameVirtualHost 172.20.30.40: 80
NameVirtualHost 172.20.30.40:8080


ServerName www.example.com
DocumentRoot / www / domain-80


ServerName www.example.com
DocumentRoot / www / domain-8080


ServerName www.example.org
DocumentRoot / www / otherdomain-80


ServerName www.example.org
DocumentRoot / www / otherdomain-8080

Сервер имеет два IP-адреса ( 172.20.30.40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно.

Конфигурация сервера

Слушайте 80


DocumentRoot / www / example1
ServerName www.example.com


DocumentRoot / www / example2
Имя сервера www.example.org

Запросы на любой адрес, не указанный в одном из директив (например, localhost , например) перейдет на главный сервер, если существует один.

Серверная машина имеет два IP-адреса ( 172.20.30,40 и 172.20.30.50 ), которые разрешаются к именам www.example.com и www.example.org соответственно. В каждом случае мы хотим запускать хосты на портах 80 и 8080.

Конфигурация сервера

Слушайте 172.20.30.40:80
Слушайте 172.20.30.40:8080
Слушайте 172.20.30.50:80
Слушайте 172.20.30.50:8080


DocumentRoot / www / example1-80
ServerName www.example.com


DocumentRoot / www / example1-8080
ServerName www.example.com


DocumentRoot / www / example2-80
ServerName www.example.org


DocumentRoot / www / example2-8080
ServerName www.example.org

На некоторых из моих адресов я хочу делать виртуальные хосты на основе имен, и на других — хосты на основе IP.

Конфигурация сервера

Слушайте 80

NameVirtualHost 172.20.30.40


DocumentRoot / www / example1
ServerName www.example.com


DocumentRoot / www / example2
Имя сервера www.example.org


DocumentRoot / www / example3
ServerName www.example3.net

# на базе IP

DocumentRoot / www / example4
ServerName www.example4.edu


DocumentRoot / www / example5
ServerName www.example5.gov

В следующем примере интерфейсная машина позволяет прокси-серверу виртуального хоста. через сервер, работающий на другом компьютере.В этом примере виртуальный одноименный хост настроен на машине по адресу 192.168.111.2 . Используется директива ProxyPreserveHost On так что желаемое имя хоста передается, в случае, если мы проксируем несколько имен хостов на одной машине.


ProxyPreserveHost на
ProxyPass / http://192.168.111.2/
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com

_default_ vhosts для всех портов

Перехват каждый запрос на любой неуказанный IP-адрес и порт, и.е. , комбинация адрес / порт, которая не используется для любой другой виртуальный хост.

Конфигурация сервера


DocumentRoot / www / по умолчанию

Использование такого виртуального хоста по умолчанию с портом с подстановочными знаками эффективно предотвращает любой запрос, идущий на главный сервер.

Vhost по умолчанию никогда не обслуживает запрос, который был отправлен адрес / порт, который используется для виртуальных хостов на основе имен.Если запрос содержит неизвестный или отсутствует Host: заголовок , он всегда обслуживается с основного виртуального хоста на основе имени (виртуальный хост для этого адрес / порт, указанные первым в файле конфигурации).

Вы можете использовать AliasMatch или RewriteRule для перезаписи любого запрос на единую информационную страницу (или скрипт).

_default_ vhosts для разных портов

То же, что и установка 1, но сервер прослушивает несколько портов, и мы хотим использовать второй vhost _default_ для порта 80.

Конфигурация сервера


DocumentRoot / www / default80
# ...


DocumentRoot / www / default
# …

Vhost по умолчанию для порта 80 ( должен быть перед любым vhost по умолчанию с портом с подстановочными знаками) ловит все отправленные запросы на неуказанный IP-адрес.Главный сервер никогда не используется для обслуживания запрос.

_default_ vhosts для одного порта

Мы хотим иметь виртуальный хост по умолчанию для порта 80, но не использовать другое значение по умолчанию. . виртуальные домены

Конфигурация сервера


DocumentRoot / www / default
...

Запрос на неуказанный адрес на порту 80 обслуживается из по умолчанию vhost.Любой другой запрос на неуказанный адрес и порт обслуживается с главного сервера.

Vhost на основе имени с именем хоста www.example.org (из нашего примера на основе имени, установка 2) должен получить собственный IP-адрес. адрес. Чтобы избежать проблем с серверами имен или прокси, которые кэшировали старый IP-адрес для виртуального хоста на основе имени, который мы хотим предоставить как варианты на этапе миграции.

Решение простое, потому что мы можем просто добавить новый IP-адрес. ( 172.20.30.50 ) на виртуальный хост директивы.

Конфигурация сервера

Listen 80
ServerName www.example.com
DocumentRoot / www / example1

NameVirtualHost 172.20.30.40


DocumentRoot / www / example2
Имя сервера www.example.org
# …


DocumentRoot / www / example3
ServerName www.example.net
ServerAlias ​​* .example.net
# …

Теперь к виртуальному хосту можно получить доступ через новый адрес (как Vhost на основе IP) и через старый адрес (как имя на основе ВХост).

У нас есть сервер с двумя именами vhosts. Чтобы соответствовать правильный виртуальный хост, клиент должен отправить правильный Host: заголовок. Старые клиенты HTTP / 1.0 не отправляют такой заголовок, а Apache имеет не знаю, какой vhost клиент пытался достичь (и обслуживает запрос с первичного хоста).(/sub2/.*) / www / subdomain $ 1
# …

из-за ServerPath директива запрос к URL http: //www.sub1.domain.tld/sub1/ — это всегда обслуживается от sub1-vhost.
Запрос на URL http: //www.sub1.domain.tld/ только обслуживается с sub1-vhost, если клиент отправил правильный Хост: заголовок. Если нет Host: заголовок отправляется клиент получает информационную страницу с основного хоста.

Обратите внимание, есть одна странность: запрос на http: //www.sub2.domain.tld/sub1/ также обслуживается из sub1-vhost, если клиент не отправил Host: header.

Директивы RewriteRule используются, чтобы убедиться, что клиент, отправивший правильный Host: заголовок может использовать оба варианта URL, , то есть , с префиксом URL или без него.

,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *