Load balancing and caching combination problem

I just installed nginx 0.8.11 in order to use the $upstream_cache_status
variable.

I can see now in the logs that my URLs (ics feed URLs) are cached and
retrieved from the cache (MISS, HIT, EXPIRED) based on my caching
parameters.

But, it only works when
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

are used and left uncommented. I have read in the forums that this
shouldn’t be use in production. So what should I do next to be able to
comment these parameters and get the result I’m expected.

I tried to set the Expires header by using set_proxy_header, but no
headers are added to my file. Here is my configuration file and the
headers of one the ICS file

nginx.conf

user www-data;
worker_processes 4;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 4096;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format fbcal '$remote_addr - $remote_user [$time_local]  '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent"'
                 '"$upstream_cache_status"';

access_log  /var/log/nginx/access.log fbcal;

sendfile        on;

keepalive_timeout  30;
tcp_nodelay        on;

include /etc/nginx/app-servers.include;

proxy_cache_path /var/www/fbcaldotcom/cache levels=1:2 

keys_zone=one:10m;
proxy_temp_path /temp/cache;

server {
    listen       80;

    if ( $remote_addr = 127.0.0.1 ) {
        rewrite   ^(.*)$  /500.html last;
        return 302;

    }

    location /    {
        proxy_pass         http://backend;

        proxy_cache one;
        proxy_cache_key         backend$request_uri;
        proxy_cache_valid 200 3h;
        proxy_cache_use_stale   error timeout invalid_header;

proxy_ignore_headers Cache-Control;

proxy_ignore_headers Expires;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For 

$proxy_add_x_forwarded_for;

        error_page   500 501  =  /500.html;
        error_page   502 503 504  =  /502.html;
    }

    location /500.html {
            root   /var/www/nginx-default;
    }

    location /502.html {
            root   /var/www/nginx-default;
    }

}

}

curl -I

HTTP/1.1 200 OK
Server: nginx/0.8.11
Date: Mon, 31 Aug 2009 08:41:57 GMT
Content-Type: text/calendar; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/5.2.4-2ubuntu5.7
Content-Disposition: attachment; filename=“fbCal-Events.ics”
Cache-Control: max-age=10
Content-Length: 80450

Posted at Nginx Forum:

Hello!

On Mon, Aug 31, 2009 at 04:57:01AM -0400, fredericsidler wrote:

I just installed nginx 0.8.11 in order to use the $upstream_cache_status variable.

I can see now in the logs that my URLs (ics feed URLs) are cached and retrieved from the cache (MISS, HIT, EXPIRED) based on my caching parameters.

But, it only works when
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

are used and left uncommented. I have read in the forums that this shouldn’t be use in production. So what should I do next to be able to comment these parameters and get the result I’m expected.

Directive proxy_ignore_headers instruct nginx to ignore headers
in question got from upstream. And as you have Cache-Control
returned by your upstream - nginx honors it unless
proxy_ignore_headers specified. There is nothing wrong here.

Best solution would be to fix upstream server to return cache-related
headers you want. If you can’t do that for some reason - the only
way is to use proxy_ignore_headers.

I tried to set the Expires header by using set_proxy_header, but no headers are added to my file. Here is my configuration file and the headers of one the ICS file

Directive proxy_set_header sets headers sent to upstream, it’s
completely unrelated. There is no way to alter upstream response
before caching it.

Maxim D.

Hello Maxim,

I found out where the problem was!
Cache-Control: max-age=10
where 10 are 10 seconds.

Setting the Cache-Control to 3 hours
Cache-Control: max-age=10800
works as expected.

Posted at Nginx Forum: