Рубрики
Uncategorized

Nginx как обратный прокси

NGINX — это универсальный инструмент: веб-сервер, балансировщик нагрузки, обратный прокси. В этой статье я покажу, как нам … Теги с DevOps, Nginx.

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:

  • резолюст : Сервер, который обеспечивает разрешение DNS
  • Upstream : Определяет одну или группу серверов, к которым будет перенаправлен трафик. Каждый Сервер можно определить как 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.

Сноски

  1. И еще одна причина в том, что Traefik не был удлиненным в журналах доступа и ошибок, я пытался его работать Но система не помогла мне. Кроме того, официальная документация Traefik, похоже, написана для очень опытных администраторов, ему не хватает контекста и устранения неполадок. ↩

  2. Если вы не следили за полной серией: Консул Это программное обеспечение для раскрытия сервиса и обнаружение, которое предоставляет интерфейс DNS, чтобы найти динамический IP и порт других услуг. Я использую это для регистрации сервисов, таких как PROMETHEUS, который работает как контейнеры докера. ↩

Оригинал: «https://dev.to/admantium/nginx-as-a-reverse-proxy-13h7»