разбор аргументов в динамическом запросе и перенаправление
alk
nginx-forum на nginx.us
Пт Мар 26 17:40:33 MSK 2010
Добрый день!
Я только начал осваивать 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