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