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

Вступление

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

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

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

Предпосылки

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

[[step-1 -—- create-and-testing-an-example-webpage]] == Шаг 1. Создание и тестирование примера веб-страницы

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

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

sudo sh -c 'echo "Home" > /usr/share/nginx/html/index.html'

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

curl http://localhost/

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

Ответ Nginx

Home

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

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

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

Ответ Nginx




    
        The page is not found
. . .

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

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

[[step-2 -—- configuring-the-redirects]] == Шаг 2. Настройка переадресации

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

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

Модуль карты является основным модулем Nginx, что означает, что его не нужно устанавливать отдельно для использования. Чтобы создать необходимую карту и конфигурацию перенаправления, откройте файл конфигурации Nginx серверного блока по умолчанию вvi (здесьshort introduction to vi) или в вашем любимом текстовом редакторе.

sudo vi /etc/nginx/nginx.conf

Найдите блок конфигурацииserver, который выглядит так:

/etc/nginx/nginx.conf

. . .

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

. . .

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

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

Модифицированный /etc/nginx/nginx.conf

. . .

# Old website redirect map
#
map $uri $new_uri {
    /old.html /index.html;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # 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. Если он не совпадает, он не изменяется. Здесь мы определяем только одно условие, но вы можете определить столько условий, сколько хотите на карте.

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

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

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

sudo systemctl restart nginx

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

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

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

Ответ Nginx

Home

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

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

[[шаг-3 -—- ограничение-доступ-веб-сайта к определенным-странам]] == Шаг 3 - Ограничение доступа к веб-сайту для определенных стран

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

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

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

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

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

sudo vi /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 vi /etc/nginx/nginx.conf

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

/etc/nginx/sites-available/default

. . .

# Old website redirect map
#
map $uri $new_uri {
    /old.html /index.html;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    # Old website redirect
    if ($new_uri) {
        rewrite ^ $new_uri permanent;
    }
. . .

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

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

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

. . .

# 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 в качестве заполнителей. Замените эти переменные двухсимвольным кодом страны для страны или стран, которые вы хотите включить в белый список. Вы можете использоватьthe ISO’s full, searchable list of all country codes для поиска. Например, двухсимвольный код для США -US.

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

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

sudo systemctl restart nginx

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

Заключение

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

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

Более подробную информацию можно найти вin Nginx’s official map module documentation.

Related