HTTP HEAD timeout

I’m using nginx 1.7.7 as a reverse proxy in front of a Apache CouchDB.
Access via browser to CouchDB data works like a charm. However I have
trouble with replication (which runs via HTTPs). This is what I found
out:

CouchDB would issue a HTTP HEAD first and then perform GET/POST as per
its
algorythm. However the HEAD request times out. I then tried to replicate
that behavior using CURL. This is what I found:

curl -v --head http://myserver/couch

  • works as expected

curl -v -X HEAD http://myserver/couch

  • times out. Now I suspect that CouchDB uses a call similar to the later
    and
    thus runs into the timeout.

I verified: the timeout also happens when I do a -X HEAD to a base
address
(one that is not redirected to CouchDB), so I need to change something
(can
I?) on the nginx side.

What are my options?

Posted at Nginx Forum:

not sure about your original problem but curl -X HEAD isn’t a proper
http
request:

This option only changes the actual word used in the HTTP request, it 
does
not alter the way curl behaves. So for example if you want to make a 
proper
HEAD request, using -X HEAD will not suffice. You need to use the -I, 
--head
<http://curl.haxx.se/docs/manpage.html#-I> option.

Hi Edho,

I know -X HEAD is a hack, but it seems that is the way CouchDB might
operate
(haven’t got a reply back from them). Worked before using an Apache HTTP
reverse-proxy, but I like nginx much better.

So what options do I have to make nginx behave the same for -X HEAD as
it
does for --head?

Posted at Nginx Forum:

This workaround seems to do the trick for the time being:

  if ($request_method = HEAD) {
      add_header Content-Length 0;
      add_header Content-Type text/plain;
      add_header Vary Accept-Encoding;
      return 200;
  }

It might interfere with other HEAD requests, so I consider that as
stopgap
measure

Posted at Nginx Forum: