Varnish je HTTP akcelerátor určený pro obsahově náročné dynamické webové stránky a také API. Podporuje Nginx, Apache a celou řadu CMS. Na rozdíl od jiných webových akcelerátorů, jako je Squid, který se používá spíš jako mezipaměť na straně klienta, nebo Apache a Nginx – což jsou primárně původní servery, byla tato cache navržena přímo jako akcelerátor HTTP.
Zaměřuje se výhradně na HTTP protokol. Na rozdíl od jiných proxy serverů, které často podporují FTP, SMTP nebo další síťové protokoly. Ve verzi Plus je k dispozici front-end šifrování.
Obsah
Varnish WordPress Nginx
Varnish
Upravený varnish default.vcl
# # Toto je VCL soubor. # Marker, který sdělí překladači VCL, že toto VCL bylo napsáno pomocí # 4.0 nebo 4.1 syntax. vcl 4.1; import std; # Výchozí definice backendu. Nastavte ji tak, aby ukazovala na váš server s obsahem. backend default { .host = "127.0.0.1"; .port = "8080"; } # Přidání názvů hostitelů, IP adres a podsítí, které mohou čistit obsah. acl purge { "localhost"; "127.0.0.1"; } sub vcl_recv { # Odstranění prázdných parametrů řetězce dotazu # Např.: www.example.cz/index.html? if (client.ip != "127.0.0.1" && req.http.host ~ "example.cz") { set req.http.x-redir = "https://example.cz" + req.url; return(synth(850, "")); } if (req.url ~ "\?$") { set req.url = regsub(req.url, "\?$", ""); } # Odstranění čísla portu z hlavičky hostitele set req.http.Host = regsub(req.http.Host, ":[0-9]+", ""); # Seřadí parametry řetězce dotazu podle abecedy pro účely normalizace mezipaměti set req.url = std.querysort(req.url); # Odstranění hlavičky proxy serveru pro zmírnění zranitelnosti httpoxy # Viz https://httpoxy.org/ unset req.http.proxy; # Logika vyčištění pro odstranění objektů z mezipaměti. # Přizpůsobení pluginu WordPress Proxy Cache Purge if(req.method == "PURGE") { if(!client.ip ~ purge) { return(synth(405,"PURGE not allowed for this IP address")); } if (req.http.X-Purge-Method == "regex") { ban("obj.http.x-url ~ " + req.url + " && obj.http.x-host == " + req.http.host); return(synth(200, "Purged")); } ban("obj.http.x-url == " + req.url + " && obj.http.x-host == " + req.http.host); return(synth(200, "Purged")); } # Zpracovávat pouze relevantní metody požadavků HTTP if ( req.method != "GET" && req.method != "HEAD" && req.method != "PUT" && req.method != "POST" && req.method != "PATCH" && req.method != "TRACE" && req.method != "OPTIONS" && req.method != "DELETE" ) { return (pipe); } # Odstranění parametrů sledovacího řetězce dotazů používaných analytickými nástroji if (req.url ~ "(\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") { set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", ""); set req.url = regsuball(req.url, "\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "?"); set req.url = regsub(req.url, "\?&", "?"); set req.url = regsub(req.url, "\?$", ""); } # Ve vyrovnávací paměti pouze požadavky GET a HEAD if (req.method != "GET" && req.method != "HEAD") { set req.http.X-Cacheable = "NO:REQUEST-METHOD"; return(pass); } # Označte statické soubory hlavičkou X-Static-File a odstraňte všechny soubory cookie. # X-Static-File se také používá v vcl_backend_response k identifikaci statických souborů. if (req.url ~ "^[^?]*\.(7z|bz2|css|csv|gif|gz|ico|jpeg|jpg|js|less|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|otf|pdf|png|ppt|rar|rtf|svg|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") { set req.http.X-Static-File = "true"; unset req.http.Cookie; return(hash); } # Žádné ukládání speciálních adres URL, přihlášených uživatelů a některých zásuvných modulů do mezipaměti if ( req.http.Cookie ~ "wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|wordpress_logged_in_|comment_author|PHPSESSID" || req.http.Authorization || req.url ~ "add_to_cart" || req.url ~ "edd_action" || req.url ~ "nocache" || req.url ~ "^/addons" || req.url ~ "^/bb-admin" || req.url ~ "^/bb-login.php" || req.url ~ "^/bb-reset-password.php" || req.url ~ "^/cart" || req.url ~ "^/checkout" || req.url ~ "^/control.php" || req.url ~ "^/login" || req.url ~ "^/logout" || req.url ~ "^/lost-password" || req.url ~ "^/my-account" || req.url ~ "^/product" || req.url ~ "^/register" || req.url ~ "^/register.php" || req.url ~ "^/server-status" || req.url ~ "^/signin" || req.url ~ "^/signup" || req.url ~ "^/stats" || req.url ~ "^/wc-api" || req.url ~ "^/wp-admin" || req.url ~ "^/wp-comments-post.php" || req.url ~ "^/wp-cron.php" || req.url ~ "^/wp-login.php" || req.url ~ "^/wp-activate.php" || req.url ~ "^/wp-mail.php" || req.url ~ "^/wp-login.php" || req.url ~ "^\?add-to-cart=" || req.url ~ "^\?wc-api=" || req.url ~ "^/preview=" || req.url ~ "^/\.well-known/acme-challenge/" ) { set req.http.X-Cacheable = "NO:Logged in/Got Sessions"; if(req.http.X-Requested-With == "XMLHttpRequest") { set req.http.X-Cacheable = "NO:Ajax"; } return(pass); } # Odstranění všech zbývajících souborů cookie unset req.http.Cookie; return(hash); } sub vcl_hash { if(req.http.X-Forwarded-Proto) { # Vytváření variant mezipaměti v závislosti na protokolu požadavku hash_data(req.http.X-Forwarded-Proto); } } sub vcl_backend_response { # Injekce URL a hlavičky Hostitele do objektu pro účely asynchronního zakazování set beresp.http.x-url = bereq.url; set beresp.http.x-host = bereq.http.host; # Pokud nedostaneme hlavičku Cache-Control z backendu. # ve výchozím nastavení nastavujeme 1h cache pro všechny objekty if (!beresp.http.Cache-Control) { set beresp.ttl = 1h; set beresp.http.X-Cacheable = "YES:Forced"; } # Pokud je soubor označen jako statický, uložíme jej do mezipaměti na 1 den. if (bereq.http.X-Static-File == "true") { unset beresp.http.Set-Cookie; set beresp.http.X-Cacheable = "YES:Forced"; set beresp.ttl = 1d; } # Odstranění hlavičky Set-Cookie při nastavení konkrétního souboru cookie služby Wordfence if (beresp.http.Set-Cookie ~ "wfvt_|wordfence_verifiedHuman") { unset beresp.http.Set-Cookie; } if (beresp.http.Set-Cookie) { set beresp.http.X-Cacheable = "NO:Got Cookies"; } elseif(beresp.http.Cache-Control ~ "private") { set beresp.http.X-Cacheable = "NO:Cache-Control=private"; } } sub vcl_backend_response { # Vše zde uvedené se provede po načtení hlaviček odpovědi z backendu. # # Zde vyčistíme hlavičky odpovědi a odstraníme hloupé hlavičky Set-Cookie. # a další chyby, které dělá váš backend. } sub vcl_deliver { # Vše zde uvedené seprovede když máme všechny potřebné části a chystáme se odeslat # odpověď klientovi. # # Zde můžete provést zaúčtování nebo úpravu výsledného objektu. # Ladění hlavičky if(req.http.X-Cacheable) { set resp.http.X-Cacheable = req.http.X-Cacheable; } elseif(obj.uncacheable) { if(!resp.http.X-Cacheable) { set resp.http.X-Cacheable = "NO:UNCACHEABLE"; } } elseif(!resp.http.X-Cacheable) { set resp.http.X-Cacheable = "YES"; } # Čištění záhlaví unset resp.http.x-url; unset resp.http.x-host; } sub vcl_synth { if (resp.status == 850) { set resp.http.Location = req.http.x-redir; set resp.status = 301; return (deliver); } }
Nginx
#Připojení upstream k abstraktnímu backendu pro php upstream test_lan { # server unix:/var/run/php/php8.1-fpm.sock; # server unix:/tmp/php-cgi.socket; server 127.0.0.1:9000 fail_timeout=0; } server { server_name test.lan; root /var/www/html/test.lan; index index.php; listen 8080; ## listen for ipv4; this line is default and implied listen 443 ssl http2; client_max_body_size 20M; #fastcgi_buffering off; proxy_busy_buffers_size 512k; proxy_buffers 4 512k; proxy_buffer_size 256k; access_log /var/log/nginx/test_access.log; error_log /var/log/nginx/test_error.log info; ssl_certificate /etc/ssl/certs/localhost.crt; ssl_certificate_key /etc/ssl/private/localhost.key; ssl_protocols TLSv1.3; location / { expires 2d; add_header Cache-Control "public, no-transform"; # This is cool because no php is touched for static content. # include the "?$args" part so non-default permalinks doesn't break when using query string try_files $uri $uri/ /index.php?$args; if (!-e $request_filename) { rewrite ^(.*)$ /index.php; proxy_pass http://127.0.0.1:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; proxy_set_header Host $host; # proxy_redirect off; # proxy_http_version 1.1; } } location ~ \.php$ { expires 2d; add_header Cache-Control "public, no-transform"; try_files $uri = 404; #Prevents autofixing of path which could be used for exploit include fastcgi_params; fastcgi_buffering on; fastcgi_pass 127.0.0.1:9000; fastcgi_buffers 16 32k; fastcgi_buffer_size 64k; fastcgi_busy_buffers_size 64k; # fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 6d; add_header Cache-Control "public, no-transform"; log_not_found off; } }
WordPress
V konfiguraci se již počítá s instalovaným plugine pro čistění cache. Doinstalujeme plugin
Vizualizace

Užitečné
Varnish Cache ISPconfig plugin Debian 11
Domovská stránka VCL software.
Oficiální dokumentace.