Slide 1

Slide 1 text

Reverse caching proxies Varnish or nginx? By thijs feryn

Slide 2

Slide 2 text

Hi# my#name# is#Thijs

Slide 3

Slide 3 text

I’m# an#evangelist#at

Slide 4

Slide 4 text

I’m# a#board#member# at

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

h"p://joind.in/8444 Please& give&me& feedback

Slide 8

Slide 8 text

What‘s&a& reverse&proxy?

Slide 9

Slide 9 text

Why?

Slide 10

Slide 10 text

Why? ✓#Hide#origin#server ✓#SSL#termina9on ✓#Load#balancing ✓#Caching ✓#Compression

Slide 11

Slide 11 text

Why? ✓#Hide#origin#server ✓#SSL#termina9on ✓#Load#balancing ✓#Caching ✓#Compression

Slide 12

Slide 12 text

Protect&your& backend&servers

Slide 13

Slide 13 text

Kevin&&&Whitney

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Cache?control Cache?Control&“max?age=3600,&s? maxage=1000,&public,&must?revalidate”

Slide 17

Slide 17 text

Expires Expires&"Wed,&1&Jan&2014&20:00:00&GMT"

Slide 18

Slide 18 text

ETag If?None?Match:&"3e86?410?3596Vbc" ETag:&"3e86?410?3596Vbc" Problems with browser cache

Slide 19

Slide 19 text

What’s&not&cacheable? by#convention

Slide 20

Slide 20 text

What’s&not&cacheable? ✓&HTTP&POST,&PUT,&DELETE ✓&Cookie&&&Set?Cookie&headers ✓&Authoriza`on ✓&Vary&* ✓&TTL&==&0

Slide 21

Slide 21 text

Meet1the1gladiators

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

✓Poul9Henning1Kamp ✓Verdens1Gang1AS ✓Redpill1Linpro ✓2005:1ideas1@1Verdens1Gang ✓20061:1development1&1V1 ✓2008:1v2 ✓2011:1v3 ✓Varnish1soLware ✓Reverse1proxy1only

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

✓Igor1Sysoev ✓2002:1development ✓2004:1first1release ✓12,18%1of1the1internet ✓CK101problem ✓Event1driven,1async ✓$3M1funding ✓Webserver1&1reverse1proxy

Slide 26

Slide 26 text

Install

Slide 27

Slide 27 text

curl%http://repo.varnish3cache.org/debian/GPG3key.txt%|%sudo%apt3 key%add%3 echo%"deb%http://repo.varnish3cache.org/ubuntu/%precise% varnish33.0"%|%sudo%tee%3a%/etc/apt/sources.list sudo%apt3get%update sudo%apt3get%install%varnish curl%http://repo.varnish3cache.org/debian/GPG3key.txt%|%sudo%apt3 key%add%3 echo%"deb%http://repo.varnish3cache.org/debian/%squeeze% varnish33.0"%|%sudo%tee%3a%/etc/apt/sources.list sudo%apt3get%update sudo%apt3get%install%varnish

Slide 28

Slide 28 text

deb%http://nginx.org/packages/ubuntu/%lucid%nginx deb3src%http://nginx.org/packages/ubuntu/%lucid%nginx deb%http://nginx.org/packages/debian/%squeeze%nginx deb3src%http://nginx.org/packages/debian/%squeeze%nginx Go1to1h"p://wiki.nginx.org/Pgp1for1PGP1signature Go1to1h"p://wiki.nginx.org/Install1for1more1info

Slide 29

Slide 29 text

Configure

Slide 30

Slide 30 text

DAEMON_OPTS="-a/:80/\ -T/localhost:6082/\ -f//etc/varnish/default.vcl/\ -S//etc/varnish/secret/\ -s/malloc,256m" In&“/etc/default/varnish”

Slide 31

Slide 31 text

backend/default/{ //////.host/=/"127.0.0.1"; //////.port/=/"8080"; } In&“/etc/varnish/default.vcl”

Slide 32

Slide 32 text

server%{ %%listen%%%%%%%80; %%server_name%%host3name.dev; %%access_log%%%/var/log/nginx/access.log; %%error_log%%%/var/log/nginx/error.log; %%location%/%{ proxy_pass%%http://localhost:8080; proxy_cache%proxy3cache; proxy_cache_key%"$scheme://$host $request_uri"; proxy_cache_valid%%%200%302%%1h; } } In&“/etc/nginx/sites9enabled”

Slide 33

Slide 33 text

proxy_cache_path%/tmp/%levels=1:2% keys_zone=proxy3cache:10m%inactive=5m; Add&to&“/etc/nginx/ nginx.conf”

Slide 34

Slide 34 text

Backend Listen/8080 In&“/etc/apache2/ports.conf”

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

✓mod_php ✓mod_fcgid&&&php?cgi ✓mod_proxy_fcgi&&&php?fpm ✓Behind&Varnish&&&Nginx

Slide 37

Slide 37 text

server%{ listen%%%%%%%80; server_name%%nginx3proxy.dev; %%root%%%/home/data/www; %%access_log%%/var/log/nginx/access.log; %%access_log%%/var/log/nginx/error.log; %%location%/%{ %%index%%index.php; %%} location%~%\.php$%{ fastcgi_split_path_info%^(.+\.php)(/.+)$; fastcgi_pass%127.0.0.1:9000; fastcgi_index%index.php; include%fastcgi_params; fastcgi_param%%SCRIPT_FILENAME%%%$request_filename; fastcgi_cache%%%fastcgi3cache; fastcgi_cache_valid%%%200%302%%1h; fastcgi_cache_key%"$scheme://$host$request_uri"; %%} }

Slide 38

Slide 38 text

h"ps://www.varnish9cache.org/trac/wiki/ Future_Feature#FCGIbackendsupport

Slide 39

Slide 39 text

Out of the box

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

POST, DELETE & PUT cookies & auth headers set-cookie headers cache ttl <= 0 vary “*” Varnish will not cache

Slide 42

Slide 42 text

POST, DELETE & PUT “no-cache", "no-store", "private” set-cookie headers cache ttl <= 0 X-Accel-Expires: 0 Nginx will not cache

Slide 43

Slide 43 text

About cookies

Slide 44

Slide 44 text

About cookies HTTP cookie request header via browser HTTP set-cookie response header via webserver

Slide 45

Slide 45 text

set%$bypass%0; if%($http_cookie)%{ set%$bypass%1; } fastcgi_cache_bypass%$bypass; fastcgi_no_cache%$bypass;

Slide 46

Slide 46 text

Monitoring & Logging

Slide 47

Slide 47 text

access_log error_log

Slide 48

Slide 48 text

varnishstat varnishlog varnishtop

Slide 49

Slide 49 text

varnishstat

Slide 50

Slide 50 text

4+05:26:25 Hitrate%ratio:%%%%%%%10%%%%%%100%%%%%%254 Hitrate%avg:%%%%%0.8486%%%0.7619%%%0.7285 %%%%%1760818%%%%%%%%%6.99%%%%%%%%%4.82%client_conn%3%Client%connections%accepted %%%%11088687%%%%%%%%25.96%%%%%%%%30.36%client_req%3%Client%requests%received %%%%%8042715%%%%%%%%11.98%%%%%%%%22.02%cache_hit%3%Cache%hits %%%%%2609561%%%%%%%%11.98%%%%%%%%%7.15%cache_miss%3%Cache%misses %%%%%%%47104%%%%%%%%%1.00%%%%%%%%%0.13%backend_conn%3%Backend%conn.%success %%%%%%%%%610%%%%%%%%%0.00%%%%%%%%%0.00%backend_fail%3%Backend%conn.%failures %%%%%2998265%%%%%%%%12.98%%%%%%%%%8.21%backend_reuse%3%Backend%conn.%reuses %%%%%%%12081%%%%%%%%%0.00%%%%%%%%%0.03%backend_toolate%3%Backend%conn.%was%closed %%%%%3010356%%%%%%%%13.98%%%%%%%%%8.24%backend_recycle%3%Backend%conn.%recycles %%%%%%%%%%13%%%%%%%%%0.00%%%%%%%%%0.00%backend_retry%3%Backend%conn.%retry %%%%%%%%%520%%%%%%%%%0.00%%%%%%%%%0.00%fetch_head%3%Fetch%head %%%%%2857965%%%%%%%%11.98%%%%%%%%%7.83%fetch_length%3%Fetch%with%Length %%%%%%151309%%%%%%%%%2.00%%%%%%%%%0.41%fetch_chunked%3%Fetch%chunked %%%%%%%%4404%%%%%%%%%0.00%%%%%%%%%0.01%fetch_close%3%Fetch%wanted%close %%%%%%%%%676%%%%%%%%%0.00%%%%%%%%%0.00%fetch_failed%3%Fetch%failed %%%%%%%31164%%%%%%%%%0.00%%%%%%%%%0.09%fetch_304%3%Fetch%no%body%(304) %%%%%%%%%220%%%%%%%%%%.%%%%%%%%%%%%.%%%n_sess_mem%3%N%struct%sess_mem %%%%%%%%%%53%%%%%%%%%%.%%%%%%%%%%%%.%%%n_sess%3%N%struct%sess %%%%%%%29540%%%%%%%%%%.%%%%%%%%%%%%.%%%n_object%3%N%struct%object %%%%%%%29561%%%%%%%%%%.%%%%%%%%%%%%.%%%n_objectcore%3%N%struct%objectcore %%%%%%%%5058%%%%%%%%%%.%%%%%%%%%%%%.%%%n_objecthead%3%N%struct%objecthead %%%%%%%%2613%%%%%%%%%%.%%%%%%%%%%%%.%%%n_waitinglist%3%N%struct%waitinglist %%%%%%%%%%%3%%%%%%%%%%.%%%%%%%%%%%%.%%%n_vbc%3%N%struct%vbc %%%%%%%%%%22%%%%%%%%%%.%%%%%%%%%%%%.%%%n_wrk%3%N%worker%threads %%%%%%%%1789%%%%%%%%%0.00%%%%%%%%%0.00%n_wrk_create%3%N%worker%threads%created

Slide 51

Slide 51 text

varnishlog

Slide 52

Slide 52 text

%%%11%SessionOpen%%c%12.12.12.1%53727%:80 %%%11%ReqStart%%%%%c%12.12.12.1%53727%1401010767 %%%11%RxRequest%%%%c%GET %%%11%RxURL%%%%%%%%c%/ %%%11%RxProtocol%%%c%HTTP/1.1 %%%11%RxHeader%%%%%c%Host:%12.12.12.6 %%%11%RxHeader%%%%%c%User3Agent:%Mozilla/5.0%(Macintosh;%Intel%Mac%OS%X%10.8;%rv:17.0)% Gecko/20100101%Firefox/17.0 %%%11%RxHeader%%%%%c%Accept:%text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 %%%11%RxHeader%%%%%c%Accept3Language:%nl,en;q=0.7,fr3be;q=0.3 %%%11%RxHeader%%%%%c%Accept3Encoding:%gzip,%deflate %%%11%RxHeader%%%%%c%Connection:%keep3alive %%%11%VCL_call%%%%%c%recv%lookup %%%11%VCL_call%%%%%c%hash %%%11%Hash%%%%%%%%%c%/ %%%11%Hash%%%%%%%%%c%12.12.12.6 %%%11%VCL_return%%%c%hash %%%11%VCL_call%%%%%c%miss%fetch %%%11%Backend%%%%%%c%13%default%default %%%11%TTL%%%%%%%%%%c%1401010767%RFC%0%31%31%1357920021%0%1357920020%0%0 %%%11%VCL_call%%%%%c%fetch %%%11%TTL%%%%%%%%%%c%1401010767%VCL%120%31%31%1357920021%30 %%%11%VCL_return%%%c%hit_for_pass %%%11%ObjProtocol%%c%HTTP/1.1 %%%11%ObjResponse%%c%OK %%%11%ObjHeader%%%%c%Date:%Fri,%11%Jan%2013%16:00:20%GMT %%%11%ObjHeader%%%%c%Server:%Apache %%%11%ObjHeader%%%%c%X3Powered3By:%PHP/5.3.231ubuntu4.18 %%%11%ObjHeader%%%%c%Cache3Control:%no3cache,%no3store,%max3age=0 Client&

Slide 53

Slide 53 text

%%%11%VCL_return%%%c%hit_for_pass %%%11%ObjProtocol%%c%HTTP/1.1 %%%11%ObjResponse%%c%OK %%%11%ObjHeader%%%%c%Date:%Fri,%11%Jan%2013%16:00:20%GMT %%%11%ObjHeader%%%%c%Server:%Apache %%%11%ObjHeader%%%%c%X3Powered3By:%PHP/5.3.231ubuntu4.18 %%%11%ObjHeader%%%%c%Cache3Control:%no3cache,%no3store,%max3age=0 %%%11%ObjHeader%%%%c%Vary:%Accept3Encoding %%%11%ObjHeader%%%%c%Content3Encoding:%gzip %%%11%ObjHeader%%%%c%Content3Length:%119 %%%11%ObjHeader%%%%c%Content3Type:%text/html %%%11%Gzip%%%%%%%%%c%u%F%3%119%336%80%80%887 %%%11%VCL_call%%%%%c%deliver%deliver %%%11%TxProtocol%%%c%HTTP/1.1 %%%11%TxStatus%%%%%c%200 %%%11%TxResponse%%%c%OK %%%11%TxHeader%%%%%c%Server:%Apache %%%11%TxHeader%%%%%c%X3Powered3By:%PHP/5.3.231ubuntu4.18 %%%11%TxHeader%%%%%c%Cache3Control:%no3cache,%no3store,%max3age=0 %%%11%TxHeader%%%%%c%Vary:%Accept3Encoding %%%11%TxHeader%%%%%c%Content3Encoding:%gzip %%%11%TxHeader%%%%%c%Content3Type:%text/html %%%11%TxHeader%%%%%c%Content3Length:%119 %%%11%TxHeader%%%%%c%Accept3Ranges:%bytes %%%11%TxHeader%%%%%c%Date:%Fri,%11%Jan%2013%16:00:20%GMT %%%11%TxHeader%%%%%c%X3Varnish:%1401010767 %%%11%TxHeader%%%%%c%Age:%0 %%%11%TxHeader%%%%%c%Via:%1.1%varnish %%%11%TxHeader%%%%%c%Connection:%keep3alive %%%11%Length%%%%%%%c%119 %%%11%ReqEnd%%%%%%%c%1401010767%1357920020.712090731%1357920020.727306366%0.000087738% Client&

Slide 54

Slide 54 text

%%%13%BackendClose%3%default %%%13%BackendOpen%%b%default%127.0.0.1%51597%127.0.0.1%8080 %%%13%TxRequest%%%%b%GET %%%13%TxURL%%%%%%%%b%/ %%%13%TxProtocol%%%b%HTTP/1.1 %%%13%TxHeader%%%%%b%Host:%12.12.12.6 %%%13%TxHeader%%%%%b%User3Agent:%Mozilla/5.0%(Macintosh;%Intel%Mac%OS%X%10.8;%rv:17.0)% Gecko/20100101%Firefox/17.0 %%%13%TxHeader%%%%%b%Accept:%text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 %%%13%TxHeader%%%%%b%Accept3Language:%nl,en;q=0.7,fr3be;q=0.3 %%%13%TxHeader%%%%%b%X3Forwarded3For:%12.12.12.1 %%%13%TxHeader%%%%%b%X3Varnish:%1401010767 %%%13%TxHeader%%%%%b%Accept3Encoding:%gzip %%%13%RxProtocol%%%b%HTTP/1.1 %%%13%RxStatus%%%%%b%200 %%%13%RxResponse%%%b%OK %%%13%RxHeader%%%%%b%Date:%Fri,%11%Jan%2013%16:00:20%GMT %%%13%RxHeader%%%%%b%Server:%Apache %%%13%RxHeader%%%%%b%X3Powered3By:%PHP/5.3.231ubuntu4.18 %%%13%RxHeader%%%%%b%Cache3Control:%no3cache,%no3store,%max3age=0 %%%13%RxHeader%%%%%b%Vary:%Accept3Encoding %%%13%RxHeader%%%%%b%Content3Encoding:%gzip %%%13%RxHeader%%%%%b%Content3Length:%119 %%%13%RxHeader%%%%%b%Content3Type:%text/html %%%13%Fetch_Body%%%b%4(length)%cls%0%mklen%1 %%%13%Length%%%%%%%b%119 %%%13%BackendReuse%b%default Backend&

Slide 55

Slide 55 text

Examples varnishlog%3c%3m"VCL_call:hit"%|%grep%RxURL varnishlog%3c%3m"VCL_call:miss"%|%grep%RxURL varnishlog%3a%3w%/tmp/varnish.log varnishlog%3r%/tmp/varnish.log varnishlog%3i%RxHeader%3I%Cookie

Slide 56

Slide 56 text

varnishtop

Slide 57

Slide 57 text

list%length%20 %%%107.57%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%101.96%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%%82.49%RxHeader%%%%%%%User3Agent:%Mozilla/4.0%(compatible;%MSIE% %%%%69.90%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(compatible;%MSIE% %%%%64.04%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%%43.74%RxHeader%%%%%%%User3Agent:%Mozilla/4.0%(compatible;%MSIE% %%%%22.01%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(iPod;%U;%CPU%iPho %%%%21.43%RxHeader%%%%%%%User3Agent:%Mozilla/4.0%(compatible;%MSIE% %%%%19.86%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(X11;%Linux%x86_64 %%%%15.47%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%%12.96%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%%%4.87%RxHeader%%%%%%%User3Agent:%Mozilla/4.0%(compatible;%MSIE% %%%%%2.97%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(compatible;%MSIE% %%%%%2.75%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%W %%%%%2.56%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows%NT%6.1;%r %%%%%0.97%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows;%U;%Windo %%%%%0.86%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(iPhone;%CPU%iPhon %%%%%0.83%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(Windows;%U;%Windo %%%%%0.53%RxHeader%%%%%%%User3Agent:%Mozilla/5.0%(compatible;%Googl %%%%%0.44%RxHeader%%%%%%%User3Agent:%Mozilla/4.0%(compatible;)

Slide 58

Slide 58 text

Examples varnishtop%3i%RxHeader%3I%\^User3Agent varnishtop%3i%RxRequest varnishtop%3i%RxHeader%3I%\^Host varnishtop%3i%RxHeader%3I%Cookie

Slide 59

Slide 59 text

The&flow

Slide 60

Slide 60 text

1

Slide 61

Slide 61 text

2

Slide 62

Slide 62 text

3

Slide 63

Slide 63 text

%%%11%SessionOpen%%c%12.12.12.1%53727%:80 %%%11%ReqStart%%%%%c%12.12.12.1%53727%1401010767 %%%11%RxRequest%%%%c%GET %%%11%RxURL%%%%%%%%c%/ %%%11%RxProtocol%%%c%HTTP/1.1 %%%11%RxHeader%%%%%c%Host:%12.12.12.6 %%%11%RxHeader%%%%%c%User3Agent:%Mozilla/5.0%(Macintosh;%Intel%Mac%OS%X%10.8;%rv:17.0)% Gecko/20100101%Firefox/17.0 %%%11%RxHeader%%%%%c%Accept:%text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 %%%11%RxHeader%%%%%c%Accept3Language:%nl,en;q=0.7,fr3be;q=0.3 %%%11%RxHeader%%%%%c%Accept3Encoding:%gzip,%deflate %%%11%RxHeader%%%%%c%Connection:%keep3alive %%%11%VCL_call%%%%%c%recv%lookup %%%11%VCL_call%%%%%c%hash %%%11%Hash%%%%%%%%%c%/ %%%11%Hash%%%%%%%%%c%12.12.12.6 %%%11%VCL_return%%%c%hash %%%11%VCL_call%%%%%c%miss%fetch %%%11%Backend%%%%%%c%13%default%default %%%11%TTL%%%%%%%%%%c%1401010767%RFC%0%31%31%1357920021%0%1357920020%0%0 %%%11%VCL_call%%%%%c%fetch %%%11%TTL%%%%%%%%%%c%1401010767%VCL%120%31%31%1357920021%30 %%%11%VCL_return%%%c%hit_for_pass %%%11%ObjProtocol%%c%HTTP/1.1 %%%11%ObjResponse%%c%OK %%%11%ObjHeader%%%%c%Date:%Fri,%11%Jan%2013%16:00:20%GMT %%%11%ObjHeader%%%%c%Server:%Apache %%%11%ObjHeader%%%%c%X3Powered3By:%PHP/5.3.231ubuntu4.18 %%%11%ObjHeader%%%%c%Cache3Control:%no3cache,%no3store,%max3age=0 Got&it?&

Slide 64

Slide 64 text

Cache&key

Slide 65

Slide 65 text

Cache&key sub%vcl_hash%{ hash_data(req.url); if%(req.http.host)%{ hash_data(req.http.host); }%else%{ hash_data(server.ip); } return%(hash); }

Slide 66

Slide 66 text

Cache&key fastcgi_cache_key%"$scheme://$host$request_uri"; proxy_cache_key%"$scheme://$host$request_uri";

Slide 67

Slide 67 text

Hashing cookies

Slide 68

Slide 68 text

Hashing&cookies sub%vcl_hash%{ if(req.http.Cookie%~%"country"){ hash_data(regsuball(req.http.Cookie,%"^. +;?%?country=([a3zA3Z039]+)(%|;|%;).* $","\1")); %%} }

Slide 69

Slide 69 text

Hashing&cookies set%$key%"$scheme://$host$request_uri"; if%($http_cookie%~*%"country=([^;]+)(?:;|$)"){ set%$key%"$scheme://$host$request_uri$1"; } proxy_cache_key%$key; fastcgi_cache_key%$key;

Slide 70

Slide 70 text

Hashing&cookies Cache3Control:%no3store,%no3cache,%must3 revalidate,%post3check=0,%pre3check=0 Watch&out& for& session_start()

Slide 71

Slide 71 text

Cache& purging

Slide 72

Slide 72 text

sub%vcl_recv%{ %%%%%%%%if%(req.request%==%"PURGE")%{ %%%%%%%%%%%%%%%%return%(lookup); %%%%%%%%} } sub%vcl_hit%{ %%%%%%%%if%(req.request%==%"PURGE")%{ %%%%%%%%%%%%%%%%purge; %%%%%%%%%%%%%%%%error%200%"Purged"; %%%%%%%%} } sub%vcl_miss%{ %%%%%%%%if%(req.request%==%"PURGE")%{ %%%%%%%%%%%%%%%%error%404%"Not%in%cache"; %%%%%%%%} } Purge HTTP&call& to&purge

Slide 73

Slide 73 text

Purge HTTP&call& to&purge curl%3X%PURGE%http://varnish.dev/your3page

Slide 74

Slide 74 text

sub%vcl_recv%{ %%%%%%%%if%(req.request%==%"PURGE")%{ ban("req.http.host%==%"%+%req.http.host%+%"% &&%req.url%==%"%+%req.url); error%200%"Banned"; %%%%%%%%} } Ban sub%vcl_recv%{ %%%%%%%%if%(req.request%==%"PURGE")%{ %%%%%%%%%%%%ban("req.http.host%==%"%+%req.http.host%+% "%&&%req.url%~%"%+%req.url); error%200%"Banned"; %%%%%%%%} } Ban&URL& pattern Ban&URL Name& doesn’t& matter

Slide 75

Slide 75 text

sub%vcl_recv%{ %%%%%%%%if%(req.request%==%"PURGE")%{ %%%%%%%%%%%%ban("obj.http.x3host%==%"%+%req.http.host%+% "%&&%obj.http.x3url%==%"%+%req.url); %%%%%%%%%%%%error%200%"Banned"; %%%%%%%%} } sub%vcl_fetch%{ %%%%%%%%set%beresp.http.x3url%=%req.url; %%%%%%%%set%beresp.http.x3host%=%req.http.host; } sub%vcl_deliver%{ %%%%%%%%unset%resp.http.x3url; %%%%%%%%unset%resp.http.x3host; } Smart&bans Ban&lurker& friendly

Slide 76

Slide 76 text

grep%3lr%'http://host.dev/test.php'%/tmp/cache/*%|%xargs% rm Purge

Slide 77

Slide 77 text

Purge location%~%/purge(/.*)%{ fastcgi_cache_purge%fastcgi3cache%"$scheme://$host $request_uri$1"; } location%~%/purge(/.*)%{ proxy_cache_purge%proxy3cache%"$scheme://$host $request_uri$1"; } h"ps://github.com/FRiCKLE/ngx_cache_purge

Slide 78

Slide 78 text

Purge h"ps://github.com/FRiCKLE/ngx_cache_purge curl%http://nginx.dev/purge/your3page HTTP&call& to&purge

Slide 79

Slide 79 text

Loadbalancing

Slide 80

Slide 80 text

probe healthcheck { .url = "/status.php"; .interval = 60s; .timeout = 0.3 s; .window = 8; .threshold = 3; .initial = 3; .expected_response = 200; } backend www { .host = "www.example.com"; .port = "http"; .probe = healthcheck; } Probes

Slide 81

Slide 81 text

Directors ✓Round)robin ✓Random ✓Client ✓Hash ✓Fallback ✓DNS

Slide 82

Slide 82 text

backend%one%{ %%%.host%=%“localhost”; %%%.port%=%“80”; } backend%two%{ %%%.host%=%“127.0.0.1”; %%%.port%=%“81”; } director%localhosts%random%{ %%%%{%.backend%=%one;%.weight=4;} %%%%{%.backend%=%two;%.weight=6;} %%%%{%.backend%=%{% %%%%%%%%%%%%.host%=%“localhost”;% %%%%%%%%%%%%.port%=%“82”;% %%%%%%%%}% %%%%} } sub%vcl_recv%{ %%%%set%req.backend%=%localhosts; } Random

Slide 83

Slide 83 text

director%localhosts%fallback%{ %%%%{%.backend%=%one;} %%%%{%.backend%=%two;} } sub%vcl_recv%{ %%%%set%req.backend%=%localhosts; } Fallback Picks&first& healthy& backend Order& matters

Slide 84

Slide 84 text

director%localhosts%client%{ %%%%{%.backend%=%one;%.weight=1;%} %%%%{%.backend%=%two;%.weight=1;%} } sub%vcl_recv%{ %%%%set%req.backend%=%localhosts; %%%%//Load%balance%by%client%IP,%this%is%the%default% %%%%set%client.identity%=%client.ip; } IP&hash Uses& client.identity

Slide 85

Slide 85 text

upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; } server { location / { proxy_pass http://backend; } } Random

Slide 86

Slide 86 text

upstream backend { server backend1.example.com; server backend2.example.com backup; } server { location / { proxy_pass http://backend; } } Fallback

Slide 87

Slide 87 text

upstream backend { ip_hash; server backend1.example.com weight=2; server backend2.example.com; server backend3.example.com down; server backend4.example.com; } server { location / { proxy_pass http://backend; } } IP&hash

Slide 88

Slide 88 text

Hit/miss&marker

Slide 89

Slide 89 text

Hit/miss&marker sub%vcl_deliver%{ %%if%(obj.hits%>%0)%{ %%%%set%resp.http.X3Cache%=%"HIT"; %%} %%else%{ %%%%set%resp.http.X3Cache%=%"MISS"; %%} }

Slide 90

Slide 90 text

Hit/miss&marker add_header%X3Cache%$upstream_cache_status; ✓MISS ✓EXPIRED1 ➡expired,1request1was1passed1to1backend ✓UPDATING1 ➡expired,1stale1response1was1used1due1to1proxy/fastcgi_cache_use_stale1updating ✓STALE1 ➡expired,1stale1response1was1used1due1to1proxy/fastcgi_cache_use_stale ✓HIT

Slide 91

Slide 91 text

Set&Time&To&Live

Slide 92

Slide 92 text

Cache?Control&“max?age=10,&s?maxage=5,& public,&must?revalidate” TTL

Slide 93

Slide 93 text

TTL Cache?Control&“max?age=10,&s?maxage=5,& public,&must?revalidate” 5&seconds

Slide 94

Slide 94 text

TTL Cache?Control&“max?age=10,&s?maxage=5,& public,&must?revalidate” 10&seconds

Slide 95

Slide 95 text

Force&TTL sub%vcl_fetch%{ %%%%if(req.url%~%"^/bla")%{ %%%%%%%%set%beresp.ttl%=%10s; %%%%}%else%{ %%%%%%%%set%beresp.ttl%=%3600s; %%%%} }

Slide 96

Slide 96 text

Force&TTL location%/%{ proxy_pass%%http://localhost:8080; proxy_cache%proxy3cache; proxy_cache_key%"$scheme://$host$request_uri"; proxy_cache_valid%%%200%302%%1h; } location%~%/bla%{ proxy_pass%%http://localhost:8080; proxy_cache%proxy3cache; proxy_cache_key%"$scheme://$host$request_uri"; proxy_cache_valid%%%200%302%%10s; }

Slide 97

Slide 97 text

Edge&Side&Includes

Slide 98

Slide 98 text

header.php menu.php main.php footer.php

Slide 99

Slide 99 text

Slide 100

Slide 100 text

header.php menu.php main.php footer.php TTL&5s No&caching TTL&10s TTL&2s

Slide 101

Slide 101 text

Slide 102

Slide 102 text

".PHP_EOL; } else { include($file); } } ESI#PHP#helper#func9on

Slide 103

Slide 103 text

Slide 104

Slide 104 text

ESI#VCL sub%vcl_recv%{ %%%%set%req.http.Surrogate3Capability="key=ESI/1.0"; } sub%vcl_fetch%{ % if(beresp.http.Surrogate3Control~"ESI/1.0")%{ %%%%%%%%%unset%beresp.http.Surrogate3Control; % %%%%set%beresp.do_esi=true; %%%%} }%

Slide 105

Slide 105 text

Nginx#ESI# h"ps://github.com/taf2/nginx9esi Not&official Haven’t& tested&it&yet

Slide 106

Slide 106 text

SSL

Slide 107

Slide 107 text

Varnish&doesn’t& support&SSL

Slide 108

Slide 108 text

Nginx&does&...

Slide 109

Slide 109 text

server%{ %%listen%43; %%ssl%on;% %%ssl_certificate%/path/to/ssl.crt; %%ssl_certificate_key%%/path/to/ssl.key; %%server_name%%hostname.dev; %%access_log%%/var/log/nginx/access.log; %%error_log%%/var/log/nginx/error.log; %%location%/%{ %%%%proxy_pass%http://localhost:80; % proxy_set_header%%X3Real3IP%%$remote_addr; % proxy_cache%%%proxy3cache; % proxy_cache_key%"$scheme://$host$request_uri"; % proxy_cache_valid%%%200%302%%1h; %%} } SSL

Slide 110

Slide 110 text

Who&won?

Slide 111

Slide 111 text

Use the right tool for the job

Slide 112

Slide 112 text

And# on#that# bombshell#...

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

h"p://joind.in/8444 Please& give&me& feedback

Slide 115

Slide 115 text

Thanks