Поиск по сайту:
Общеизвестно, что четверть часика больше, чем четверть часа (Г. Лихтенберг).

Примеры директивы location в Nginx

21.04.2025
Примеры директивы location в Nginx

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

 

Базовый Синтаксис директивы location в Nginx

Директива location в Nginx определяется в файле конфигурации nginx.conf. Ниже вы можете увидеть её базовый синтаксис:

location [modifier] uri { ... }

 

  • modifier: необязательный параметр, определяющий тип соответствия (например, exactprefixregex).
  • uri: URI, который должен быть сопоставлен.
  • Внутри фигурных скобок можно задать различные параметры и инструкции (например, proxy_passrootindex).

 

Пример точного Совпадения

Точное совпадение происходит, когда запрошенный URI точно соответствует указанной строке.

location = /exact-match {
    root /var/www/html;
    index index.html;
}

 

В этом примере блок location будет обрабатывать только запросы к /exact-match.

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

location = /exact-match {
    root /var/www/html;
    index index.html;

    if ($http_user_agent ~* "Chrome") {
        add_header X-Browser "Chrome";
    }
}

 

В этом случае, если пользовательский агент идентифицируется как Chrome, ответ будет содержать дополнительный заголовок X-Browser.

 

Пример соответствия префикса

Префиксное соответствие — наиболее распространённый тип, который соответствует любому URI, начинающемуся с указанной строки.

location /prefix {
    root /var/www/html;
    index index.html;

    if ($request_method = POST) {
        return 405; # Метод, который не разрешен
    }
}

 

Этот блок location будет обрабатывать любой запрос, начинающийся с /prefix — например, /prefix/page1 или /prefix/page2. Если метод запроса — POST, Nginx возвращает статус 405 Method Not Allowed.

 

Пример соответствия регулярному выражению

Для более сложных сценариев сопоставления полезны регулярные выражения. В Nginx регулярное выражение может содержать подстановочные знаки — символы, которые соответствуют любому символу или группе символов. Наиболее распространённые подстановочные знаки в регулярных выражениях Nginx:

  • .: Соответствует любому отдельному символу.
  • .*: Соответствует любой последовательности символов (включая отсутствие символов).
  • ^: Соответствует началу строки.
  • $: Соответствует концу строки.

 

location ~* \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;

    if ($request_uri ~* "/admin") {
        return 403; # Forbidden
    }

    if ($request_uri !~* "/admin") {
        add_header X-Admin "Not Admin";
    }
}

 

Читать  Как настроить mod_jk на HTTP-сервере Apache

В этом примере:

  • Модификатор ~* указывает на совпадение регулярных выражений без учета регистра.
  • Шаблон \.php$ соответствует любому URI, заканчивающемуся на .php (например, index.phptest.PHP).
  • Если запрошенный URI содержит /admin, Nginx возвращает статус 403 Forbidden.
  • Если запрошенный URI не содержит /admin, добавляется заголовок X-Admin с указанием «Not Admin».

 

Пример соответствия без учета регистра

Вы можете использовать регулярное выражение с модификатором ~* для поиска без учёта регистра.

location ~* \.jpg$ {
    root /var/www/images;

    if ($http_referer !~* "^https?://(www\.)?example\.com") {
        return 403; # Запрещенный
    }
}

 

Это соответствует любому URI, заканчивающемуся на .jpg.JPG.Jpg и т. д., и загружает файлы изображений только в том случае, если реферер находится на example.com. В противном случае возвращается статус 403 Forbidden.

 

Приоритет и порядок

Приоритет и порядок блоков location имеют решающее значение для корректной обработки запросов. Nginx следует этим правилам:

  1. Точное совпадение (=): Они имеют наивысший приоритет.
  2. Регулярные выражения (~ or ~*): оцениваются в том порядке, в котором они определены в файле конфигурации.
  3. Префиксные совпадения без модификатора: они имеют самый низкий приоритет, но среди них самый высокий приоритет имеет самый длинный префикс.

 

Пример

location = /exact {
    # наивысший приоритет
}

location ~* \.jpg$ {
    # более низкий приоритет, чем точное совпадение
}

location / {
    # самый низкий приоритет
}

Блоки расположения вложенности

Nginx позволяет вкладывать блоки location в другие блоки location для более детального управления.

location /nested {
    location /nested/subnested {
        root /var/www/html;
    }
    root /var/www/html;
}

 

В этом примере запросы к /nested/subnested будут обрабатываться внутренним блоком location, а запросы к /nested (но не к /nested/subnested) будут обрабатываться внешним блоком location.

 

Пример реального веб-сервера

Давайте рассмотрим практический пример настройки локального веб-сервера с несколькими блоками location.

server {
    listen 80;
    server_name localhost;

    # Блок location root
    location / {
        root /var/www/html;
        index index.html;
    }

    # Точное соответствие для конкретной страницы
    location = /about {
        root /var/www/html;
        index about.html;
    }

    # Совпадение префикса с конечной точкой API
    location /api {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Соответствие регулярных выражений для PHP-файлов
    location ~ \.php$ {
        root /var/www/html;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    # Соответствие файлам изображений без учета регистра
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        root /var/www/images;
    }

    # Вложенные блоки расположения для административного раздела
    location /admin {
        root /var/www/admin;
        index index.html;

        location /admin/stats {
            proxy_pass http://localhost:8080/stats;
        }
    }
}

 

В этой конфигурации:

  • В корневом каталоге хранятся статические файлы из /var/www/html.
  • Запросы на /about обслуживаются блоком точного соответствия, указывающим на about.html.
  • Префикс /api перенаправляется на серверную службу, работающую на порту 3000.
  • PHP-файлы обрабатываются сервером FastCGI.
  • Файлы изображений передаются с /var/www/images.
  • Вложенные блоки location используются для обработки /admin и /admin/stats с различными настройками.
Читать  Как установить NTP с помощью Chrony в Linux

 

Основной файл конфигурации Nginx содержит основные директивы конфигурации для сервера Nginx. Расположение файла конфигурации Nginx обычно /etc/nginx/nginx.conf.

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

sudo systemctl reload nginx

 

Тестирование и отладка блоков location

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

Проверьте синтаксис конфигурации, прежде чем применять изменения таким образом:

sudo nginx -t

 

Затем перезагрузите NGINX, чтобы применить изменения без удаления активных подключений:

sudo systemctl reload nginx

 

Протестируйте поведение местоположения с помощью curl и отправляйте запросы, чтобы проверить, отвечает ли правильный блок location:

curl -I http://localhost/about
curl -X POST http://localhost/prefix/form
curl -H "User-Agent: Chrome" http://localhost/exact-match

 

Проверьте наличие кодов состояния, заголовков и содержимого.

Просмотр обработки запросов и ошибок в режиме реального времени:

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

 

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

  • Запускал nginx -t? Убедитесь, что синтаксис конфигурации допустим.
  • Перезагрузил NGINX? Не забудьте перезагрузить после внесения изменений.
  • Соответствует ли запрос в точности? Убедитесь, что запрашиваемый URI соответствует ожидаемому блоку (учитывайте конечные косые черты).
  • Правильно ли установлен приоритет блока? Проверьте, не перехватывает ли управление блок с более высоким приоритетом.
  • Существует ли корневой путь? Убедитесь, что корневой путь или псевдоним указывают на действительный каталог/файл.
  • Использовали curl или инструменты браузера? Изучите детали запроса/ответа, чтобы отследить поведение.
  • Вы проверили журналы? Поищите записи в журналах доступа и ошибок, связанные с вашим запросом.
  • Вы пробовали изолировать блок? Временно закомментируйте другие блоки, чтобы определить, какой из них обрабатывает запрос.
Читать  25 вопросов для собеседования с Apache для начинающих и пользователей среднего уровня

 

Ограничение доступа к xувствительным местам

Для обеспечения безопасности разумно ограничить доступ к частным маршрутам, таким как /admin/config, или внутренним инструментам. Директивы allow и deny в NGINX позволяют контролировать доступ на основе IP-адреса.

location /admin {
    allow 192.168.1.100;
    deny all;
    root /var/www/admin;
    index index.html;
}

 

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

 

Понимание зависимости root от псевдонима в блоках Location

В зависимости от того, как настроен ваш блок location, при отправке статических файлов необходимо использовать правильную директиву. Это может быть директива root или псевдоним. Неправильное использование этих директив может привести к тому, что NGINX не сможет правильно найти файлы.

Вот краткое сравнение:

ДирективаПоведениеПример URIПуть к конфигурацииРезультирующий путь к файлу
rootДобавляет URI после совпадения/static/css/style.csslocation /static/ { root /var/www; }/var/www/static/css/style.css
aliasЗаменяет соответствующий префикс URI/static/css/style.csslocation /static/ { alias /var/www/assets/; }/var/www/assets/css/style.css

 

Пример использования псевдонима, при котором запрос к /files/manual.pdf будет обслуживать файл по адресу /data/downloads/manual.pdf:

location /files/ {
    alias /data/downloads/;
}

 

Примечание: при использовании псевдонима всегда добавляйте обратную косую черту (/) в конец пути, если ваш адрес заканчивается на /. Это позволит избежать несоответствия путей.

 

Заключение

Для более эффективного управления обработкой запросов необходимо хорошо понимать директиву location. Это включает в себя понимание различных вариантов сопоставления — точного (=), префиксного (/), на основе регулярных выражений (~~*) — и того, как Nginx расставляет приоритеты. Правильное их использование может существенно повлиять на производительность и поведение вашего сайта.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:



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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

**ссылки nofollow

Это может быть вам интересно


Рекомендуемое
Tuxedo OS - это дистрибутив, созданный немецким производителем Tuxedo Computers, в первую…

Спасибо!

Теперь редакторы в курсе.