Я только начал осваивать 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.
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" мне, к сожалению, не помогло.