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