Re: Fwd: Обработка заголовков протокола Mercurial.

Ruslan Ermilov ru на nginx.com
Ср Янв 25 08:44:19 UTC 2012


On Wed, Jan 25, 2012 at 11:15:04AM +0400, Eugene Mamin wrote:
> Вот лог самого nginx (нас интересует ?cmd=batch):
> http://ftp.dzhon.in/nginx_error.log
> Вот лог tcpdump -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) -
> ((tcp[12]&0xf0)>>2)) != 0)': http://ftp.dzhon.in/nginx_dump

От клиента к nginx:
GET /concorde?cmd=batch HTTP/1.1
Accept-Encoding: identity
host: hg.dzhon.in
vary: X-HgArg-1
accept: application/mercurial-0.1
user-agent: mercurial/proto-1.0

От nginx к mercurial:
GET /concorde?cmd=batch HTTP/1.0
Host: mercurial_backend
Connection: close
Accept-Encoding: identity
vary: X-HgArg-1
accept: application/mercurial-0.1
user-agent: mercurial/proto-1.0

Поменялось: значение заголовка Host, версия HTTP и как
следствие соединение стало не keepalive.  Вроде как
ничего страшного.  Я думаю, но не уверен, что проблема
в том, что по протоколу в запросе должно быть поле
"X-HgArg1: cmds=...", но его почему-то нет, клиент,
судя по tcpdump'у, его не посылает, а nginx его выдумать
сам не может.

Чтобы это подтвердить, можно подсоединиться к mercurial
вручную (telnet/nc), и послать ему первый GET запрос.
По идее вернёт тот же 500, по той же причине.  Если вдруг
не вернёт, а отработает нормально, попытаться найти в
чём проблема, постепенно превращая первый запрос во
второй.

Если же и на первый запрос Mercurial вернёт 500, значит
от клиента приходит "кривой" запрос, и чтобы попытаться
понять, в чём же дело, нужно проанализировать разницу в
заголовках запросов/ответов, с и без nginx.

> 2012/1/25 Ruslan Ermilov <ru на nginx.com>
> 
> > On Wed, Jan 25, 2012 at 09:24:50AM +0400, Eugene Mamin wrote:
> > > 2012/1/25 Andrey N. Oktyabrski <ano на bestmx.ru>
> > >
> > > > On 25.01.12 07:12, Eugene Mamin wrote:
> > > >
> > > >> Могу лишь утверждать, что без nginx сам mercurial работает.
> > > >>
> > > > А он и с nginx работает:
> > > >
> > >
> > > Привел конфигурацию к такому виду:
> > > http://pastebin.com/TNvKpEgp
> > >
> > > Как следствие, получаю все тот же результат:
> > > D:\Projects\CMaked\concorde>hg pull --debug
> > > using http://hg.dzhon.in/concorde
> > > sending capabilities command
> > > pulling from http://hg.dzhon.in/concorde
> > > query 1; heads
> > > sending batch command
> > > abort: HTTP Error 500: Internal Server Error
> > >
> > > Важно отметить, что это происходит только если клиентской машиной
> > является
> > > Windows. Но опять же, убираем посредника nginx и все работает.
> >
> > Было бы здорово увидеть заголовки до и после nginx.
> > Тогда сразу бы стало понятно, в чём разница.
> > Можно это сделать через tcpdump или wireshark на
> > стороне Linux, или же средствами самого nginx.
> >
> > Если отлаживать средствами nginx, то отладочный лог
> > лучше будет включить только для соединений с проблемным
> > Windows-хостом.  Как это сделать, написано тут:
> > http://nginx.org/ru/docs/debugging_log.html
> >
> > _______________________________________________
> > nginx-ru mailing list
> > nginx-ru на nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-ru
> >

> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru


-- 
Ruslan Ermilov



Подробная информация о списке рассылки nginx-ru