2013-03-21 5 views
1

Я пытаюсь динамически установить назначение proxy_pass, где переменной будет cname исходного запроса.nginx variables (cname) в proxy_pass

то, что у меня есть прямо сейчас:

server { 
    listen  8888; 
    server_name (.*).domain.com; 

    location/{ 
     proxy_pass  http://$1.otherdomain.com; 
     proxy_set_header Host $1.otherdomain.com; 

, но, к сожалению, это заканчивается в 502 плохой шлюз. ничего не работает при использовании переменной в proxy_pass и proxy_set_header.

Я также пытался использовать (?<cname>.+) или (?P<cname>.+) в имени сервера и $cname как переменную.

что не так, и почему это заканчивается на 502?

ответ

6

Чтобы использовать регулярное выражение в имени сервера, вы должны предварять имя с тильдой «~»

server_name ~(.*).domain.com; 

[UPDATE] Пробовали и успешно установить значение в $ 1. Но все-таки получить 502 и мой журнал ошибок Nginx показывает

no resolver defined to resolve xyz.otherdomain.com 

хотя я указывал, что имя моего локального хоста в моей/и т.д./хост файл.

Найти article, что объясняет эту проблему хорошо. В основном в этом специальном случае (переменная в доменном имени вверх) вам необходимо использовать "resolver" directive, чтобы указать на DNS-сервер (например, 8.8.8.8 с сервера google dns), который может разрешить это динамическое имя домена.

resolver 8.8.8.8; 

Он работает в моем тесте с общедоступным доменным именем. Если вы владеете доменными именами верхнего уровня, вам необходимо настроить для них локальный DNS-сервер.

+2

Примечание: если вы произвольно указываете доменное имя в директиве proxy_pass, все в порядке. Нет необходимости в преобразователе dns. В этом случае, я думаю, nginx находит эти IP-адреса этих имен, когда он анализирует файл конфигурации. –

+0

Do ** NOT ** использовать общедоступный DNS-сервер, такой как '8.8.8.8'. [Чтобы предотвратить спуфинг DNS, рекомендуется настроить DNS-серверы в правильно защищенной доверенной локальной сети.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

0

Имя сервера для proxy_pass с использованием переменных будет особой ситуацией.

proxy_pass  http://$1.otherdomain.com; 

В этом случае имя сервера выполняется поиск среди описанных server groups, и, если не найден, определяется с помощью распознаватель.

Если вы не любите использовать resolver. Вы можете использовать ниже как файл hosts.

upstream www1.otherdomain.com { server 10.x.x.1; } 
upstream www2.otherdomain.com { server 10.x.x.2; }