5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

lighttpd-virt-host.txt

Веб-сервер Lighttpd - настраиваем виртуальные хосты.
Автор: Уваров А.С. — 15.05.2014 17:28 |
Мы часто используем веб-сервер Lighttpd в своих решениях, как быстрый и нетребовательный к ресурсам. Также мы рассказывали, как создать на его базе полноценный веб-сервер. Сегодня мы пойдем дальше и рассмотрим, как настроить сервер для работы с несколькими сайтами. Для этой цели предназначен механизм виртуальных хостов, который позволяет серверу обслуживать на одном IP-адресе необходимое количество сайтов с различными доменными именами.

Прежде чем браться за настройки, необходимо определиться со структурой хранения данных. По умолчанию веб-сервер использует директорию /var/www, которая используется для размещения содержимого сайта. А если сайтов несколько? Размещать остальные в каком-то другом месте?

Единого мнения на этот счет нет и быть не может. Каждый волен поступать так, как ему нравится. Но в любом случае желательно выработать систему, чтобы вы всегда знали где искать содержимое того или иного сайта. Мы придерживаемся следующей схемы: все данные сайтов хранятся в папках с именем сайта внутри /var/www, корень директории при этом не используется.

Данная схема хороша тем, что все лежит в одном месте и логично структурировано по папкам. Т.е. даже незнакомый со структурой сервера администратор без труда найдет место размещения сайтов не заглядывая в конфиги веб-сервера.

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

Также никто не мешает вам выработать вам свой вариант хранения данных, в зависимости от ваших потребностей и предпочтений.

Определившись со схемой хранения перейдем к настройкам сервера. Прежде всего создадим директории для сайтов и назначим их владельцем веб-сервер:

mkdir /var/www/example1.com
chown www-data:www-data /var/www/example1.com

mkdir /var/www/example2.com
chown www-data:www-data /var/www/example2.com
Откроем конфигурационный файл /etc/lighttpd/lighttpd.conf и найдем там опцию:

server.document-root = "/var/www/"
Которая указывает корневую папку веб-сервера по умолчанию. Содержимое данной папки будет выведено, например, если обратиться к веб-серверу по IP-адресу. По умолчанию там будет страница-заглушка веб-сервера. Более правильным и логичным будет отдавать по умолчанию один из сайтов, например, example1.com, поэтому приводим опцию к виду:

server.document-root = "/var/www/example1.com/
Теперь опишем наши виртуальные хосты, для этого создаем в конце конфигурационного файла секции со следующим содержимым:

$HTTP["host"] == "example1.com" {
server.document-root = "/var/www/example1.com"
server.errorlog = "/var/log/lighttpd/example1.com-error.log"
accesslog.filename = "/var/log/lighttpd/example1.com-access.log"
}
Это минимальный набор опций для хоста. Первая строка указывает путь к корневой директории сайта, вторая и третья к логам ошибок и доступа соответственно. Если этого не сделать, то логи всех сайтов будут писаться в один файл, что неудобно.

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

Также настройки сайтов можно размещать в отдельных файлах, это позволит быстро включать и выключать необходимые сайты не прибегая к правке конфигурационного файла. Для этого в директории /etc/lighttpd/conf-available создадим файл конфигурации сайта:

touch /etc/lighttpd/conf-available/10-example1.conf
После чего внесем в него указанное выше содержимое секции. Для включения сайта достаточно сделать символьную ссылку с файла конфигурации сайта в директорию /etc/lighttpd/conf-enabled:

ln -s /etc/lighttpd/conf-available/10-example1.conf /etc/lighttpd/conf-enabled
Для отключения, соответственно, удаляем ссылку, не затрагивая сам файл конфигурации сайта.

Казалось бы, можно перезапускать веб-сервер и переходить к работе с сайтами. Но не спешите, мы забыли про www. Сегодня, особенно далекие от администрирования веб-серверов, пользователи считают www необязательной "приставкой" перед именем домена, в тоже время с точки зрения веб-сервера и системы DNS www является полноценным хостом (доменом третьего уровня, поддоменом) в зоне имен родительского домена.

Технически сайты www.example.com и test.example.com абсолютно равнозначны, это домены третьего уровня, содержимое которых может быть совершенно произвольным и не обязано совпадать с содержимым сайта example.com. Исторически же сложилось так, что на поддомене www принято размещать сайт родительского домена, эта традиция восходит к временам становления интернета, когда сам факт наличия доменного имени совсем не предполагал наличия на нем веб-сайта. Доменное имя всего лишь представляло собой некоторое адресное пространство, внутри которого могли существовать различные хосты и сервисы.

Например, в домене example.com могли существовать почтовый, FTP и веб сервера. В то же время было выработано соглашение, по которому хосты различных службы получали типовые имена, веб сервер - www, почтовый - mail и т.д. Поэтому, чтобы просмотреть веб-сайт в домене example.com вы должны были обратиться к его веб-серверу - www.example.com.

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

На сегодня ситуация такова, что для пользователей имена www.example.com и example.com являются одним и тем же адресом, в то же время технически представляя два разных хоста. Поэтому требуется принять ряд технических мер, для того чтобы пользователи по любому из вариантов адреса получали одинаковое содержимое.

Мы не видим никаких оснований использовать www в имени сайта, поэтому наиболее очевидным решением будет редирект с домена www на родительский домен. Для этого в файл /etc/lighttpd/lighttpd.conf нужно добавить следующую секцию:

$HTTP["host"] =~ "^www\.(.*)" {
url.redirect = ( "^/(.*)" => "http://%1/$1" )
}
Это позволит автоматически перенаправлять пользователей, набравших в адресе сайта www на сайт без www для любого обслуживаемого данным веб-сервером домена. В последних версиях lighttpd данный мод уже входит в комплект поставки, для его активации необходимо создать символьную ссылку:

ln -s /etc/lighttpd/conf-available/10-no-www.conf /etc/lighttpd/conf-enabled
После чего убедитесь, что в /etc/lighttpd/lighttpd.conf в секции server.modules включен mod_redirect, в противном случае раскомментируйте эту строку:

server.modules = (
...
"mod_redirect",
Теперь можно перезапустить веб-сервер и перейти к работе с сайтами:

service lighttpd restart
Не следует забывать про www и при настройке DNS-зоны домена. Вы в обязательном порядке должны создать две записи типа A:

example.com. IN A 22.11.33.44
www.example.com. IN A 22.11.33.44
Обе записи должны указывать на ваш веб-сервер. Аналогичные настройки вы должны осуществить на внутреннем DNS-сервере для доступа к сайту из внутренней сети.

Если вы используете Microsoft DNS сервер, то вам нужно создать зону example.com, а в ней две записи, пустую и для хоста www, указывающие на адрес веб-сервера.



Для используемого нами на платформе Linux dnsmasq потребуется для каждого сайта создать две записи:

address=/example.coml/192.168.31.80
address=/www.example.com/192.168.31.80
Аналогичные записи следует создать и во всех иных случаях, для этого обратитесь к документации по используемому вами DNS-серверу.