We have a C/C++ app with an embedded http server. Our http server is very native, does not support ssl or keep-alive connection. It listen on port 5555 and servers static pages. Before serving the page, it gzip the response. It also supports cache validation with Etags. Depending on the If-None-Match value it sends 304 Not Modifed. It work fine if we redirect our browser to some-ip:5555. Sample request and response header is as follows
Response Headers Cache-Control max-age=3600, must-revalidate Content-Encoding gzip Expires Wed, 15 May 2013 07:18:08 GMT Request Headers Accept */* Accept-Encoding gzip, deflate Accept-Language en-us,en;q=0.5 Cache-Control max-age=0 Connection keep-alive Host 127.0.0.1:5555 If-Modified-Since Tue, 08 May 2012 08:48:53 GMT If-None-Match "1336466933_85925" Referer http://127.0.0.1:5555/mlogin.html User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0.4) Gecko/20120425 Firefox/10.0.4 Response Headers From Cache Cache-Control max-age=3600, must-revalidate Content-Encoding gzip Content-Length 29832 Content-Type application/x-javascript Etag "1336466933_85925" Expires Wed, 15 May 2013 07:18:08 GMT Last-Modified Tue, 08 May 2012 08:48:53 GMT Now when the same setup is tried with nginx reverse proxy, it gives 502 Bad Gateway for all those page which tries to revalidate cache. It works fine for all page whose Cache-Control no-cache. Our nginx configuration is as follows
user nginx; worker_processes 1; error_log /var/log/nginx/error.log debug; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_requests 0; keepalive_timeout 0; server { server_name _; listen 80; location / { proxy_pass http://127.0.0.1:5555; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_max_temp_file_size 0; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } } The response and request header then is
Response Headers Connection close Content-Length 172 Content-Type text/html Date Tue, 15 May 2012 08:46:31 GMT Server nginx/1.2.0 Request Headers Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding gzip, deflate Accept-Language en-us,en;q=0.5 Cache-Control max-age=0 Connection keep-alive Host 127.0.0.1 If-Modified-Since Tue, 08 May 2012 08:48:53 GMT If-None-Match "1336466933_85925" User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0.4) Gecko/20120425 Firefox/10.0.4 In nginx error log we get this error
2012/05/15 14:16:31 [error] 18832#0: *177 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /lib/jquery-1.5.2.min.js?v=1330852144 HTTP/1.1", upstream: "http://127.0.0.1:5555/lib/jquery-1.5.2.min.js?v=1330852144", host: "127.0.0.1" Can anyone suggest what is going wrong? Thanks in advance.