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






Итак, продолжаем нашу передачу. Редко какой веб-сервер обходится без использования концепции виртуального хостинга. И это понятно, ведь обычно сайты не нуждаются в постоянной полной мощности сервера, да и неэкономично это. 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: 4 комментария

  1. Замечательный цикл статей. Я раньше не имел дело с nginx, обходясь только apache, но теперь есть повод поставить первый.

Комментарии запрещены.