выбор upstream при помощи map (remote_addr, hostname)

Igor Sysoev is at rambler-co.ru
Tue Nov 17 16:59:01 MSK 2009


On Tue, Nov 17, 2009 at 03:38:32PM +0300, Костенко Евгений wrote:

> Всем доброго времени суток!
> 
> Для некоторых из vhosts необходимо выбирать на какой upstream ходить в
> зависимости от $remote_addr.
> 
> # uname -a
> FreeBSD server3.nitgroup.org 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24
> 19:59:52 UTC 2008     root at logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
> i386
> 
> # nginx -V
> nginx version: nginx/0.7.62
> configure arguments: --prefix=/usr/local/etc/nginx --with-cc-opt='-I
> /usr/local/include' --with-ld-opt='-R /usr/local/lib -L /usr/local/lib'
> --conf-path=/usr/local/etc/nginx/nginx.conf
> --sbin-path=/usr/local/sbin/nginx --pid-path=/var/run/nginx.pid
> --error-log-path=/var/log/nginx-error.log --user=www --group=www
> --with-google_perftools_module
> --http-client-body-temp-path=/var/tmp/nginx/client_body_temp
> --http-proxy-temp-path=/var/tmp/nginx/proxy_temp
> --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
> --http-log-path=/var/log/nginx-access.log --with-http_gzip_static_module
> --with-http_realip_module --with-http_ssl_module
> --with-http_stub_status_module --with-pcre
> 
> Собственно вопрос - баловство с map & $remote_addr позволит юзать proxy_pass
> с указанием ИМЕНИ,
> декларированного upstream?

Да.

> Или только address:port? На примере
> 
> map $remote_addr $upstream_name {
>     default        local;
>     x.x.x.x        phpbackends;
>     y.y.y.y        local;
> }
> 
> и далее в конфиге
> 
> location / {
>     proxy_pass         http://$upstream_name;
>     <SKIPPED>
> }
> 
> Эксперимент на практике приводит к перманентной выдаче 503 со стороны nginx.
> Поиски в google привели к ruby-forum.com и предложенной Игорем реализации.
> 
> http://www.ruby-forum.com/topic/176958
> 
>     map $remote_addr  $back1 {
> 
>         default       10.0.0.1:80;
>         192.168.1.1   10.0.0.2:80;
>         192.168.1.5   10.0.0.2:80;
>     }
> 
>     server {
>         listen   80;
>         server_name   bar.foo.com;
> 
>         location  / {
>             proxy_pass  http://$back1$request_uri; <http://$back1$request_uri/;>
> 
>         }
>     }
> 
> Но тут явное указание address:port, а в моем сюжете требуется указать named
> upstream
> с группой адресов внутри.
> 
> Есть идеи как прикрутить задуманное, или сие изврат и работать не будет?

    map $remote_addr  $back1 {
        default       local;
        192.168.1.1   phpbackends;
        192.168.1.5   local;
    }

    upstream  phpbackends {
        server  ...;
        server  ...;
    }

    upstream  local {
        server  ...;
        server  ...;
    }

     server {
         listen   80;
         server_name   bar.foo.com;
 
         location  / {
              proxy_pass  http://$back1$request_uri;
         }
     }

В 0.8.26 можно так:

         location  / {
             proxy_pass  http://$back1;


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list