Как в nginx все POST запросы направить на отдельный upstream?

Labutin

Новичок
Как в nginx все POST запросы направить на отдельный upstream?

Речь пойдет об nginx version: nginx/0.5.26
Задача состоит в том, чтобы все POST запросы отправить на отдельный upstream в nginx. Сначала поясню зачем это нужно.
Есть очень популярный ресурс. Наботает по схеме nginx + php_fastcgi
Т.е. на порту 8888 запущено 10 php_fastcgi процессов:
#!/usr/local/bin/bash

export PHP_FCGI_CHILDREN=10
/opt/php/bin/php-cgi -c /opt/php/bin/php.ini -b 127.0.0.1:8888
В сайте есть два блока. Первый - это контентная часть (там исключительно GET-запросы). Второй блок - это обработка данных пользователей (данные приходят по POST-запросу). Вот вторая часть иногда начинает подтормаживать по независящим от сайта причинам (там идет взаимодействие со сторонним ресурсом). При подтормаживании второй части случается, что в один момент одновременно выполяется 10 запросов и nginx начинает выдавать страницу с сообщением, что сайт временно недоступен, а в логах пишет следующее:
2008/04/29 13:40:16 [error] 926#0: *3578802 upstream timed out (60: Operation timed out) while connecting to upstream, client: 87.244.x.x, server: www.company.ru, URL: "/url/", upstream: "fastcgi://127.0.0.1:8888", host: "www.company.ru", referrer: "http://www.company2.ru/"
То, что ускорить выполнение POST запросов нельзя - это данность :( Можно увеличивать количество дочерних процессов - но тогда в обычное время большинство из них будут попусту простаивать и тратить память. Моя мечта, чтобы кол-во дочерних fastcgi процессов само динамических увеличивалось. Это запланировано в php-fpm, но, как я понимаю, пока не реализовано.
В общем идея, запустить еще пачку fasfcgi процессов на отдельном порту и все POST запросы выполнять через них.
#!/usr/local/bin/bash

export PHP_FCGI_CHILDREN=10
/opt/php/bin/php-cgi -c /opt/php/bin/php.ini -b 127.0.0.1:8888
/opt/php/bin/php-cgi -c /opt/php/bin/php.ini -b 127.0.0.1:9999
Я пытался это настроить в nginx - но ничего не получается :( Вот, что я пробовал (куски конфига):
http {
upstream backend {
server 127.0.0.1:8888;
}

upstream backendpost {
server 127.0.0.1:9999;
}
server {
location /sendpost/
{
internal;
root /home/www/htdocs;
fastcgi_pass backendpost;
.....
}
location / {
root /home/www/htdocs;
if ($request_method = "POST") {
rewrite ^/$ /sendpost/ last;
}
}
}
}
Форма с POST имеет вид:
<form action="/" method="POST">...</form>
Но POST запросы все рано не идут в отдельный upstraem :( Как же их туда завернуть?
Вроде все что хотел выложил.
Для тех, кто уже забыл nginx version: nginx/0.5.26 :)
 

MiksIr

miksir@home:~$
Использую такую конструкцию, проблем нет. Возможно, проблема в чем-то другом в конфиге?
Хотя правильнее, конечно, зарулить POST на выделенный location.
 

Labutin

Новичок
MiksIr
На всякий случай приведу точный кусок из конфига без обрезаний:
location / {
root /home/www/htdocs;
set $concat "$request_method?$args";
if ($concat = "GET?") {
rewrite ^/$ http://$host/start/ redirect;
}
if ($request_method = "POST") {
rewrite ^/$ /sendpost/ last;
}
rewrite ^/comm/(.*)$ /cms/$1 break;
if (!-f $request_filename) {
rewrite /(.*\w+)$ http://$host/$1/ redirect;
}
index /index.phtml;
}
Тут видны какие-нибудь грабли?
 

MiksIr

miksir@home:~$
Гм, ничего страшного (если не считать онным if-ы) не вижу. Могу лишь посоветовать дебажить - там обычно очень хорошо видно чего реврайтица и куда уходит.
 

Labutin

Новичок
MiksIr
Ясно... Пойду тогда курить доки по дебагу nginx'а. Если вдруг будет время и желание, то может быть напишите, как это лучше делать?
 

MiksIr

miksir@home:~$
собираешь nginx с --with-debug
в блоке events конфига пишешь
debug_connection свой_ip;
Ну и смотришь error-log - на запрос с этого IP будет полный дебаг
 

Labutin

Новичок
MiksIr
Пордскажите пожалуйста, где вы выяснили про это? Я вот погуглил по сайту Сысоева: http://www.google.ru/search?sourceid=navclient&hl=ru&ie=UTF-8&rls=GGLJ,GGLJ:2008-07,GGLJ:ru&q=debug%5fconnection+site:sysoev%2eru там такого нет :( Где правильней смотреть доки по nginx?
 

MiksIr

miksir@home:~$
О, к сожалению этого в документации нет, но об этом несколько раз говорилось в рассылке - отложилось в голове и конфиге ;)

-~{}~ 30.04.08 00:29:

Можно еще поползать тут http://wiki.codemongers.com
 
Сверху