Passenger with nginx not caching properly (cross post from passenger google group)

I’ve got latest passenger running with nginx with conf:

pid /opt/nginx/logs/;

Run as the nginx user

user root;
worker_processes 2;

error_log /opt/nginx/logs/error.log notice;

events {
worker_connections 1024;
use epoll;

http {
server_names_hash_bucket_size 64;

More Linux performance awesomeness

tcp_nopush on;
tcp_nodelay off;

Where to store the body of large client requests on disk

NGINX will stream this to disk before posting it to your Mongrels,

preventing slow clients tying up your app.

client_body_temp_path /var/spool/nginx-client-body 1 2;

Max size of a request from a client (usually a POST). This will


the size of file uploads to your app

client_body_buffer_size 8k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 4 8k;


client_body_timeout 5;
client_header_timeout 5;
keepalive_timeout 5 5;
send_timeout 5;

General Options

ignore_invalid_headers on;
limit_zone carboncal $binary_remote_addr 1m;
recursive_error_pages on;
sendfile on;
server_name_in_redirect off;
server_tokens off;

passenger loading stuff

passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.2-p136/ruby;

include /opt/nginx/conf/mime.types;
default_type application/octet-stream;


gzip on;
gzip_buffers 16 8k;
#compression level between 1 and 9
gzip_comp_level 9;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/plain text/html text/css image/x-icon image/bmp
application/x-javascript text/xml application/xml application/xml+rss
text/javascript ;
gzip_vary on;
gzip_proxied any;

Some version of IE 6 don’t handle compression well on some

mime-types, so just disable them
gzip_disable “MSIE [1-6].(?!.*SV1)”;

Send along useful info to the mongrels

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_max_temp_file_size 0;

Log Format

log_format main '$remote_addr $host $remote_user [$time_local]
“$request” ’
‘$status $body_bytes_sent “$http_referer”
“$http_user_agent” “$gzip_ratio”’;

access_log /opt/nginx/logs/access.log main;

virtual hosting

server {
access_log /opt/nginx/logs/test_server.access.log main buffer=32k;
error_log /opt/nginx/logs/test_server.error.log info;
expires 6h;
listen 80 default rcvbuf=64k backlog=128;
root /opt/apps/website/public;
server_name website;
passenger_enabled on;

No matter what action I do, nginx seems to only render the cached page.
I’ve to refresh the page to see new changes, i.e. when I click signout,
I am still logged, but if I refresh the page its logs me out. I’m
guessing the problem has to do with rewrites. I’ve tried the below and
various others, but still nothing.

if (-f $document_root/cache/$uri/index.html) {
  rewrite (.*) /cache/$1/index.html break;

# pages like /about, cached with .html but accessed without
if (-f $document_root/cache/$uri.html) {
  rewrite (.*) /cache/$1.html break;

# pages like /api/v1/something.xml, cached as xml
if (-f $document_root/cache/$uri) {
  rewrite (.*) /cache/$1 break;

Turns out its the damn expires 6h line that’s causing the trouble.