Запретить доступ к подсистеме в прокси Nginx в контейнере Docker

Вопрос или проблема

У меня есть несколько веб-приложений в контейнерах Docker, к которым доступ осуществляется через прокси-сервер nginx в контейнере.

Эти приложения находятся по следующим адресам:

Все работает, как и ожидалось, однако мне нужно заблокировать доступ к определенным подкаталогам URL некоторых приложений.

Например, я хотел бы заблокировать доступ к следующему адресу:

https://apps.local/app1/feature1

Согласно документации nginx, я должен иметь возможность загрузить конкретную конфигурацию хоста в папку vhost.d. Поэтому я создал том, указывающий на папку vhost.d.

./vhost.d:/etc/nginx/vhost.d:ro

Внутри этой папки у меня есть файл конфигурации с именем виртуального хоста (apps.local.conf). Содержимое файла выглядит так:

location = /app1/feature1 {
  deny all;
}

Однако это, похоже, ничего не делает. Что я делаю не так?

Ответ или решение

Вам правильно известно, что для ограничения доступа к определённым URL-подкаталогам в Nginx можно использовать конфигурационные файлы, загружаемые в директорию vhost.d. Рассмотрим возможные причины, по которым ваша конфигурация не работает, и как это можно исправить.

1. Проверьте путь к конфигурации

Убедитесь, что ваш файл конфигурации действительно называется apps.local.conf и находится в папке, на которую вы указываете, когда монтируете том в Docker. Убедитесь также, что он доступен в контейнере Nginx с нужными правами.

2. Правильный синтаксис файла конфигурации

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

location /app1/feature1 {
  deny all;
}

В данном случае используется менее строгий синтаксис. Убедитесь, что вы убрали = из директивы location, так как он используется для точного соответствия и может не сработать в вашем случае.

3. Проверка конфигурации Nginx

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

docker-compose restart <название_сервиса_nginx>

Или с помощью:

docker exec <имя_контейнера_nginx> nginx -s reload

4. Логи Nginx

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

5. Порядок обработки директив

Имейте в виду, что порядок обработки директив в конфигурации Nginx имеет значение. Если есть более общий маршрут, который обрабатывает запросы, ваш location может не срабатывать. Убедитесь, что ваш location для /app1/feature1 не перекрывается другими более общими путями.

6. Полная конфигурация

Для наилучшего результата, рекомендуется также проверить основную конфигурацию Nginx в nginx.conf и убедиться, что она правильно настроена для обработки ваших виртуальных хостов и правил доступа.

Пример полной конфигурации

Ваш fichier apps.local.conf может выглядеть примерно так:

server {
    listen 80;
    server_name apps.local;

    location /app1/feature1 {
        deny all;
    }

    location /app1 {
        proxy_pass http://app1_backend;
    }

    location /app2 {
        proxy_pass http://app2_backend;
    }

    location /app3 {
        proxy_pass http://app3_backend;
    }
}

Заключение

Старайтесь тестировать изменения на локальной среде прежде, чем развернуть в продуктив. Если всё сделано верно, доступ к https://apps.local/app1/feature1 должен быть заблокирован. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!

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

Капча загружается...