Как использовать модуль карты Nginx в Ubuntu 16.04

Вступление

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

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

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Создание и тестирование примера веб-страницы

Сначала мы создадим тестовый файл, представляющий недавно опубликованный веб-сайт. Мы будем использовать этот файл для проверки вашей конфигурации.

Давайте создадим простую страницу + index.html + в каталоге веб-сайта Nginx по умолчанию. В этом файле будет просто текст, описывающий то, что внутри: Домой.

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

С этим тестовым файлом на месте мы проверим, правильно ли он работает с помощью + curl +. Нам не нужно указывать + index.html + для этой команды, потому что этот файл обслуживается по умолчанию, если не указано точное имя файла.

curl http://localhost/

В ответ вы должны увидеть одно слово, говорящее * Home *, как показано ниже:

Ответ Nginx

Home

Теперь давайте попробуем получить доступ к файлу, которого нет в + / var / www / html / +, как + old.html +.

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

Ответом будет системное сообщение об ошибке * 404 Not Found *, означающее, что страница не существует.

Ответ Nginx

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

Мы просто используем фиктивный веб-сайт в этом учебном пособии, но если + old.html + была страницей на реальном веб-сайте, который раньше существовал и был удален, возврат 404 будет означать, что все ссылки на эту страницу будут повреждены. Это далеко не идеально, потому что эти ссылки могли быть проиндексированы Google, распечатаны или записаны, или предоставлены другим способом.

На следующем шаге мы будем использовать модуль карты, чтобы этот старый адрес снова работал, перенаправляя зрителей на новые замены автоматически.

Шаг 2 - Настройка перенаправлений

Для небольших веб-сайтов с несколькими страницами простые условные операторы + if + могут использоваться для перенаправлений и тому подобных вещей. Однако такую ​​конфигурацию нелегко поддерживать или расширять в долгосрочной перспективе, поскольку список условий увеличивается.

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

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

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

Найдите блок конфигурации + server +, который выглядит следующим образом:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

. . .
# Default server configuration
#

server {
   listen 80 default_server;
   listen [::]:80 default_server;

. . .

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

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

Модифицированный / etc / nginx / sites-available / default

. . .
# Default server configuration
#







server {
   listen 80 default_server;
   listen [::]:80 default_server;





. . .

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

Строка + / old.html / index.html + внутри блока + map + означает, что если значение + $ uri + 'равно + / old.html +, + $ new_uri + будет изменено на ` + / index.html + `. Если он не совпадает, он не изменяется. Здесь мы определяем только одно условие, но вы можете определить столько условий, сколько хотите на карте.

Затем, используя условный оператор + if + внутри блока + server +, мы проверяем, установлено ли значение переменной + $ new_uri +. Если это так, это означает, что условие на карте было выполнено, и мы должны перенаправить на новый веб-сайт с помощью команды + rewrite +. Ключевое слово + constant + гарантировало, что перенаправление будет * 301 Moved Permanently * HTTP-перенаправлением, что означает, что старый адрес больше не действителен и не будет возвращаться в оперативный режим.

Сохраните и закройте файл для выхода.

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

sudo systemctl restart nginx

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

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

На этот раз на выходе не будет ошибки * 404 Not Found *. Вместо этого вы увидите простую домашнюю страницу, которую мы создали на шаге 1.

Ответ Nginx

Home

Это означает, что карта была настроена правильно, и вы можете использовать ее для перенаправления URL-адресов, добавляя больше записей на карту.

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

Шаг 3 - Ограничение доступа к веб-сайту в некоторых странах

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

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

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

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

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

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

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

/etc/nginx/conf.d/geoip.conf

. . .
# GeoIP database path
#

geoip_country /usr/share/GeoIP/GeoIP.dat;

Следующим шагом является создание необходимой карты и конфигурации ограничений. Откройте конфигурацию Nginx блока сервера по умолчанию.

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

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

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

. . .
# 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 + говорит об этом.

Модифицированный / etc / nginx / sites-available / default

. . .
# 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;
   }
. . .

Сохраните и закройте файл для выхода.

Здесь мы использовали ` и ` в качестве заполнителей. Замените эти переменные двухсимвольным кодом страны для страны или стран, которые вы хотите включить в белый список. Вы можете использовать the полный список доступных для поиска кодов ISO всех стран, чтобы найти. Например, двухсимвольный код для Соединенных Штатов - «+ US».

В отличие от первого примера, в этом блоке + map + переменная + $ allow_country + всегда будет иметь какое-то значение. По умолчанию установлено значение + no +; если переменная + $ geoip_country_code + совпадает с одним из кодов стран в блоке, она устанавливается на + yes +. Если переменная + $ allow_country + имеет значение + no +, мы возвращаем * 444 Соединение закрыто без ответа * вместо обслуживания реального веб-сайта.

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

sudo systemctl restart nginx

Если вы не добавили свою страну в белый список, при попытке перейти к + http: // + вы увидите сообщение об ошибке, например * Страница не работает * или * Страница не отправлена любые данные *. Если вы добавите свою страну в белый список, вы увидите * Home *, как и раньше.

Заключение

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

Еще один очень популярный вариант использования модуля map - это условные перенаправления для защищенных частей сайта в среде, отличной от SSL. Настройка принудительного SSL-соединения только для форм, требующих, например, ввода пароля, является хорошим примером того, как применить модуль карты в реальном сценарии, и я рекомендую экспериментировать с такой настройкой.

Более подробную информацию можно найти in в официальной документации модуля карты Nginx.

Related