Вступление
С ростом клиентской базы растет и расстояние между сервером(ами) и клиентами. Всем известно, что при увеличении нагрузки сервера его нужно масштабировать. Но что делать, когда проблема в расстоянии?
Решение просто: необходимо установить сервер в географических точках, находящихся ближе к клиентской базе, и направить его на основе их расположения. Но как сделать это легко и без лишних затрат?
Данное руководство покажет, как настроить Nginx для обнаружения и перенаправления клиентов на поддомен, который указывает на географически подходящий сервер.
Требования
Чтобы выполнить действия данного руководства, необходима учетная запись пользователя с привилегиями sudo.
Кроме того, нужно уметь создавать серверы в разных регионах.
Предположения
Эта статья делает несколько предположений для простоты чтения. Итак, предполагается, что:
- доменное имя – www.example.com
- основной сервер находится в США
- необходимо установить GTD для Европы и Азии
- IP-адреса сервера: США 1.1.1.1, Европа 1.1.1.2, Азия: 1.1.1.3
Настройка поддоменов и DNS
Выберите поддомены на свое усмотрение. В данном руководстве используются eu.example.com (Европа) и as.example.com (Азия).
Для каждого из этих поддоменов нужно добавить запись A в конфигурациях DNS, внося также IP сервера для этого региона:
- eu.example.com – 1.1.1.2
- as.example.com – 1.1.1.3
Установка Nginx и GeoIP
Установить Nginx с модулем GeoIP можно двумя способами:
- использовать предварительно скомпилированный пакет (GeoIP включен только в -full и -extra);
- скомпилировать 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.
С этого момента все посетители сайта будут перенаправлены на ближайший к ним сервер, что существенно ускорит работу сайта и улучшит отношение посетителей.