Обратный прокси-сервер на основе http-заголовка в Nginx возвращает 502 Bad Gateway

Обратный прокси-сервер на основе http-заголовка в Nginx возвращает 502 Bad Gateway

У меня есть поддомен DDNS sub1.dom1.comсо статическим IP-адресом (вымышленный IP-адрес) 99.88.77.66.55.

У меня есть домен, dom2.comразмещенный вне сайта с записью DNS CNAME, указывающей sub2.dom2.comна sub3.dom2.comтот же IP-адрес (опять же вымышленный), 99.88.77.66.55.

В 99.88.77.66.55, у меня есть LAN, находящаяся за моим брандмауэром. В этой LAN у меня есть три сервера:

  1. Веб-сервер с локальным полным доменным www.local.lanименем192.168.1.3:80
  2. app.local.lanСервер приложений с локальным FDQN192.168.1.4:8069
  3. Файловый сервер с локальным полным доменным fs.local.lanименем192.168.1.5:2430

Для пояснения см. диаграмму ниже. Все три сервера работают как виртуальные серверы в рамках jails на одной и той же системе freeBSD (freeNAS).

Диаграмма сети

Чего я хочу достичь

Согласно приведенной выше схеме, я хочу добавить обратный прокси-сервер для работы в jail на вышеупомянутой системе. Запросы из WAN должны быть направлены на соответствующий сервер на основе имени хоста, указанного в заголовке HTTP.

Соображения

  1. Стандартное портовое экспедирование:В настоящее время я получаю доступ к этим серверам через простую переадресацию портов на маршрутизаторе локальной сети. Обычно это приемлемое решение, однако, когда возникает необходимость в удаленном вмешательстве в работу сети, становится проблемой поддержание прямых связей портов WAN-LAN. Кроме того, для пользователей, которым нужен доступ к этим серверам, не мне, проще не запоминать номера портов.
  2. Применение DD-WRT:Так как мой маршрутизатор работает на прошивке DD-WRT с установленным USB-накопителем на 4 GiB, я рассмотрел возможность установки и запуска обратного прокси-сервера на маршрутизаторе с использованием Pound или чего-то подобного. Я провел обширный поиск в Интернете в поисках способов сделать это. Проблема, с которой я столкнулся, заключается в том, что большинство руководств или учебных пособий устарели и содержат неработающие ссылки на требуемые ресурсы.
  3. Apache/Nginx:Любое из этих двух решений кажется жизнеспособным. Однако, как и решения DD-WRT, которые я исследовал, многие руководства либо предоставляют неработающие ссылки, либо вообще не содержат ссылок на требуемые ресурсы. Другое препятствие, с которым я столкнулся при выборе Apache или Nginx, заключается в том, что большинство руководств и учебных пособий предполагают, что я уже знаю все, что нужно знать об Apache или Nginx. Я начинаю без какого-либо опыта работы с любой из платформ и готов учиться и экспериментировать, чтобы все заработало. Руководства и учебные пособия в основном показывают только разделы serverнеобходимого кода. Кроме того, предполагается, что вы уже знаете требуемые зависимости и как их реализовать.

Шаги, которые я уже предпринял

Nginx: Пример из моего файла nginx.conf. Это только часть. Есть и другие serverразделы для других серверов с измененными соответствующими деталями.

#nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    server_name sub1.dom1.com #I've also tried www.lan.lan, here.
    access_log off;
    error_log off;
    location / {
      proxy_pass http://192.168.1.3:80/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_ready_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    }
  }
}

Однако при попытке подключения возвращается ошибка 502 — Bad Gateway.

Апач: Важно отметить, что я пробовал это с Apache22. Мой последний файл httpd.conf выглядит так:

LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so

<VirtualHost *:80>
  ServerName sub1.dom1.com
  ServerAlias sub1.dom.com
  ProxyPass / http://192.168.1.3:80/
  ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>

<VirtualHost *:80>
  ServerName sub2.dom2.com
  ServerAlias sub2.dom2.com
  ProxyPass / http://192.168.1.4:8069/
  ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>

<VirtualHost *:80>
  ServerName sub3.dom2.com
  ServerAlias sub3.dom2.com
  ProxyPass / http://192.168.1.5:2430/
  ProxyPass / http://192.168.1.5:2430
</VirtualHost

Когда я пытаюсь запустить Apache22, используя:

service apache22 start

Я получаю следующее:

Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration

После долгих исследований я знаю, что это, скорее всего, вызвано тем, что я mod_proxyзагрузил только один из многих требуемых модулей, mod_proxy_htmlмодуль. Причина в том, что после долгих поисков я смог найти только рабочую ссылку для этого конкретного модуля.

Фунт: Я столкнулся с проблемами при попытке установить ipkg на DD-WRT. Это может быть связано с архитектурой atheos моего маршрутизатора. Я также столкнулся со многими неработающими ссылками, как упоминалось ранее.


Итак, закончив с длинными объяснениями, вот чего я жду от сообщества.

Учитывая, что я приблизился к этому с помощью Nginx, как мне правильно настроить свой nginx.confфайл, чтобы он делал то, что я пытаюсь сделать? Что вызывает ошибку 502 и как ее исправить?

решение1

Для решения nginx:

server_nameвсегда должно быть запрошенным именем хоста (в заголовке http).

  • Вы можете разместить *здесь , чтобы сделать контент доступным на любом домене/хосте.

proxy_passне должно заканчиваться на /, за исключением случаев особой необходимости.

Чаще всего я сталкивался с 502 Bad gatewayситуацией, когда nginx не мог подключиться к вышестоящему серверу ( proxy_pass).

  • Вы проверили политику брандмауэра для DMZ->LAN?
  • Вы проверили наличие error.logподсказок?

Связанный контент