Re: разбор аргументов в динамическом запросе и перенаправление

Valery Kholodkov valery+nginxru на grid.net.ru
Пт Мар 26 17:51:26 MSK 2010


http {
    map $arg_l1 $backend {
        3        mainsite.ru;
        default  mymt;
    }

    upstream mymt {
        server 172.29.10.88:8080;
        server 172.29.10.10:8080;
    }

    server {
        listen       6446;
        server_name  blah.tld;

        location / {
            #
            # После имени переменной нет /
            #
            proxy_pass http://$backend;
        }
    }
}

----- alk <nginx-forum at nginx.us> wrote:
> Добрый день!
> 
> Я только начал осваивать nginx, и многие вещи мне еще совсем непонятны, поскольку я далек от языков программирования и с трудом понимаю regexp'ы. Но поставленная задача, мне кажется, и не требует глубоких знаний регулярных выражений. Очень надеюсь получить от вас помощь.
> Есть сайт, на котором выполняются только динамические запросы при помощи специально написанного cgi-скрипта. Сайт сильно перегружен в дневное время, хочется разгрузить его, отправляя определенные, наиболее частые или наиболее "тяжелые" по времени выполнения запросы на другой сайт, где при помощи upstream организовано выполнение на группе серверов.
> Фактически все сводится к проверке наличия тех или иных аргументов и перенаправления на тот или иной location.
> Я нашел несколько родственных тем на форуме, в частности:
> http://forum.nginx.org/read.php?21,58180
> http://forum.nginx.org/read.php?2,54954
> 
> Но сделать так, как там приблизительно указано,  у меня не получается.
> У меня запросы на сайт могут быть, например, такими:
> http://alk.ru:6446/c/xyz.exe?a=1
> http://alk.ru:6446/c/xyz.exe?l1=3&l2=2&CL=1&a=0
> http://alk.ru:6446/c/xyz.exe?t=1473291_2_3
> и т.д.
> Я пробую, для проверки, сделать так, чтобы при наличии аргумента l1=3, запрос обслуживался на главном сайте, а если это не так, то уходил на upstream.  Как я понимаю, простой проверкой if это не сработает, нужно обязательно делать rewrite, а потом уже разбирать по location'ам.
> Вот как выглядит мой config.
> 
> #user  nobody;
> worker_processes  1;
> #pid        logs/nginx.pid;
> events {
>     worker_connections  4096;
> }
> http {
>     include       mime.types;
>     default_type  application/octet-stream;
>     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
>                       '$status $body_bytes_sent "$http_referer" '
>                       '"$http_user_agent" "$http_x_forwarded_for"';
>     #access_log  logs/access.log  main;
>     sendfile        on;
>     #tcp_nopush     on;
>     #keepalive_timeout  0;
>     keepalive_timeout  65;
>     gzip  on;
> 	
> 	upstream mymt {
>     server 172.29.10.88:8080;
>     server 172.29.10.10:8080;
> 	}
> 
>     server {
>         listen       6446;
>         server_name  alk.ru;
> 	location / {
> 	set $p "direct";
> 	if ($arg_l1 = '3') {set $p "test";
> 	rewrite ... $p last; #вот тут я не понимаю, как и что должно быть написано, мне не нужно ничего заменять в строке запроса, я просто хочу уйти на location /test
> 	}
> 	}
> 	location = /test {
>              	proxy_pass http://mainsite.ru/;
> 	}
> 	location /direct {
> 		proxy_pass http://mymt/;
> 	}
>     }
> }
> 
> Как видно выше, я торможу в понимании того, как должно быть правильно сделано перенаправление. В вышеуказанных темах делалось по-разному. В англоязычной человек писал как-то так (я интерпретирую под свои значения)
>       rewrite ^(.*)$ /$p$1
> 
> В руссскоязычной вообще все сделали "в лоб":
> 
> location = / {
> if ($arg_l1 = '3') {rewrite ^ /test last;}
> proxy_pass http://mymt/;
> }
> location = /test {
> proxy_pass http://mainsite.ru/;
> }
> То есть, если имеется такой аргумент то отправить на location /test, а если нет, обслужить на mymt.
> 
> Очень прошу помочь разобраться с разбором по условию. Подробности приветствуются. Чтение "Директивы модуля ngx_http_rewrite_module" мне, к сожалению, не помогло.
> 
> Posted at Nginx Forum: http://forum.nginx.org/read.php?21,68037,68037#msg-68037
> 
> 
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru

-- 
Regards,
Valery Kholodkov


Подробная информация о списке рассылки nginx-ru