Welcome! Log In Create A New Profile

Advanced

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

alk
March 26, 2010 06:47AM
Добрый день!

Я только начал осваивать nginx, и многие вещи мне еще совсем непонятны, поскольку я далек от языков программирования и с трудом понимаю regexp'ы. Но поставленная задача, мне кажется, и не требует глубоких знаний регулярных выражений. Очень надеюсь получить от вас помощь.
Есть сайт, на котором выполняются только динамические запросы при помощи специально написанного cgi-скрипта. Сайт сильно перегружен в дневное время, хочется разгрузить его, отправляя [b]определенные[/b], наиболее частые или наиболее "тяжелые" по времени выполнения запросы на другой сайт, где при помощи 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" мне, к сожалению, не помогло.
Subject Author Posted

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

alk March 26, 2010 06:47AM

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

mente March 26, 2010 10:50AM

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

Valery Kholodkov March 26, 2010 11:30AM

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

alk March 29, 2010 07:36AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 248
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready