<div>Да, попробовал телнетом постучать прямо на hg serve, получил ту же 500-ую от меркуриала :)</div><div><br></div>В конфигурации задал следующие директивы, чтобы максимально приблизить заголовки:<div><div>proxy_http_version 1.1;</div>
<div>proxy_set_header Host $host;</div><div><br></div><div>Теперь имеем такие данные (логи tcpdump):</div><div><a href="http://ftp.dzhon.in/nginx_">http://ftp.dzhon.in/nginx_</a> -- запрос hg pull через nginx</div><div><a href="http://ftp.dzhon.in/hg__">http://ftp.dzhon.in/hg__</a> -- запрос hg pull напрямую к hg serve.</div>
<div><br></div><div>2012/1/25 Ruslan Ermilov <span dir="ltr"><<a href="mailto:ru@nginx.com">ru@nginx.com</a>></span></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Wed, Jan 25, 2012 at 11:15:04AM +0400, Eugene Mamin wrote:<br>
> Вот лог самого nginx (нас интересует ?cmd=batch):<br>
> <a href="http://ftp.dzhon.in/nginx_error.log" target="_blank">http://ftp.dzhon.in/nginx_error.log</a><br>
> Вот лог tcpdump -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) -<br>
> ((tcp[12]&0xf0)>>2)) != 0)': <a href="http://ftp.dzhon.in/nginx_dump" target="_blank">http://ftp.dzhon.in/nginx_dump</a><br>
<br>
</div>От клиента к nginx:<br>
GET /concorde?cmd=batch HTTP/1.1<br>
Accept-Encoding: identity<br>
host: <a href="http://hg.dzhon.in" target="_blank">hg.dzhon.in</a><br>
vary: X-HgArg-1<br>
accept: application/mercurial-0.1<br>
user-agent: mercurial/proto-1.0<br>
<br>
От nginx к mercurial:<br>
GET /concorde?cmd=batch HTTP/1.0<br>
Host: mercurial_backend<br>
Connection: close<br>
Accept-Encoding: identity<br>
vary: X-HgArg-1<br>
accept: application/mercurial-0.1<br>
user-agent: mercurial/proto-1.0<br>
<br>
Поменялось: значение заголовка Host, версия HTTP и как<br>
следствие соединение стало не keepalive.  Вроде как<br>
ничего страшного.  Я думаю, но не уверен, что проблема<br>
в том, что по протоколу в запросе должно быть поле<br>
"X-HgArg1: cmds=...", но его почему-то нет, клиент,<br>
судя по tcpdump'у, его не посылает, а nginx его выдумать<br>
сам не может.<br>
<br>
Чтобы это подтвердить, можно подсоединиться к mercurial<br>
вручную (telnet/nc), и послать ему первый GET запрос.<br>
По идее вернёт тот же 500, по той же причине.  Если вдруг<br>
не вернёт, а отработает нормально, попытаться найти в<br>
чём проблема, постепенно превращая первый запрос во<br>
второй.<br>
<br>
Если же и на первый запрос Mercurial вернёт 500, значит<br>
от клиента приходит "кривой" запрос, и чтобы попытаться<br>
понять, в чём же дело, нужно проанализировать разницу в<br>
заголовках запросов/ответов, с и без nginx.<br>
<div class="HOEnZb"><div class="h5"><br>
> 2012/1/25 Ruslan Ermilov <<a href="mailto:ru@nginx.com">ru@nginx.com</a>><br>
><br>
> > On Wed, Jan 25, 2012 at 09:24:50AM +0400, Eugene Mamin wrote:<br>
> > > 2012/1/25 Andrey N. Oktyabrski <<a href="mailto:ano@bestmx.ru">ano@bestmx.ru</a>><br>
> > ><br>
> > > > On 25.01.12 07:12, Eugene Mamin wrote:<br>
> > > ><br>
> > > >> Могу лишь утверждать, что без nginx сам mercurial работает.<br>
> > > >><br>
> > > > А он и с nginx работает:<br>
> > > ><br>
> > ><br>
> > > Привел конфигурацию к такому виду:<br>
> > > <a href="http://pastebin.com/TNvKpEgp" target="_blank">http://pastebin.com/TNvKpEgp</a><br>
> > ><br>
> > > Как следствие, получаю все тот же результат:<br>
> > > D:\Projects\CMaked\concorde>hg pull --debug<br>
> > > using <a href="http://hg.dzhon.in/concorde" target="_blank">http://hg.dzhon.in/concorde</a><br>
> > > sending capabilities command<br>
> > > pulling from <a href="http://hg.dzhon.in/concorde" target="_blank">http://hg.dzhon.in/concorde</a><br>
> > > query 1; heads<br>
> > > sending batch command<br>
> > > abort: HTTP Error 500: Internal Server Error<br>
> > ><br>
> > > Важно отметить, что это происходит только если клиентской машиной<br>
> > является<br>
> > > Windows. Но опять же, убираем посредника nginx и все работает.<br>
> ><br>
> > Было бы здорово увидеть заголовки до и после nginx.<br>
> > Тогда сразу бы стало понятно, в чём разница.<br>
> > Можно это сделать через tcpdump или wireshark на<br>
> > стороне Linux, или же средствами самого nginx.<br>
> ><br>
> > Если отлаживать средствами nginx, то отладочный лог<br>
> > лучше будет включить только для соединений с проблемным<br>
> > Windows-хостом.  Как это сделать, написано тут:<br>
> > <a href="http://nginx.org/ru/docs/debugging_log.html" target="_blank">http://nginx.org/ru/docs/debugging_log.html</a><br>
> ><br>
> > _______________________________________________<br>
> > nginx-ru mailing list<br>
> > <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> > <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
> ><br>
<br>
> _______________________________________________<br>
> nginx-ru mailing list<br>
> <a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
> <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Ruslan Ermilov<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></div></div></blockquote></div><br></div>