Skip to content

Commit 429c0ec

Browse files
committed
Add support for page cache
1 parent 87a009e commit 429c0ec

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# vim: set ft=nginx:
2+
3+
{{- if eq .Env.STACK_PAGE_CACHE_BACKEND "redis" }}
4+
5+
location = /.stack-cache-fetch {
6+
internal;
7+
8+
set $redis_key $args;
9+
redis_pass {{ default "localhost:6379" .Env.STACK_PAGE_CACHE_REDIS_HOST_PATH }};
10+
}
11+
12+
location = /.stack-cache-store {
13+
internal;
14+
15+
set_unescape_uri $exptime $arg_exptime;
16+
set_unescape_uri $key $arg_key;
17+
18+
redis2_query set $key $echo_request_body;
19+
redis2_query expire $key $exptime;
20+
redis2_pass {{ default "localhost:6379" .Env.STACK_PAGE_CACHE_REDIS_HOST_PATH }};
21+
}
22+
23+
{{- else if eq .Env.STACK_PAGE_CACHE_BACKEND "memcached" }}
24+
location = /.stack-cache-fetch {
25+
internal;
26+
27+
set $memc_key $args;
28+
29+
memc_connect_timeout 500ms;
30+
memc_read_timeout 500ms;
31+
memc_ignore_client_abort on;
32+
33+
memc_pass {{ default "127.0.0.1:11211" .Env.STACK_PAGE_CACHE_MEMCACHED_HOST_PATH }};
34+
}
35+
36+
location = /.stack-cache-store {
37+
internal;
38+
39+
set_unescape_uri $exptime $arg_exptime;
40+
set_unescape_uri $key $arg_key;
41+
42+
set $memc_key $key;
43+
set $memc_exptime $exptime;
44+
45+
memc_connect_timeout 500ms;
46+
memc_send_timeout 500ms;
47+
memc_ignore_client_abort on;
48+
49+
memc_pass {{ default "127.0.0.1:11211" .Env.STACK_PAGE_CACHE_MEMCACHED_HOST_PATH }};
50+
}
51+
{{- end }}

php/docker/templates/nginx-vhost-conf.d/80-index.conf

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,118 @@
11
# vim: set ft=nginx:
22

3+
{{- $stackBackends := list "redis" "memcached" "custom" }}
4+
{{- $truthStrings := list "true" "on" "yes" -}}
5+
{{- $keyPrefix := default "nginx-cache:" .Env.STACK_PAGE_CACHE_KEY_PREFIX }}
6+
{{- $keyUID := default "https$request_method$host$request_uri" .Env.STACK_PAGE_CACHE_KEY_UID }}
7+
38
location / {
49
try_files $uri $uri/ /index.php$is_args$args;
510
}
611

712
location ~ \.php$ {
13+
{{- if has .Env.STACK_PAGE_CACHE_BACKEND $stackBackends }}
14+
set $skip_cache 0;
15+
16+
# POST requests and urls with a query string should always go to PHP
17+
if ($request_method = POST) {
18+
set $skip_cache 1;
19+
}
20+
if ($query_string != "") {
21+
set $skip_cache 1;
22+
}
23+
24+
# Don't cache uris containing the following segments
25+
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
26+
set $skip_cache 1;
27+
}
28+
29+
# Don't use the cache for logged in users or recent commenters
30+
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
31+
set $skip_cache 1;
32+
}
33+
34+
set $key "";
35+
set $key_prefix {{ $keyPrefix }};
36+
set $key_uid {{ $keyUID }};
37+
set $escaped_key "";
38+
set_escape_uri $escaped_key_prefix $key_prefix;
39+
set_escape_uri $escaped_key_uid $key_uid;
40+
41+
# Use versioned keys with memcached by default, for implementing cache flush
42+
{{- if and (eq .Env.STACK_PAGE_CACHE_BACKEND "memcached") ( has (default "on" .Env.STACK_PAGE_CACHE_MEMCACHED_USE_SALT) $truthStrings) }}
43+
rewrite_by_lua_block {
44+
local memcached = require "resty.memcached"
45+
local memc, err = memcached:new()
46+
if not memc then
47+
ngx.log(ngx.ERR, "failed to instantiate memcached: ", err)
48+
return
49+
end
50+
51+
memc:set_timeout(1000)
52+
53+
local ok, err = memc:connect("{{ default "127.0.0.1:11211" .Env.STACK_PAGE_CACHE_MEMCACHED_HOST_PATH }}")
54+
if not ok then
55+
ngx.log(ngx.ERR, "failed to connect to memcached: ", err)
56+
return
57+
end
58+
59+
local versionKey = ngx.var.key_prefix .. "version"
60+
61+
local version, flags, err = memc:get(versionKey)
62+
if err then
63+
ngx.log(ngx.ERR, "failed to get memcached version: ", err)
64+
return
65+
end
66+
67+
if not version then
68+
ngx.log(ngx.INFO, "memcached version not found, attempting to set one...")
69+
70+
version = os.time()
71+
local ok, err = memc:set(versionKey, version)
72+
if not ok then
73+
ngx.log(ngx.ERR, "failed to set memcached version: ", err)
74+
return
75+
end
76+
end
77+
78+
ngx.var.key = ngx.var.key_prefix .. version .. ":" .. ngx.var.key_uid
79+
ngx.var.escaped_key = ngx.var.escaped_key_prefix .. version .. ":" .. ngx.var.escaped_key_uid
80+
81+
local ok, err = memc:close()
82+
if not ok then
83+
ngx.say("failed to close memcached: ", err)
84+
return
85+
end
86+
}
87+
88+
{{- else }}
89+
# default key is nginx-cache:https$request_method$host$request_uri
90+
set $key $key_prefix$key_uid;
91+
set $escaped_key $escaped_key_prefix$escaped_key_uid;
92+
{{- end }}
93+
94+
#if ($key = "") {
95+
# set $skip_cache 1;
96+
#}
97+
98+
try_files $uri =404;
99+
100+
srcache_fetch_skip $skip_cache;
101+
srcache_store_skip $skip_cache;
102+
srcache_store_statuses {{ default "200 301 302" .Env.STACK_PAGE_CACHE_STORE_STATUSES }};
103+
104+
# https://github.com/openresty/srcache-nginx-module#srcache_response_cache_control
105+
srcache_response_cache_control {{ default "on" .Env.STACK_PAGE_CACHE_RESPONSE_CACHE_CONTROL }};
106+
107+
srcache_fetch GET /.stack-cache-fetch $key;
108+
srcache_store PUT /.stack-cache-store key=$escaped_key&exptime={{ default "360" .Env.STACK_PAGE_CACHE_EXPIRE_SECONDS | atoi }};
109+
110+
more_set_headers "x-cache-skip $skip_cache";
111+
more_set_headers "x-cache-key $key";
112+
more_set_headers "x-cache-fetch $srcache_fetch_status";
113+
more_set_headers "x-cache-store $srcache_store_status";
114+
{{- end }}
115+
8116
fastcgi_pass $upstream;
9117
fastcgi_read_timeout {{ max 60 (add 10 (default "30" .Env.PHP_REQUEST_TIMEOUT | atoi)) }};
10118
fastcgi_index index.php;

0 commit comments

Comments
 (0)