Apache: примеры создания VirtualHost
Что такое VirtualHost можно почитать на Wiki.
Все примеры приведены в системе FreeBSD 8.2 и Apache 2.2, но подойдут для любой другой ОС (учтите только другие пути к файлам конфигурации).
В статье не будут рассмотрены вопросы создания и настройки доменов и субдоменов на DNS — это совсем другая тема. Если вы не используете свой собственный DNS и не знаете как настроить домен — проще всего воспользоваться этой>>> ссылкой или спросить совета у вашего регистратора доменного имени.
Для примеров используются следующие данные:
2 IP-адреса:
77.120.106.40
77.120.106.52
2 домена и 1 субдомен:
it-news.in.ua
website.co.ua
vhost1.website.co.ua
Для простоты, все пути к служебным каталогам остаются по-умолчанию, т.е. такими, какие они были после установки Apache:
ServerRoot «/usr/local»
Если планируется создание только одного VirtualHost-а, то все записи можно производить прямо в файле /usr/local/etc/apache22/httpd.conf. Но правильнее будет все настройки виртуалов хранить в файле /usr/local/etc/apache22/httpd-vhosts.conf
. Для этого, в конце файла /usr/local/etc/apache22/httpd.conf раскомментируйте строку:
#Virtual hosts
#Include etc/apache22/extra/httpd-vhosts.conf
Запуск нескольких name-based виртуалов на одном IP-адресе
#Укажем Apache слушать порт 80
Listen 80
#Слушать запросы к виртуалам на всех IP-адресах:
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot www/apache22/data/website.co.ua
ServerName www.example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot www/apache22/data/it-news.in.ua
ServerName www.example.org
</VirtualHost>
В этом примере website.co.ua находится первым в списке виртуалхостов, поэтому в случае, если к серверу придет запрос без определённого ServerName, то будет показано содержимое website.co.ua.
Если вы хотите, то можно указать реальный IP-адрес сервера, в таком случае параметр VirtualHost должен совпадать с NameVirtualHost:
NameVirtualHost 77.120.106.40
<VirtualHost 77.120.106.40:80>
…
</VirtualHost>
Но, как правило, используется параметр *, обозначающий любой IP-адрес. Это полезно, например, если вы используете услугу типа No-Ip, позволяющую привязать динамический IP-адрес к домену.
Name-based хосты на сервере с несколькими IP-адресами
У сервера есть два IP-адреса: 77.120.106.40 и 77.120.106.52. Запустим 1 «главный» сайт, и несколько «вторичных»:
Listen 80
# Это «главный» сайт, работающий на IP-адресе 77.120.106.40
ServerName website.co.ua
DocumentRoot www/apache22/data/website.co.ua
# А это «вторичные» сайты:
NameVirtualHost 172.20.30.50
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/vhost1.website.co.ua
ServerName vhost1.website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/it-news.in.ua
ServerName it-news.in.ua
</VirtualHost>
Все запросы на адреса, отличные от 77.120.106.52 будут переданы «главному» сайту. Все запросы к 77.120.106.52 с неуказанным HostName будут переданы к website.co.ua.
Обслуживание одного виртуала по разным IP-адресам (например, локальной и внешней сети)
У сервера есть две сети с двумя разными адресами — 77.120.106.40 (внешняя сеть) и 192.168.0.1 (внутренняя сеть). Из мира адрес website.co.ua направлен на 77.120.106.40, а изнутри имя server направлено на 192.168.0.1. По обоим запросам, как из внешней сети, так и из внутренней, сервер будет выдавать содержимое одного и того же виртуалхоста:
NameVirtualHost 192.168.0.1NameVirtualHost 77.120.106.40
<VirtualHost 192.168.0.1 77.120.106.40>
DocumentRoot www/apache22/data/website.co.ua
ServerName website.co.ua
ServerAlias server
</VirtualHost>
Обслуживание разных сайтов на разных портах
Можно обрабатывать запросы к разным и/или одинаковым доменам на разные порты, выдавая разное содержимое:
Listen 80
Listen 8080
NameVirtualHost 77.120.106.40:80
NameVirtualHost 77.120.106.40:8080
#по запросу website.co.ua и стандартному http-порту 80 выдаем
#содержимое каталога /usr/local/www/apache22/data/www/website.co.ua-80
<VirtualHost 77.120.106.40:80>
ServerName website.co.ua
DocumentRoot www/apache22/data/www/website.co.ua-80
</VirtualHost>
#по запросу website.co.ua и не-стандартному http-порту 8080 выдаем
#содержимое каталога /usr/local/www/apache22/data/www/website.co.ua-8080
<VirtualHost 77.120.106.40:8080>
ServerName website.co.ua
</VirtualHost>
#то же самое, на том же сервере, но для домена it-news.in.ua
<VirtualHost 77.120.106.40:80>
ServerName it-news.in.ua
DocumentRoot www/apache22/data/www/it-news.in.ua-80
</VirtualHost>
<VirtualHost 77.120.106.40:8080>
ServerName it-news.in.ua
DocumentRoot www/apache22/data/www/it-news.in.ua-8080
</VirtualHost>
IP-based виртуалхосты
У сервера есть два IP-адреса и два домена: it-news.in.ua с адресом 77.120.106.40 и website.co.ua с адресом 77.120.106.52:
Listen 80
<VirtualHost 77.120.106.40>
DocumentRoot www/apache22/data/www/it-news.in.ua
ServerName it-news.in.ua
</VirtualHost>
<VirtualHost 77.120.106.52>
DocumentRoot www/apache22/data/www/website.co.ua
ServerName website.co.ua
</VirtualHost>
Смешанные port-based и ip-based виртуалхосты
Listen 77.120.106.40:80
Listen 77.120.106.52:80
Listen 77.120.106.52:8080
<VirtualHost 77.120.106.40:80>
DocumentRoot www/apache22/data/www/website.co.ua-80
ServerName website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.40:8080>
DocumentRoot www/apache22/data/www/website.co.ua-8080
ServerName website.co.ua
</VirtualHost>
<VirtualHost 77.120.106.52:80>
DocumentRoot www/apache22/data/www/it-news.in.ua-80
ServerName it-news.in.ua
</VirtualHost>
<VirtualHost 77.120.106.52:8080>
DocumentRoot www/apache22/data/www/it-news.in.ua-8080
ServerName it-news.in.ua
</VirtualHost>
В статье использовалась документация с официального сайта веб-сервера Apache.
Настройка виртуальных хостов Apache в Windows. Категория: Web-разработка • Разное
Виртуальные хосты могут быть привязаны к имени хоста (например, host.local
) или к IP-адресу (например, 127.0.0.3
DocumentRoot
:
DocumentRoot d:/work/localhost/www <Directory "d:/work/localhost*/www"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Внутри директории d:/work
создаем еще три: localhost1
, localhost2
, localhost3
. Внутри каждой директории localhost*
создаем еще одну директорию www
. В каждую папку www
добавляем файл index.html
с любым содержанием, который позволил бы идентифицировать хост. Например
- в файл
D:\work\localhost1\www\index.html
добавляем текст «localhost1» - в файл
D:\work\localhost2\www\index.html
добавляем текст «localhost2» - в файл
D:\work\localhost3\www\index.html
добавляем текст «localhost3»
[D:\] [work] [localhost] [www] index.html access.log error.log [localhost1] [www] index.html access.log error.log [localhost2] [www] index.html access.log error.log [localhost3] [www] index.html access.log error.log
В файле C:\wamp\apache\conf\httpd.conf
надо найти и раскоментировать строку:
Include conf/extra/httpd-vhosts.conf
В файле C:\wamp\apache\conf\extra\httpd-vhosts.conf
надо закомментировать (или удалить) те строки, которые приведены по умолчанию.
Виртуальные хосты на основе IP-адреса
Для виртуальных хостов, которые привязаны к IP, требуются несколько IP-адресов. Таковые у нас имеются: это 127.0.0.1
127.0.0.2
, 127.0.0.3
, 127.0.0.4
, 127.0.0.5
и так далее. И к каждому из них можно привязать виртуальный хост.
Для этого добавляем в файл C:\Windows\System32\drivers\etc\hosts
строки
127.0.0.1 localhost host.ru www.host.ru 127.0.0.2 localhost1 host1.ru www.host1.ru 127.0.0.3 localhost2 host2.ru www.host2.ru 127.0.0.4 localhost3 host3.ru www.host3.ru
А в файл C:\wamp\apache\conf\extra\httpd-vhosts.conf
добавляем следующее
# # localhost # <VirtualHost 127.0.0.1:80> ServerAdmin admin@localhost ServerName localhost DocumentRoot d:/work/localhost/www ServerAlias host.ru www.host.ru ErrorLog d:/work/localhost/error.log CustomLog d:/work/localhost/access.log common </VirtualHost> # # localhost1 # <VirtualHost 127.0.0.2:80> ServerAdmin admin@localhost1 ServerName localhost1 DocumentRoot d:/work/localhost1/www ServerAlias host1.ru www.host1.ru ErrorLog d:/work/localhost1/error.log CustomLog d:/work/localhost1/access.log common </VirtualHost> # # localhost2 # <VirtualHost 127.0.0.3:80> ServerAdmin admin@localhost2 ServerName localhost2 DocumentRoot c:/work/localhost2/www ServerAlias host2.ru www.host2.ru ErrorLog d:/work/localhost2/error.log CustomLog d:/work/localhost2/access.log common </VirtualHost> # # localhost3 # <VirtualHost 127.0.0.4:80> ServerAdmin admin@localhost3 ServerName localhost3 DocumentRoot d:/work/localhost3/www ServerAlias host3.ru www.host3.ru ErrorLog d:/work/localhost3/error.log CustomLog d:/work/localhost3/access.log common </VirtualHost>
Теперь можно обращаться к виртуальным хостам так:
http://127.0.0.1
,http://localhost/
,http://host.ru/
,http://www.host.ru/
,http://localhost1/
,http://host1.ru/
,http://www.host1.ru/
http://127.0.0.3
,http://localhost2/
,http://host2.ru/
,http://www.host2.ru/
http://127.0.0.4
,http://localhost3/
,http://host3.ru/
,http://www.host3.ru/
Виртуальные хосты на основе имени хоста
Для этого добавляем в файл C:\Windows\System32\drivers\etc\hosts
строки
127.0.0.1 localhost host.ru www.host.ru 127.0.0.1 localhost1 host1.ru www.host1.ru 127.0.0.1 localhost2 host2.ru www.host2.ru 127.0.0.1 localhost3 host3.ru www.host3.ru
А в файл C:\wamp\apache\conf\extra\httpd-vhosts.conf
добавляем следующее
# # localhost # <VirtualHost *:80> ServerAdmin admin@localhost ServerName localhost DocumentRoot d:/work/localhost/www ServerAlias host.ru www.host.ru ErrorLog d:/work/localhost/error.log CustomLog d:/work/localhost/access.log common </VirtualHost> # # localhost1 # <VirtualHost *:80> ServerAdmin admin@localhost1 ServerName localhost1 DocumentRoot d:/work/localhost1/www ServerAlias host1.ru www.host1.ru ErrorLog d:/work/localhost1/error.log CustomLog d:/work/localhost1/access.log common </VirtualHost> # # localhost2 # <VirtualHost *:80> ServerAdmin admin@localhost2 ServerName localhost2 DocumentRoot c:/work/localhost2/www ServerAlias host2.ru www.host2.ru ErrorLog d:/work/localhost2/error.log CustomLog d:/work/localhost2/access.log common </VirtualHost> # # localhost3 # <VirtualHost *:80> ServerAdmin admin@localhost3 ServerName localhost3 DocumentRoot d:/work/localhost3/www ServerAlias host3.ru www.host3.ru ErrorLog d:/work/localhost3/error.log CustomLog d:/work/localhost3/access.log common </VirtualHost>
Теперь можно обращаться к виртуальным хостам так:
http://localhost/
,http://host.ru/
,http://www.host.ru/
http://localhost1/
,http://host1.ru/
,http://www.host1.ru/
http://localhost2/
,http://host2.ru/
,http://www.host2.ru/
http://localhost3/
,http://host3.ru/
,http://www.host3.ru/
Дополнительно
Поиск: Apache • Web-разработка • Windows • Установка • Настройка • Виртуальный хост • IP-адрес • VirtualHost
Настройка 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 2.4, не могу настроить name-based VirtualHost на localhost. Почему ошибка 400? — Хабр Q&A
Уважаемые знатоки — прошу помощи.Есть комп под Windows 7. Нужен локальный сервер на нем. Раньше пользовался XAMPP, но он перестал меня устраивать.
Решил отдельно поставить Apache2.4+PHP+mySQL. Особых проблем не возникло.
Но уже второй день не могу настроить name-based VirtualHost. т.е. нужно что бы по адресам localhost, captcha_lite и при необходимости еще другим именам — открывались разные сайты. На XAMPP это работало.
Как я настраивал это на Apache:
В файле httpd.conf раскомментировал эти строки
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Include conf/extra/httpd-vhosts.conf
в файле httpd-vhost.conf написал следующее
<VirtualHost *:80>
DocumentRoot "D:/USR/www"
ServerName localhost
ServerAlias www.localhost
ErrorLog "D:/USR/log/localhost/error.log"
CustomLog "D:/USR/log/localhost/access.log" common
ServerAdmin webmaster@localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "D:/USR/www/captcha_lite"
ServerName captcha_lite
ServerAlias www.captcha_lite
ErrorLog "D:/USR/log/captcha_lite/error.log"
CustomLog "D:/USR/log/captcha_lite/access.log" common
ServerAdmin webmaster@captcha_lite
</VirtualHost>
Естественно сделал соответствующие записи в hosts
Но ничего не работает!
При заходе на localhost открывается то что должно открываться, однако это происходит только потому, что в httpd-vhost.conf он указан первый и используется по умолчанию в любых ситуациях. Например, тоже самое открывается если зайти на s1.localhost (тоже прописан в hosts на тот же адрес).
Если же зайти на captcha_lite то выдает ошибку 400. А должна открываться страничка с одной строкой для теста.
Bad Request
Your browser sent a request that this server could not understand.
Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.
Проблема заключается в следующем:
Как все должно работать, согласно описанию
With name-based virtual hosting, the server relies on the client to report the hostname as part of the HTTP headers. Using this technique, many different hosts can share the same IP address.
When a request arrives, the server will find the best (most specific) matching argument based on the IP address and port used by the request. If there is more than one virtual host containing this best-match address and port combination, Apache will further compare the ServerName and ServerAlias directives to the server name present in the request.
Браузер все делает правильно — в заголовках есть Host «captcha_lite» . А сервер в ответ присылает ошибку 400.
ПОЧЕМУ? Как будто я просто что то не так настроил, но что? Перерыл уже весь гугл. Помогите пожалуйста.
Самое интересное, что при добавлении в httpd-vhosts.conf такого:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "D:/USR/www/s1.localhost"
ServerName s1.localhost
ErrorLog "D:/USR/log/s1.localhost/error.log"
CustomLog "D:/USR/log/s1.localhost/access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "D:/USR/www/s2.localhost"
ServerName s2.localhost
ErrorLog "D:/USR/log/s2.localhost/error.log"
CustomLog "D:/USR/log/s2.localhost/access.log" common
</VirtualHost>
по адресу s1.localhost открывается то что надо, а по s2.localhost — открывается то что должно открываться по адресу captcha_lite.
если оставить там только эти записи — все вообще работает как надо, но только для них.
Как заставить работать captcha_lite?
Ubuntu: настройка VirtualHost в Apache
Файлы сервера Apache хранятся в каталоге /etc/apache2, который включает в себя такие директории:
# ls -dl */
drwxr-xr-x 2 root root 4096 Фев 25 08:46 conf.d/
drwxr-xr-x 2 root root 4096 Фев 25 08:37 mods-available/
drwxr-xr-x 2 root root 4096 Фев 25 08:37 mods-enabled/
drwxr-xr-x 2 root root 4096 Фев 25 11:54 sites-available/
drwxr-xr-x 2 root root 4096 Фев 25 11:55 sites-enabled/
В этом же каталоге находится основной конфигурационный файл сервера — apache2.conf.
Настройки сайтов, которые обслуживает сервер, находятся в каталоге /etc/apache2/sites-available. А активные сайты — в каталоге /etc/apache2/sites-enabled, файлы в котором являются просто ссылками на каталог /etc/apache2/sites-available:
# pwd
/etc/apache2/sites-enabled
# ls -la
итого 8
drwxr-xr-x 2 root root 4096 Фев 25 11:55 .
drwxr-xr-x 7 root root 4096 Фев 25 08:37 ..
lrwxrwxrwx 1 root root 26 Фев 25 08:37 000-default -> ../sites-available/default
lrwxrwxrwx 1 root root 34 Фев 25 11:55 rtfm.co.ua.conf -> ../sites-available/rtfm.co.ua.conf
Для добавления нового VirtualHost — в каталоге /etc/apache2/sites-available создаём файл с именем sitename.conf, например — rtfm.co.ua.conf.
В него добавляем обычные параметры, как и на любой другой платформе:
# cat rtfm.co.ua.conf
<virtualhost *:80>
ServerName rtfm.co.ua
ServerAlias www.rtfm.co.ua
DocumentRoot /var/www/rtfm.co.ua
ErrorLog /var/log/apache/rtfm.co.ua-error.log
CustomLog /var/log/apache/rtfm.co.ua-access.log combined
</virtualhost>
Теперь выполним команду:
# a2ensite /etc/apache2/sites-available/rtfm.co.ua.conf
Которая создаст символическую ссылку в каталоге /etc/apache2/sites-enabled.
Если при выполнении a2ensite вы получаете ошибку вида:
# a2ensite /etc/apache2/sites-available/rtfm.co.ua.conf
ERROR: No site found matching /etc/apache2/sites-available/rtfm.co.ua.conf!
Или такую:
# a2ensite rtfm.co.ua.conf
ERROR: Site rtfm.co.ua does not exist!
Укажите путь к файлу конфигурации без указания полного пути:
# pwd
/etc/apache2/sites-available
# a2ensite rtfm.co.ua.conf
Enabling site rtfm.co.ua.conf.
Run ‘/etc/init.d/apache2 reload’ to activate new configuration!
Перезапускаем Apache:
# service apache2 restart
Сайт готов к работе.
Подробнее о конфигурировании VirtualHost-ов можно почитать в статье Apache: примеры создания VirtualHost.
Apache HTTP Server | Русскоязычная документация по Ubuntu
Apache HTTP Server — проект, развиваемый The Apache Software Foundation, в рамках которого разрабатывается кроссплатформенный HTTP сервер с открытым исходным кодом. Входит в состав LAMP и XAMPP.
Версии Apache в Ubuntu
Ubuntu | Apache |
---|---|
12.04 LTS (Precise) | 2.2 |
14.04 LTS (Trusty) | 2.4 |
15.10 (Wily) | 2.4 |
16.04 LTS (Xenial) | 2.4 |
Хостинг сайтов
Можно реализовать четырьмя способами:
по умолчанию в папке /var/www/html. Доступом является http://localhost/
настройки основного хостинга. Например, http://localhost/phpmyadmin
в любой папке с помощью модуля виртуальных хостов. Например, http://mysite/
в папке пользователя public_html (модуль userdir). Например, http://localhost/~username
Установка
Для установки Apache выполните в терминале:
sudo apt-get install apache2
Настройка
Для применения изменений в настройках необходимо перезапустить демон Apache:sudo service apache2 restart
В Ubuntu конечный файл настройки (apache2.conf) расделён на несколько файлов, расположенных в разных поддиректориях. Подробней написано в комментариях файла apache2.conf.
/etc/apache2/ |-- apache2.conf | `-- ports.conf |-- mods-enabled | |-- *.load | `-- *.conf |-- conf-enabled | `-- *.conf `-- sites-enabled `-- *.conf
Настройки модулей расположены в директории /etc/apache2/mods-available. Для подключения или отключения модулей (настроек модулей) следует использовать соответствующие команды a2enmod
или a2dismod
. Пример подключения модуля:
sudo a2enmod <mod-name>
Свои настройки следует сохранять в файлы, расположенные в директории /etc/apache2/conf-available. Для подключения или отключения своих настроек следует использовать соответствующие команды a2enconf
или a2disconf
. Пример подключения файла со своими настройками:
sudo a2enconf <config-name>
Настройки виртуальных хостов следует сохранять в файлы, расположенные в директории /etc/apache2/sites-available. Для подключения виртуальных хостов следует использовать соответствующие команды a2ensite
или a2dissite
. Пример подключения виртуального хоста:
sudo a2ensite <site-name>
Кодировка по умолчанию
Для указания кодировки по умолчанию следует использовать директиву AddDefaultCharset
в файле /etc/apache2/conf-available/charset.conf (или раскомментировать соответствующую строку):
AddDefaultCharset UTF-8
Виртуальные хосты
Файлы настроек виртуальных хостов хранятся в /etc/apache2/sites-available/*.conf. По умолчанию в Apache уже настроен один виртуальный хост. Его настройки лежат в файле 000-default.conf. Вы можете использовать этот виртуальный хост в качестве примера.
Пример настройки виртуального хоста:
<VirtualHost *:80> #Имя хоста ServerName host1.server1 #Корневая папка хоста DocumentRoot /var/www/host1.server1 <Directory /var/www/host1.server1> #Разрешение на перезапись всех директив при помощи .htaccess AllowOverride All </Directory> </VirtualHost>
Назовите файл настройки именем вашего хоста host1.server1.conf и сохраните.
После создания файла настроек допишите в /etc/hosts имя вашего хоста:
127.0.0.1 host1.server1
Для включения созданного виртуального хоста используется утилита a2ensite
:
sudo a2ensite host1.server1
Отключается хост аналогично утилитой a2dissite
:
sudo a2dissite host1.server1
Модули
mod_userdir
Модуль mod_userdir
позволяет использовать директории, находящиеся в домашних директориях пользователей для хранения веб страниц. По умолчанию Apache ищет запрашиваемые страницы в директории ~/public_html
mkdir ~/public_html
Чтобы включить mod_userdir
, выполните:
sudo a2enmod userdir
и добавьте необходимого пользователя в группу www-data:
sudo adduser $USER www-data
после чего перезагрузите Apache:
sudo service apache2 restart
Страницы будут доступны по адресу http://localhost/~username, где username — имя пользователя.
Настройка public_html подробно.
CGI
Если Вы хотите запускать на сервере cgi-скрипты, подключите модуль cgi
командой
sudo a2enmod cgi
По умолчанию cgi-скрипты размещаются в директории /usr/lib/cgi-bin, но вы можете разместить их где угодно, указав это в настройках своего виртуального хоста, либо глобально для всех хостов в файле /etc/apache2/conf-enabled/serve-cgi-bin.conf.
Eсли ваш сервер работает во внешней сети, то в целях безопасности настоятельно рекомендуется размещать cgi-скрипты вне корневой директории виртуального хоста
Настройка HTTPS в Apache
Веб-сервер Apache полностью поддерживает работу по HTTPS. Чтобы активировать поддержку HTTPS на уже установленном Apache, необходимо выполнить следующее.
Создание ключа и ssl-сертификата
Использование самоподписанных сертификатов хоть и защищает от пассивного прослушивания, тем не менее не гарантирует клиентам, что сервер является именно тем сервером, который им нужен. Преимуществом самоподписанных сертификатов является их бесплатность. Сертификат, подписанный компанией-сертификатором (Certificate authority), стоит денег.
Для создания ключа и сертификата вводим команду:
openssl req -new -x509 -days 30 -keyout server.key -out server.pem
На вопрос «Enter PEM pass phrase:» отвечаем паролем, подтверждаем и запоминаем.
На все последующие вопросы отвечаем произвольно, можно просто щелкать по Enter, соглашаясь с предложенными вариантами, только на вопрос «Common Name (eg, YOUR name) []:» отвечаем именем сайта, для которого создаем сертификат, например www.example.com.
После ответа на все вопросы в директории должны появиться два новых файла — server.pem
(ключ) и server.crt
(сертификат).
Чтобы использовать сгенерированный ключ, нужно знать пароль, введённый нами, и Apache будет спрашивать его у нас при загрузке, а к чему нам лишние вопросы от демонов? 🙂 Поэтому снимаем пароль с ключа:
cp server.key{,.orig} openssl rsa -in server.key.orig -out server.key rm server.key.orig
Скопируем их в /etc/ssl и назначим файлу ключа права чтения только администратору:
sudo cp server.pem /etc/ssl/certs/ sudo cp server.key /etc/ssl/private/ sudo chmod 0600 /etc/ssl/private/server.key
Настройка Apache
Для начала необходимо активировать mod_ssl
:
sudo a2enmod ssl
А затем включить настройки HTTPS сайта по умолчанию:
sudo a2ensite default-ssl
Теперь необходимо отредактировать файл с настройками HTTPS сайта по умолчанию, указав в нём пути к вашим сертификатам. Сам файл называется /etc/apache2/sites-enabled/default-ssl
(или /etc/apache2/sites-enabled/default-ssl.conf
).
В этом файле рекомендуется после директивы
SSLEngine on
добавить строчку
SSLProtocol all -SSLv2
чтобы запретить использование устаревшего протокола SSLv2.
Дальше вам необходимо отредактировать параметры, ответственные за сертификаты.
# Публичный сертификат сервера SSLCertificateFile /etc/ssl/certs/server.pem # Приватный ключ сервера SSLCertificateKeyFile /etc/ssl/private/server.key
Теперь просто перезагрузите Apache:
sudo service apache2 restart
И если все параметры указаны верно, ваши сайты станут доступны по HTTPS.
Протокол HTTPS работает по 443 порту, поэтому если сервер находится за шлюзом, то необходимо на нём пробросить данный порт.
Перенаправление HTTP запросов на HTTPS
Если вы хотите запретить использование HTTP, то самым разумным будет перенаправлять все HTTP запросы к страницам на их HTTPS адрес. Сделаем это с помощью mod_alias
. Если он не включён — включаем:
sudo a2enmod alias sudo service apache2 restart
Затем изменяем файл /etc/apache2/sites-enabled/000-default
, отвечающий за виртуальный хост по умолчанию для HTTP запросов. В этот файл добавляем директиву
Redirect / https://example.com/
При этом все настройки директорий можно удалить, поскольку по HTTP на ваши сайты всё равно будет не попасть.
Всё, теперь ещё раз перезапустите Apache и убедитесь, что при заходе по HTTP вы автоматически перенаправляетесь на HTTPS-страницу.
Ссылки
Возможные проблемы
Если при запуске появляется ошибка
apache2: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
добавьте в свой файл конфигурации строку
ServerName localhost
Смотрите также
Ссылки
Минимальный конфиг виртуального хоста Apache 2 для настройки работы домена в связке Apache + NGiNX
В предыдущей статье был рассмотрен минимальный конфиг виртуального хоста веб-сервера NGiNX, работающей в качестве прокси-сервера для другого веб-сервера — Apache. Надо понимать, что всё это рассматривается на платформе сервера, работающего на Debian 9, но приведённые настройки должны работать на на других операционных системах. В этой статье рассмотрим минимальный файл конфигурации виртуального хоста веб-сервера Apache, в связке с рассмотренным конфигом NGiNX, данное решение позволяет поднимать большое количество сайтов (доменов) на одном рабочем сервере.
Пример минимального конфигурационного файла виртуального хоста Apache для настройки работы домена в связке Apache + NGiNX
Как обычно, сразу приведу готовое решение, потом объясню, что есть что.
Про конфигурацию и предварительную настройку Апача можно почитать пошаговую инструкцию по → этой ссылке. Это сразу позволит понять и разобраться с тем, какие настройки в систему вносятся, а также, откуда что берётся. Итак, собственно минимальный конфиг виртуального хоста веб-сервера Apache:
<VirtualHost 127.0.0.1:8080>
ServerName amorale.club
ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
ServerAlias www.amorale.club
DocumentRoot /var/www/amorale/data/www/amorale.club
CustomLog /var/www/amorale/data/www/logs/amorale.club.access-apache.log combined
ErrorLog /var/www/amorale/data/www/logs/amorale.club-apache.error.log
AssignUserID amorale amorale
AddDefaultCharset UTF-8
DirectoryIndex index.php index.html index.htm
<Directory /var/www/amorale/data/www/amorale.club>
Options +ExecCGI
</Directory>
</VirtualHost>
Как видно (или заранее известно), настройки виртуального хоста у Апача находятся внутри контейнера VirtualHost
. А теперь обо всём по порядку, согласно приведённому листингу.
IP и порт виртуального хоста Apache
В открывающем теге контейнера VirtualHost
прописывается IP и порт виртуального хоста. IP обычно выставляется тот, что соответствует localhost
, а вот порт в связке Apache + NGiNX в случае, когда Apache стоит за проксирующим NGiNX, должен быть не стандартным 80
, а тем, который прописан в системе. В нашем случае, второй порт по договорённости для http — 8080
. Так сложилось исторически. =)
В итоге получим первую строчку нашего конфига: <VirtualHost 127.0.0.1:8080>
Доменное имя виртуального хоста
Директива ServerName
служит для привязки доменного имени к виртуальному хосту. После пробела за ней нужно указать домен, который должен отвечать. Конечно, домен должен быть привязан записями DNS к данному серверу.
Контактные данные администратора виртуального хоста
Для того, чтобы было куда жаловаться, нужно после директивы ServerAdmin
указать email администратора хоста.
Дополнительные домены виртуального хоста
Снова, так сложилось исторически (и это так засело в головах, что люди до сих пор пользуются), можно задать другие доменные имена, на которые будет отзываться виртуальный хост. После директивы ServerAlias
через пробелы нужно указать эти доменные имена. www
(куда уж без него) и другие, если нужно.
Домашняя папка с файлами сайта
После директивы DocumentRoot
нужно указать путь до каталога, служащего домашней папкой сайта. Путь обычно указывается абсолютный от корня файловой системы сервера. Неизвестно, под каким пользователем будет работать Apache, хотя это можно и выяснить, но проще указать абсолютный путь — это универсальное решение и без относительности пользователя и его прав.
Файлы логов доступа и ошибок виртуального хоста
Следующие две директивы CustomLog
и ErrorLog
задают пути до файлов логов доступа и ошибок работы виртуального хоста соответственно.
Лирическое отступление
Веб-серверы Apache и NGiNX разрабатываются разными командами людей, поэтому логи этих серверов находятся в разных местах на сервере. Что, на мой взгляд, очень неудобно. Поэтому тут можно прописать ту же папку, что и в конфиге NGiNX для этих логов. Просто пометить, какому веб-серверу, какой лог соответствует. И тогда, всё будет в одном месте, и в случае необходимости, доступно в пределах одной папки (и даже упорядочено по алфавиту и следовать одно под другим в списке файлов). Удобно жешь! =D
Указание группы и пользователя для запуска процесса Apache
Для того, чтобы Апач не мог гулять по всем виртуальным хостам, а при запросе к определённому хосту мог быть ограничен только его домашней директорией, в директиве AssignUserID
прописывается группа и пользователь, под которым будет запущен Апач при обращении по заданному доменному имени.
Это позволяет свести ущерб взлома одного сайта и усложнить взлом других. Для работы директивы AssignUserID
требуется установить модуль mpm-itk к серверу Apache, но это делается предельно просто. Прочитать, о том как, можно по → этой ссылке.
Задание кодировки символов документов виртуального хоста
С кириллицей вообще, ещё тот головняк, но с введением кодировки UTF-8, жизнь стала проще. Директива AddDefaultCharset
задаёт кодировку символов в текстовых документах сервера. Для того, чтобы браузер не выдавал кракозябдиков, нужно следить за тем, чтобы все документы сервера на русском языке (кириллистические символы) были в одной кодировке, совпадающей с кодировкой по умолчанию, установленной на сервере. Если с кодировкой что-то не так, и в браузере кракозяблики, — разбирайтесь, где косяк: на сервере установлена другая кодировка, документ стырен под другой кодировкой или база данных отдаёт данные в третьей кодировке. Есть ещё html мета-тег, который тоже может задавать кодировку документа для вывода в браузере. В общем, чтобы не было головной боли, нужно выбрать кодировку раз и на всю оставшуюся жизнь сохранять ей верность в любых ситуациях. Тогда всё будет хорошо и наступит счатье. =)
Задание индексных файлов для папок на сервере
Директива DirectoryIndex
задаёт индексные файлы для папок на сервере. Если в запросе к серверу указана всего лишь папка, но в ней расположен один из указанных файлов, то именно он и будет открыт. Последовательность расположения индексных файлов в директиве DirectoryIndex
имеет принципиальное значение. В нашем примере, если в папке есть все три файла, то откроется первый, который указан (то есть index.php
). Если его нет, то сервер отдаст index.html
. Если и его нет в папке, то следующий по списку. Если список кончился, а индексный файл так и не найден, сработает следующая директива:
Задание свойств папок на сервере
Эти свойства можно перепрописать в файле .htaccess
, но если его нет или свойства не перепрописаны, то применятся те, что заданы в контейнере Directory
.
Сейчас подробно не буду останавливаться на этом (может быть напишу отдельную статью о том, как использовать данную конструкцию для правильной (безопасной и удобной) настройки папок сайта на сервере.
Резюме
Собственно всё. После этого надо не забыть закрыть контейнер виртуального хоста: </VirtualHost>
.
Надо понимать, что это минимальный джентльменский набор настроек, но он позволяет поднять виртуальные хосты Apache 2 для настройки работы домена в связке Apache + NGiNX. Ну и доменное имя нужно конечно использовать своё, а не моё amorale.club
. Пути к папкам и файлам должны существовать. Иначе рискуете нарваться на ошибку рестарта Апача.
Конфиги виртуальных хастов обычно лежат в папке /etc/apache2/sites-available
на сервере.
Для того, чтобы поднять виртуальный хост (запустить его в работу) нужно выполнить команду
# a2ensite ваш_домен.ru
Это активирует виртуальный хост, если в конфиге нет критических ошибок. То есть создаёт символьную ссылку в папке /etc/apache2/sites-enabled
на этот файл конфига.
Не уверен, что это необходимо, но я ещё и перезапускаю Апач командой:
# service apache2 reload
Если Apache рестартанул и не выдал никаких сообщений, сайт должен начать открываться в браузере по доменному имени (если у него конечно есть какие-то документы в домашней директории). =)