2017-01-05 3 views
1

Итак, у меня есть сторонний прокси (возможно, под кальмаром), который будет принимать только соединения с одного из моих IP-адресов, но мне нужно иметь доступ к нему из разных IP-адресов.nginx - пересылать запросы другому прокси

Так что я пытаюсь поместить nginx для пересылки запросов на этот прокси. Я знаю, что Nginx может направить запрос, как это:

location/{ 
    proxy_pass http://$http_host$uri$is_args$args; 
} 

Это будет работать, если мне нужно Nginx пересылать запросы непосредственно на целевой сайт, но мне нужно, чтобы передать его прокси-X первым. Я пробовал это:

upstream myproxy { 
    server X.X.X.X:8080; 
} 

location/{ 
    proxy_pass http://myproxy$uri$is_args$args; // also tried: http://myproxy$http_host$uri$is_args$args 
} 

Но я получаю «(104) Сброс соединения сверстником». Я думаю, потому что Nginx это проксировании так:

GET /index.html HTTP/1.1 
Host: www.targetdomain.com.br 

Но мне нужно, чтобы прокси-сервер, как это:

GET http://www.targetdomain.com.br/index.html HTTP/1.1 

ответ

2

я узнал, что это работает:

http { 
    # resolver 8.8.8.8; # Needed if you use a hostname for the proxy 
    server_name ~(?<subdomain>.+)\.domain\.com$; 

    server { 
    listen 80; 

    location/{ 
     proxy_redirect off; 
     proxy_set_header Host $subdomain; 
     proxy_set_header X-Forwarded-Host $http_host; 
     proxy_pass "http://X.X.X.X:8080$request_uri"; 
    } 
    } 
} 

Вы должны использовать resolver, если X.X.X.X - это имя хоста, а не IP.

Проверьте https://github.com/kawanet/nginx-forward-proxy/blob/master/etc/nginx.conf для получения дополнительных приемов.

EDIT: также проверить nginx server_name wildcard or catch-all и http://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_name

+0

Я понимаю, но в этом случае вам нужно установить «www.targetdomain.com.br» вручную, я хочу, чтобы решить автоматически. Я использую кальмара, чтобы сделать это сейчас. – lucaswxp

+0

Я отредактировал свой ответ, чтобы показать, как я с этим справляюсь (с 'server_name', который захватывает переменную поддомена). – Silex

+0

Если вам нужно установить хост на основе параметров запроса, вы можете делать совпадения с помощью 'if' и' set' и т. Д. (См. Ссылку внизу моего ответа). – Silex