Итак, продолжаем нашу передачу. Редко какой веб-сервер обходится без использования концепции виртуального хостинга. И это понятно, ведь обычно сайты не нуждаются в постоянной полной мощности сервера, да и неэкономично это. Nginx предлагает замечательные возможности по организации виртуального хостинга при этом требуя от администратора минимум трудозатрат и времени. Вообще-то, в предыдущих статьях мы уже сталкивались с виртуальными хостами Nginx, поскольку ни одна рабочая конфигурация этого демона не обходится без хотя бы одного виртуального хоста. В сегодняшней заметке мы с вами рассмотрим пример настройки двух виртуальных хостов, чтобы начинающие смогли понять что к чему и в своих конфигурациях настраивать столько хостов, сколько нужно.
По своей природе виртуальные хосты бывают двух типов: «name-based» и «address-based». Хосты первого типа сервер обслуживает на основе их доменного имени, получаемого от клиента в момент запроса. Виртуальные Хосты второго типа обслуживаются сервером на основании IP-адреса интерфейса, на который поступил запрос от клиента. Также, конечно же, можно комбинировать эти два типа, т. е. на определённом IP-интерфейсе «вешать» определённые name-based виртуальные хосты.
Если вы читали одну из предыдущих статей о конфигурировании Nginx, то должны помнить опцию server, используемую для создания секции виртуального хоста. Таких секций в вашем файле конфигурации может быть множество, где каждая будет описывать отдельный виртуальный хост. Таким образом, файл конфигурации, описывающий несколько виртуальных хостов, будет выглядеть примерно так:
server { ... } server { ... } server { ... } ...
Name-based
Теперь давайте попробуем на практике создать конфигурацию для пары виртуальных name-based виртуальных хостов domain-1.com и domain-2.com. Создайте новый файл конфигурации Nginx, например, в /etc/nginx/sites-available/twohosts (напоминаю ещё раз: все примеры рассматриваются в контексте установленного из репозиториев Nginx в Debian 5) и откройте его в текстовом редакторе. Следующая конфигурация описывает два виртуальных хоста:
server { server_name domain-1.com; access_log /var/log/nginx/domain-1.com.log; location / { root /var/www/domain-1.com; index index.htm index.html; } } server { server_name domain-2.com; access_log /var/log/nginx/domain-2.com.log; location / { root /var/www/domain-2.com; index index.htm index.html; } }
Обратите внимание, что в конфигурации обоих хостов отсутствует параметр listen, определяющий IP-адрес интерфейса и порт, на котором хосты будут ожидать входящих соединений. Таким образом, описанные выше виртуальные хосты будут ожидать соединений на любом интерфейсе, на порту 80. Далее создайте каталоги для хранения контента:
# mkdir /var/www/domain-{1,2}.com
И поместите в них по индексному файлу с различным содержимым, чтобы отличить при подключении из браузера один от другого:
# for NAME in `seq 2`; do echo "Domain ${NAME}" > /var/www/domain-${NAME}.com/index.html; done
Делаем новый конфигурационный файл доступным для загрузки Nginx:
# ln -s /etc/nginx/sites-available/twohosts /etc/nginx/sites-enabled/twohosts
И перезапускаем сервер:
# /etc/init.d/nginx restart
Не забудьте добавить в /etc/hosts вашего клиентского компьютера необходимые записи (естественно, не забудьте заменить IP-адрес сервера на тот, который у вас):
# echo 192.168.0.1 domain-{1,2}.com >> /etc/hosts
На этом всё. Теперь попробуйте с клиентского компьютера открыть браузером URL http://domain-1.com и http://domain-2.com. Если всё настроено верно, то по каждому из URL вы увидите строки «Domain 1» и «Domain 2» соответственно.
Address-based
Иногда бывает необходимо, чтобы виртуальный хост был доступен только по определённому адресу, а не со всех интерфейсов сервера. Здесь на помощь приходит уже известный по предыдущим публикациям параметр listen. Допустим, у вашего сервера есть два интерфейса: 192.168.0.1 и 192.168.0.2. Вам необходимо, чтобы виртуальный хост domain-1.com был доступен только по адресу 192.168.0.1, а хост domain-2.com — по адресу 192.168.0.2. Всё, что вам нужно сделать это задействовать параметр listen в конфигурации каждого из виртуальных хостов:
server { server_name domain-1.com; access_log /var/log/nginx/domain-1.com.log; listen 192.168.0.1; location / { root /var/www/domain-1.com; index index.htm index.html; } } server { server_name domain-2.com; access_log /var/log/nginx/domain-2.com.log; listen 192.168.0.2; location / { root /var/www/domain-2.com; index index.htm index.html; } }
Замечательный цикл статей. Я раньше не имел дело с nginx, обходясь только apache, но теперь есть повод поставить первый.
Отличная статья! Четко, лаконично и без воды! Респект!
Спасибо всё работает.
Спасибо за статью!