public
Last active

nginx microcaching config example

  • Download Gist
gistfile1.lua
Lua
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
# Set cache dir
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=microcache:5m max_size=1000m;
 
# Virtualhost/server configuration
server {
listen 80;
server_name yourhost.domain.com;
 
# Define cached location (may not be whole site)
location / {
 
# Setup var defaults
set $no_cache "";
 
# If non GET/HEAD, don't cache & mark user as uncacheable for 1 second via cookie
if ($request_method !~ ^(GET|HEAD)$) {
set $no_cache "1";
}
 
# Drop no cache cookie if need be
# (for some reason, add_header fails if included in prior if-block)
if ($no_cache = "1") {
add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
add_header X-Microcachable "0";
}
 
# Bypass cache if no-cache cookie is set
if ($http_cookie ~* "_mcnc") {
set $no_cache "1";
}
 
# Bypass cache if flag is set
proxy_no_cache $no_cache;
proxy_cache_bypass $no_cache;
 
# Point nginx to the real app/web server
proxy_pass http://appserver.domain.com;
 
# Set cache zone
proxy_cache microcache;
 
# Set cache key to include identifying components
proxy_cache_key $scheme$host$request_method$request_uri;
 
# Only cache valid HTTP 200 responses for 1 second
proxy_cache_valid 200 1s;
 
# Serve from cache if currently refreshing
proxy_cache_use_stale updating;
 
# Send appropriate headers through
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
# Set files larger than 1M to stream rather than cache
proxy_max_temp_file_size 1M;
 
# Custom logging
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" nocache:$no_cache';
access_log /var/log/nginx/microcache.log custom;
 
}
 
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.