Использование модуля map в Nginx в Ubuntu 16.04
Ubuntu | Комментировать запись
При подготовке сервера к поддержке веб-сайта нужно выполнить несколько общих настроек: к примеру, некоторые файлы должны храниться в кэше пользователей дольше других, а некоторые страницы сайта должны быть доступны только по защищённому соединению.
Также важно правильно настроить переадресацию; когда старая страница сайта заменяется новой, старая ссылка должна вести на новую версию страницы.
Веб-сервер 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: map, NGINX, Ubuntu 16.04