К сожалению, в точку. Не ожидал, что будет виной всему антивирус Dr.Web (который мало того, что у меня без firewall, так еще и был практически обесточен: 
<a href="http://ftp.dzhon.in/1.png">http://ftp.dzhon.in/1.png</a>). Принципиально исключал версию о сетевом экране на клиентской машине, поскольку внимательно за этим слежу, а тут такая незадача. Спасибо за помощь, уважаемые. После удаления Dr.Web из системы все заработало как надо.<div>
<br><div class="gmail_quote">2012/1/25 Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello!<br>
<div><div class="h5"><br>
On Wed, Jan 25, 2012 at 10:53:33AM +0000, Ruslan Ermilov wrote:<br>
<br>
> On Wed, Jan 25, 2012 at 01:47:04PM +0400, Eugene Mamin wrote:<br>
> > Да, попробовал телнетом постучать прямо на hg serve, получил ту же 500-ую<br>
> > от меркуриала :)<br>
> ><br>
> > В конфигурации задал следующие директивы, чтобы максимально приблизить<br>
> > заголовки:<br>
> > proxy_http_version 1.1;<br>
> > proxy_set_header Host $host;<br>
> ><br>
> > Теперь имеем такие данные (логи tcpdump):<br>
> > <a href="http://ftp.dzhon.in/nginx_" target="_blank">http://ftp.dzhon.in/nginx_</a> -- запрос hg pull через nginx<br>
> > <a href="http://ftp.dzhon.in/hg__" target="_blank">http://ftp.dzhon.in/hg__</a> -- запрос hg pull напрямую к hg serve.<br>
><br>
> Разница такая:<br>
><br>
> : --- hg_     2012-01-25 14:06:36.000000000 +0400<br>
> : +++ nginx_  2012-01-25 14:07:02.000000000 +0400<br>
> : @@ -1,41 +1,27 @@<br>
> :  GET /concorde?cmd=capabilities HTTP/1.1<br>
> :  Accept-Encoding: identity<br>
> : -host: <a href="http://hg.dzhon.in:7777" target="_blank">hg.dzhon.in:7777</a><br>
> : +host: <a href="http://hg.dzhon.in" target="_blank">hg.dzhon.in</a><br>
> :  accept: application/mercurial-0.1<br>
> :  user-agent: mercurial/proto-1.0<br>
><br>
> :  HTTP/1.1 200 Script output follows<br>
> : -Server: BaseHTTP/0.3 Python/2.7.2<br>
> : -Date: Wed, 25 Jan 2012 09:35:20 GMT<br>
> : +Server: nginx/1.1.12<br>
> : +Date: Wed, 25 Jan 2012 09:34:44 GMT<br>
> :  Content-Type: application/mercurial-0.1<br>
> :  Content-Length: 130<br>
> : +Connection: keep-alive<br>
> :  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024<br>
><br>
> :  GET /concorde?cmd=batch HTTP/1.1<br>
> :  Accept-Encoding: identity<br>
> : -x-hgarg-1: cmds=heads+%3Bknown+nodes%3D0b75949a12b936df4c501b0b890211f29662e048<br>
> : -host: <a href="http://hg.dzhon.in:7777" target="_blank">hg.dzhon.in:7777</a><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>
</div></div>Т.е. ответы на запрос capabilities идентичны, а следом за этим<br>
nginx'у приходит запрос без заголовка x-hgarg-1, но с заголовком<br>
"vary: X-HgArg-1".<br>
<br>
Кто-то по дороге от mercurial'а до nginx'а снёс заголовок<br>
"x-hgarg-1", скорее всего какой-то шибко умный антивирус/firewall,<br>
пытающийся фильтровать 80-й порт.<br>
<span class="HOEnZb"><font color="#888888"><br>
Maxim Dounin<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>