Last active
November 5, 2019 21:12
-
-
Save rungta/170137a660ba0eec73d3e044dca441ff to your computer and use it in GitHub Desktop.
Fortifying Craft for High Traffic https://speakerdeck.com/rungta/fortifying-craft-for-high-traffic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{# _init.twig #} | |
{# | |
Usage | |
extend `_init` | |
set `doNotCache` to true to exclude a page | |
set `cacheKey` to a string to cache a template globally | |
(as opposed to by URL). eg: 404 template | |
modify `cacheKeyPrefix` to include variation params, if any | |
#} | |
{# Cache Config #} | |
{% set cacheflags = cacheflags ?? 'entries|assets|globals|categories|users' %} | |
{% set cacheKeyPrefix = { | |
device: craft.app.request.isMobileBrowser ? 'mobile' : 'nonmobile', | |
user: currentUser ? 'user' : 'guest', | |
}|join(',') %} | |
{% set cacheableEnv = craft.app.request.isPost | |
and not (doNotCache ?? false) | |
and not craft.app.session.hasFlash('error') | |
and not craft.app.session.hasFlash('notice') | |
%} | |
{# Figure out if page should be cached #} | |
{%- if cacheableEnv %} | |
{# If a cacheKey is set, use that to globally cache the rendered page #} | |
{% if cacheKey ?? false %} | |
{% cacheflag flagged cacheflags globally using key (cacheKeyPrefix ~ ':' ~ cacheKey) for 1 month %} | |
{%- minify html %} | |
{{ block('html') }} | |
{% endminify -%} | |
{% endcacheflag %} | |
{% else %} | |
{# No cacheKey set, cache the rendered page by url (not globally) #} | |
{% cacheflag flagged cacheflags using key cacheKeyPrefix for 1 month %} | |
{%- minify html %} | |
{{ block('html') }} | |
{% endminify -%} | |
{% endcacheflag %} | |
{% endif %} | |
{% else %} | |
{% block html %}{% endblock %} | |
{% endif %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# WARNING: This is not a complete NGINX configuration file | |
# It tries to highlight just the directives used to enable FastCGI microcaching | |
# as explained in https://speakerdeck.com/rungta/fortifying-craft-for-high-traffic | |
# | |
http { | |
#... | |
# Init cache | |
fastcgi_cache_path /var/run/fastcgicache levels=1:2 keys_zone=fastcgicache:100m inactive=1d; | |
# Configure | |
fastcgi_cache_lock on; | |
fastcgi_cache_use_stale updating error timeout invalid_header http_500; | |
fastcgi_cache_background_update on; | |
fastcgi_cache_methods GET HEAD; | |
fastcgi_cache_key "$scheme$request_method$host$request_uri"; | |
# Detect mobile browsers | |
# from https://gist.github.com/dangayle/2919206 | |
# map $http_user_agent $is_mobile { | |
# default 0; | |
# "~*android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino" 1; | |
# "~*^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)" 1; | |
# } | |
# fastcgi_cache_key "$is_mobile$scheme$request_method$host$request_uri"; | |
# Cache status (debug) | |
add_header X-Cache $upstream_cache_status; | |
fastcgi_pass_header X-Accel-Expires; | |
server { | |
#... | |
# Craft-specific location handlers to ensure AdminCP requests route through index.php | |
# If you change your `cpTrigger`, change it here as well | |
location ^~ /admin { | |
try_files $uri $uri/ @phpfpm_nocache; | |
} | |
location ^~ /actions/ { | |
try_files $uri $uri/ @phpfpm_nocache; | |
} | |
location ^~ /index.php/admin { | |
try_files $uri $uri/ @phpfpm_nocache; | |
} | |
location ^~ /index.php/actions { | |
try_files $uri $uri/ @phpfpm_nocache; | |
} | |
location ~ \.php$ { | |
# Enable cache | |
fastcgi_cache fastcgicache; | |
fastcgi_ignore_headers Cache-Control Expires; | |
fastcgi_cache_valid 200 301 302 404 1s; | |
fastcgi_cache_bypass $arg_token $cookie_1031b8c41dfff97a311a7ac99863bdc5_identity; | |
fastcgi_no_cache $arg_token $cookie_1031b8c41dfff97a311a7ac99863bdc5_identity; | |
# Regular PHP handling | |
# ... | |
} | |
location @phpfpm_nocache { | |
# No FastCGI Cache | |
fastcgi_cache_bypass 1; | |
fastcgi_no_cache 1; | |
# Regular PHP handling | |
# ... | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment