
У меня есть поддомен 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 у меня есть три сервера:
- Веб-сервер с локальным полным доменным
www.local.lan
именем192.168.1.3:80
app.local.lan
Сервер приложений с локальным FDQN192.168.1.4:8069
- Файловый сервер с локальным полным доменным
fs.local.lan
именем192.168.1.5:2430
Для пояснения см. диаграмму ниже. Все три сервера работают как виртуальные серверы в рамках jails на одной и той же системе freeBSD (freeNAS).
Чего я хочу достичь
Согласно приведенной выше схеме, я хочу добавить обратный прокси-сервер для работы в jail на вышеупомянутой системе. Запросы из WAN должны быть направлены на соответствующий сервер на основе имени хоста, указанного в заголовке HTTP.
Соображения
- Стандартное портовое экспедирование:В настоящее время я получаю доступ к этим серверам через простую переадресацию портов на маршрутизаторе локальной сети. Обычно это приемлемое решение, однако, когда возникает необходимость в удаленном вмешательстве в работу сети, становится проблемой поддержание прямых связей портов WAN-LAN. Кроме того, для пользователей, которым нужен доступ к этим серверам, не мне, проще не запоминать номера портов.
- Применение DD-WRT:Так как мой маршрутизатор работает на прошивке DD-WRT с установленным USB-накопителем на 4 GiB, я рассмотрел возможность установки и запуска обратного прокси-сервера на маршрутизаторе с использованием Pound или чего-то подобного. Я провел обширный поиск в Интернете в поисках способов сделать это. Проблема, с которой я столкнулся, заключается в том, что большинство руководств или учебных пособий устарели и содержат неработающие ссылки на требуемые ресурсы.
- 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
подсказок?