Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make nginx cache rewritten assets?

I'm using cakephp1.3, and some assets are themed assets (js, img etc) and others are not themed assets.

Non themed assets are cached correctly; but themed assets are not getting the correct expiration headers. I use rewrites in the location block to help to help find themed assets, but for some reason, nginx then does not apply the correct cache headers.

I have attached a copy of my nginx config below. Has anyone solved how to cache rewritten assets?

user  nginx;
worker_processes  2;

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

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_timeout  0;
    keepalive_timeout  65;

    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

server {
    listen      80;
    server_name ag_production;
    access_log  /var/log/nginx/ag.access.log;
    error_log   /var/log/nginx/ag.error.log;
    rewrite_log on;
    root        /var/www/html/app/webroot/;
    index       index.php index.html index.htm;

    set $no_cache 0;

    location / {
        try_files $uri $uri/ @rules;
    }

    location @rules {
        rewrite ^(.+)$ /index.php?url=$1 last;
    }

    # Pass the PHP scripts to FastCGI server
    # listening on 127.0.0.1:9000
    location ~ \.php$ {
        #try_files $uri =404;
        fastcgi_cache my_cache;
        fastcgi_cache_valid 200 60m; # Only cache 200 responses, cache for 60 minutes
        fastcgi_cache_methods GET HEAD; # Only GET and HEAD methods apply
        add_header X-Fastcgi-Cache $upstream_cache_status;
        fastcgi_cache_bypass $no_cache;  # Don't pull from cache based on $no_cache
        fastcgi_no_cache $no_cache; # Don't save to cache based on $no_cache
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;

        # fastcgi_pass   unix:/tmp/php-fastcgi.sock;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_intercept_errors on; # to support 404s for PHP files not found
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~* \.(?:manifest|appcache|html?|xml|json)$ {
        try_files $uri $uri/ @rules;
        expires -1;
        access_log logs/static.log; # I don't usually include a static log
    }

    # Feed
    location ~* \.(?:rss|atom)$ {
        try_files $uri $uri/ @rules;
        expires 1h;
        add_header Pragma "public";
                add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }

    # Media: images, icons, video, audio, HTC
    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        expires 1M;
        access_log off;
        add_header Pragma "public";
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        try_files $uri $uri/ @rules;

    }

    # CSS and Javascript
    location ~* \.(?:css|js)$ {
        try_files $uri $uri/ @rules;
        expires 1y;
        access_log off;
                add_header Pragma "public";
                add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }

    # Deny access to .htaccess files,
    # git & svn repositories, etc
    location ~ /(\.ht|\.git|\.svn) {
        deny  all;
    }
}
}
like image 225
user1658296 Avatar asked Nov 03 '15 14:11

user1658296


1 Answers

Yes, theme assets are slower in CakePHP, it has been also described here in their official documentation.

The solution is to serve these theme assets through nginx, using try_files.

Here is an example nginx configuration for the above purpose:

# Serve CakePHP plugin assets directly
location ~ /(.+)/(img|css|js|files)/(.*) {
  access_log off;
  expires 10d;
  add_header Cache-Control public;
  try_files $uri $uri/ /../plugins/$1/webroot/$2/$3 /../../plugins/$1/webroot/$2/$3 /index.php?url=$uri;
}

(source)

like image 71
skbly7 Avatar answered Oct 11 '22 21:10

skbly7