NGINX — это универсальный инструмент: веб-сервер, балансировщик нагрузки, обратный прокси. В этой статье я показываю, как использовать Nginx в качестве центрального обратного прокси в вашем облаке, который работает с консулом и локальными серверами DNS для предоставления известных доменных имен приложений, работающих в вашем облаке.
Вы знаете, иногда инструмент отлично, но вы хотите иметь больше контроля, и вы хотите действительно понять проблемы, которые решают инструмент. Это моя мотивация для … Замена краевого маршрутизатора Traefik с Nginx 1 Отказ
Nginx — это прежде всего доказанный, ресурсный эффективный, веб-сервер с открытым исходным кодом. Это также так, как Март 2020 отчет , номер один веб-сервер с 37% рыночной долей. NGINX — это веб-сервер, который мы используем на работе, чтобы загрузить услуги баланса, предоставить TLS и в качестве входного сервера в наших кластере Kubernetes.
Все веские причины использовать Nginx в моей инфраструктуре в домашнем проекте. Nginx будет выполнять несколько ролей. Прежде всего, это будет краевой маршрутизатор, подключение внешних сетей с услугами, которые работают в моем облаке. Во-вторых, он предоставит шифрование TLS для клиента для обслуживания и для обслуживания общения.
В этой статье я покажу, как начать и настроить Nginx для работы в качестве обратного прокси-сервера.
Эта статья изначально появилась в мой блог .
Пользовательские Nginx Docker Image
Пользовательское изображение Docker будет основано на официальном изображении Nginx. Я добавлю два тома: один для предоставления файлов конфигурации и один для обеспечения статического контента. Вот докерфайл:
FROM nginx:1.17.9-alpine VOLUME [ "/etc/nginx/conf.d" ] VOLUME [ "/data/www" ]
Мы строим контейнер докера.
>> docker build . -t inginx Sending build context to Docker daemon 2.048kB Step 1/3 : FROM nginx:1.17.9-alpine ---> 377c0837328f Step 2/3 : VOLUME [ "/etc/nginx/conf.d" ] ---> Using cache ---> b1fca48d47f8 Step 3/3 : VOLUME [ "/data/www" ] ---> Using cache ---> 26e85fbde6b0 Successfully built 26e85fbde6b0 Successfully tagged inginx:latest
Теперь нам нужно предоставить базовый файл конфигурации /etc/nginx/Conf.d/serve_static.conf
Отказ Файл создаст процесс Nginx, который слушает на порту 80
И это будет служить маршруту /статик
показывая список каталогов /data/www
.
server { listen 80; location /static { root /data/www/; autoindex on; } }
Затем предоставьте некоторые файлы для /data/www/
и запустить контейнер.
docker run -p 80:80 \ -v $PWD/nginx.conf/:/etc/nginx.conf \ -v $PWD/data:/data/www \ --name inginx inginx:latest
Введите http://localhost: 80/статический
В вашем браузере, и вы увидите что-то вроде этого:
Хорошо. Теперь давайте разработаем этот базовый конфиг на обратный прокси.
Конфигурация обратного прокси-сервера NGINX
В двух словах обратный прокси — это сервер, который получает входящие запросы и пересылает их на другой сервер. В настройке производства вы также настроили функции, такие как запросы на балансировку нагрузки между различными серверами, применяя модификации URI запроса и изменение заголовков. Пример в нашем случае будет принимать запросы на хост grafana.infra
и переслать их к тому же названному сервису, зарегистрированную в консул 2 Отказ
Давайте построим файл конфигурации Gateway.conf
мало по малу.
Разрешение DNS для услуг
Во-первых, нам нужно понять следующие директивы конфигурации Nginx:
резолюст
: Сервер, который обеспечивает разрешение DNSUpstream
: Определяет одну или группу серверов, к которым будет перенаправлен трафик. КаждыйСервер
можно определить как IP-адрес или с доменным именем.
Определение вышеупомянутого сервера для Grafana это:
http { resolver 192.168.2.201 valid=10s; upstream grafana { server grafana.service.consul:9090; } }
Как вы видите, я использую локальный DNS Resolver для разрешения доменного имени grafana.service.consul
— За кулисами консул предоставит реальную IP для этой услуги.
Вперед входящие запросы
Теперь нам нужно определить, как принять и обрабатывать запросы. Соответствующие директивы Nginx являются:
Сервер
: Определяет обработчик запросаServer_Name
: Эта директива определяет, для какого доменного имени является обработчик запроса, вы можете использовать несколько серверов или подстановочных знаков в доменном имениСлушать
: Порты, на которых nginx слушаетРасположение
: Каждый блок местоположения определяет, что делать, когда URL соответствует определенному маршрутуProxy_Pass
: Сервер, к которому будут направлены входящие запросы
Мы хотим запросы от grafana.infra
быть переданным нашим выше по течению Графана
сервер. Конфигурация является следующим фрагментом:
server { server_name grafana.infra; listen 80; location / { proxy_pass http://grafana; } }
Эта конфигурация работает … не полностью. По некоторым причинам ресурсы JavaScript не могут быть правильно загружены. Когда я запускаю контейнер Docker, а затем открыть консоль браузера, я вижу это:
Это почему? Grafana Server не знает, что прокси был вовлечен. Нам нужно добавить дополнительные заголовки HTTP для пересылки запросов Nginx в Grafana. Эти заголовки:
proxy_redirect off; proxy_set_header Host $http_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;
Их смысл:
Proxy_redirect
— Не откажитесь от трафика обратно на приемХозяин
— Держите одно и то же имя хоста из оригинального запросаX-Real-IP
: Держите оригинальные запросы IP-адресX-переадресный - для
: Список IP-адресов, рассказывающих услугу Как этот запрос был направленX-Foreded-Proto
: Держите схему запросов
Окончательный файл конфигурации
Давайте поставим все это вместе. Последний файл конфигурации шлюз.conf.
это:
http { resolver 127.0.0.1 valid=10s; upstream grafana { server grafana.service.consul:9090; } } server { server_name grafana.infra; listen 80; proxy_redirect off; proxy_set_header Host $http_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; location / { proxy_pass http://grafana; } }
Запуск реверсного прокси NGINX
Теперь мы можем запустить контейнер Docker и получить доступ к нему в вашем браузере.
docker run --network host \ -v $PWD/nginx.conf/:/etc/nginx.conf \ -v $PWD/gateway.conf/:/etc/gateway.conf --name inginx inginx:latest
Приборная панель Grafana правильно оказана.
Вывод
Эта статья показала, как настроить параметр «Обратный прокси NGINX» для доступа к услугам, зарегистрированным в консул. Конфигурация состоит из двух блоков. Первый блок использует локальное разрешение DNS, чтобы получить реальные IP-адреса для услуг, зарегистрированных с консулом. Второй блок обеспечивает важный заголовок HTTP при пересылке входящего запроса на службу консула. С этим вы можете определить удобные доменные имена для доступа к всем услугам консула.
В следующей статье я покажу, как добавить шифрование TLS на Nginx.
Сноски
И еще одна причина в том, что Traefik не был удлиненным в журналах доступа и ошибок, я пытался его работать Но система не помогла мне. Кроме того, официальная документация Traefik, похоже, написана для очень опытных администраторов, ему не хватает контекста и устранения неполадок. ↩
Если вы не следили за полной серией: Консул Это программное обеспечение для раскрытия сервиса и обнаружение, которое предоставляет интерфейс DNS, чтобы найти динамический IP и порт других услуг. Я использую это для регистрации сервисов, таких как PROMETHEUS, который работает как контейнеры докера. ↩
Оригинал: «https://dev.to/admantium/nginx-as-a-reverse-proxy-13h7»