Использование модуля map в Nginx в Ubuntu 16.04

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

Также важно правильно настроить переадресацию; когда старая страница сайта заменяется новой, старая ссылка должна вести на новую версию страницы.

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

Требования

  • Сервер Ubuntu 16.04 (выполнить начальную настройку сервера вам поможет это руководство).
  • Пользователь с доступом к sudo.
  • Предустановленный веб-сервер Nginx (руководство по установке можно найти здесь).

1: Создание тестовой страницы

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

Создайте простую страницу index.html в стандартном каталоге веб-сервера Nginx:

sudo sh -c 'echo "Home" > /var/www/html/index.html'

Убедитесь, что веб-сервер может обслуживать новую страницу.

Примечание: В следующей команде не нужно указывать index.html, потому что этот файл обслуживается по умолчанию, если не указано имя другого файла.

curl http://localhost/

На экране появится:

Home

Теперь попробуйте открыть в /var/www/html/ несуществующий (или ранее удалённый) файл, например, old.html:

curl -L http://localhost/old.html

На экране появится системное сообщение об ошибке 404 Not Found:

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>

Модуль map поможет вам сделать так, чтобы ссылка на удалённый файл снова работала.

2: Настройка переадресации

На маленьких сайтах в несколько страниц для настройки переадресации достаточно использовать простой условный оператор if. На более объёмных сайтах такую настройку выполнить сложнее, так как список условий становится больше.

Модуль map предлагает простое и удобное решение для настройки переадресации. Он позволяет сравнивать значения переменных Nginx со списком условий, а затем связывает новое значение с переменной в зависимости от результатов сравнения.

Ниже показано, как с помощью map сравнить запрашиваемый URL-адрес со списком старых страниц и перенаправить их на новые версии страниц.

Модуль map является частью ядра Nginx, потому его не надо устанавливать. Чтобы настроить переадресацию, откройте виртуальный хост (блок server) по умолчанию.

sudo nano /etc/nginx/sites-available/default

Найдите в нём раздел server:

. . .
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
. . .

Добавьте в файл два новых раздела: один перед разделом server, а второй внутри него.

Перед разделом server будет идти блок map, который определяет соответствия между старыми и новыми URL-адресами. Раздел внутри блока server настраивает переадресацию.

. . .
# Default server configuration
#
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .

Директива map $uri $new_uri берет содержимое переменной системы $uri, в которой указывается URL-адрес запрашиваемой страницы, и сравнивает его со списком условий в фигурных скобках. Каждый элемент в списке условий состоит из двух частей: значения, с которым нужно сравнить значение переменной, и новое значение, которое нужно передать переменной в случае соответствия.

Строка /old.html /index.html в блоке map значит, что если значение переменной $uri – /old.html, переменная $new_uri примет значение /index.html. Если значение переменной $uri не совпадает, модуль не будет заменять её текущее значение.

Затем с помощью условного оператора if в блоке server можно проверить, было ли установлено значение переменной $new_uri. Если значение установлено, значит, условие было выполнено, и сервер должен перенаправить пользователя на новую веб-страницу с помощью команды rewrite. Ключевое слово permanent настраивает постоянный редирект (301 Moved Permanently). Это значит, что старый адрес становится недействительным.

Сохраните и закройте файл.

Чтобы обновить настройки, перезапустите Nginx:

sudo systemctl restart nginx

Чтобы протестировать новые настройки, снова выполните такой запрос:

curl -L http://localhost/old.html

Если всё сделано правильно, на экране вместо ошибки 404 Not Found появится:

Home

Это значит, что переадресация работает должным образом.

Переадресация URL-адресов – одна из многих полезных возможностей модуля map. Ещё одну важную функцию – фильтрацию трафика по географическому расположению посетителей – мы рассмотрим в следующем разделе.

3: Ограничение доступа к сайту

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

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

Примечание: Конечно, это далеко не идеальное средство защиты от вредоносного трафика. Более того, так вы ограничите аудиторию своего сайта. Среди преимуществ этого метода – простота настройки и устойчивость к ошибкам.

Фильтрация трафика на уровне сервера быстрее, чем на уровне сайта, и охватывает все запросы (включая статические файлы, такие как изображения). Такая фильтрация блокирует доступ запросов к программному обеспечению сайта, благодаря чему злоумышленникам труднее обнаружить и использовать уязвимости.

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

sudo nano /etc/nginx/conf.d/geoip.conf

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

. . .
# GeoIP database path
#
geoip_country /usr/share/GeoIP/GeoIP.dat;

Теперь нужно настроить модуль map и указать условия ограничений. Откройте виртуальный хост по умолчанию:

sudo nano /etc/nginx/sites-available/default

Найдите блок server, который вы расширили в предыдущих разделах руководства. На данный момент он выглядит так:

. . .
# Default server configuration
#
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .

Добавьте два новых раздела: один перед блоком server и один внутри этого блока.

Раздел перед блоком server – это новый блок map, который определяет действие по умолчанию (отказ в доступе) и белый список стран. Раздел, который нужно добавить в сам блок server блокирует доступ к сайту  согласно результатам блока map.

. . .
# Default server configuration
#
# Allowed countries
#
map $geoip_country_code $allowed_country {
default no;
country_code_1 yes;
country_code_2 yes;
}
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
# Disallow access based on GeoIP
if ($allowed_country = no) {
return 444;
}
# Old website redirect
if ($new_uri) {
rewrite ^ $new_uri permanent;
}
. . .

Примечание: Вместо country_code_1 и country_code_2 укажите коды стран, которые входят в белый список. Список кодов стран можно найти здесь.

Сохраните и закройте файл.

В данном блоке map переменная $allowed_country должна всегда иметь какое-то значение. По умолчанию она имеет значение no. Если переменная $geoip_country_code совпадает с кодом одной из стран в блоке, переменная $allowed_country будет иметь значение yes. В случае если $allowed_country имеет значение no, сервер блокирует доступ к сайту и выдаёт ошибку 444 Connection Closed Without Response.

Чтобы обновить настройки, введите:

sudo systemctl restart nginx

Если вы не добавили свою страну в белый список, при посещении ссылки http://your_server_ip вы увидите сообщение The page isn’t working или The page didn’t send any data.

Заключение

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

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

Также модуль map можно использовать для перенаправления клиентов на защищённые страницы с поддержкой SSL. Больше информации о возможностях этого модуля можно получить в официальной документации Nginx.

Tags: , ,

Добавить комментарий