Site icon 8HOST.COM

Nginx как балансировщик глобального трафика на Debian или Ubuntu

Вступление

С ростом клиентской базы растет и расстояние между сервером(ами) и клиентами. Всем известно, что при увеличении нагрузки сервера его нужно масштабировать. Но что делать, когда проблема в расстоянии?

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

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

Требования

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

Кроме того, нужно уметь создавать серверы в разных регионах.

Предположения

Эта статья делает несколько предположений для простоты чтения. Итак, предполагается, что:

Настройка поддоменов и DNS

Выберите поддомены на свое усмотрение. В данном руководстве используются eu.example.com (Европа) и as.example.com (Азия).

Для каждого из этих поддоменов нужно добавить запись A в конфигурациях DNS, внося также IP сервера для этого региона:

Установка Nginx и GeoIP

Установить Nginx с модулем GeoIP  можно двумя способами:

  1. использовать предварительно скомпилированный пакет (GeoIP включен только в -full и -extra);
  2. скомпилировать Nginx, используя парамтр конфигурации –with-http_geoip_module (в таком случае понадобятся библиотеки geoip-dev).

В данном руководстве используется предварительно скомпилированный пакет.

sudo apt-get update
sudo apt-get install nginx-full geoip-database

Теперь бинарные файлы Nginx и GeoIP доступны. Но есть еще один нюанс: база данных GeoIP по имени GeoLiteCity содержит информацию о регионах; нужно скачать и установить ее вручную.

wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
mv GeoLiteCity.dat /usr/share/GeoIP/

Настройка Nginx и виртуального хоста

Теперь нужно указать Nginx на местонахождение баз данных GeoIP. Кроме того, нужно настроить Nginx на виртуальном хосте, чтобы Nginx правильно отвечал на запросы, касающиеся информации GeoIP.

В текстовом редакторе откройте файл nginx.conf (по умолчанию /etc/nginx/nginx.conf). Внесите в него строку geoip_city /usr/share/GeoIP/GeoLiteCity.dat;. После этого файл nginx.conf будет иметь следующий вид:

http {
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
...
}

Сохраните внесенные изменения.

Теперь нужно отредактировать файл виртуального хоста (по умолчанию /etc/nginx/sites-available/default). Внутри этого файла нужно создать map и внести поддомены в директиву server_name.

Блок map в параметрах Nginx позволяет установить переменную $closest_server, основываясь на значении $geoip_city_continent_code. Подробнее о модуле map можно прочесть в документации Nginx.

map $geoip_city_continent_code $closest_server {
default www.example.com;
EU      eu.example.com;
AS      as.example.com;
}

Затем нужно внести поддомены с учетом местоположения в директиву $server_name:

server {
server_name example.com
www.example.com
eu.example.com
as.example.com;
...
}

Последнее, что нужно сделать, – создать на виртуальном хосте условие, которое будет перенаправлять посетителей на ближайший сервер. Добавьте следующее условие в конфигурацию:

server {
...
if ($closest_server != $host) {
rewrite ^ $scheme://$closest_server$request_uri break;
}
...
}

После внесения всех этих поправок файл виртуального хоста должен выглядеть так:

map $geoip_city_continent_code $closest_server {
default www.example.com;
EU      eu.example.com;
AS      as.example.com;
}
server {
server_name example.com
www.example.com
eu.example.com
as.example.com;
if ($closest_server != $host) {
rewrite ^ $scheme://$closest_server$request_uri break;
}
...
}

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

Тестирование

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

Nginx предоставляет возможность проверить конфигурационные файлы, не затрагивая текущих настроек Nginx. Для этого запустите одну из этих команд:

nginx -t, service nginx configtest

или

/etc/init.d/nginx configtest

Если все работает должным образом, перезапустите Nginx:

nginx -s reload, service nginx reload

или

/etc/init.d/nginx reload

Чтобы увидеть балансировку трафика в действии, откройте браузер и посетите www.example.com.

Если посетить сайт, используя прокси Европы, запрос будет переадресован на eu.example.com.

Если посетить сайт, используя прокси Азии, запрос будет переадресован на as.example.com.

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