magento2.2 – How to configure Varnish 4.1 with Magento 2.2?

Running Magento 2.2.8 – Magento runs in developer mode

Varnish version 4.1.11

Varnish successfully installed on Apache 2.4

I put VARNISH_LISTEN_PORT = 80 in / etc / sysconfig / varnish

With ready-to-use settings in /etc/varnish/default.vcl, Varnish runs on 127.0.0.1 (I see the X-Varnish header when pinging with CURL), except on my real estate and therefore my store. The https version of my store is the default version (of course).

When I probed with

curl -I http://example.com 

Surprisingly, Varnish's headers showed. So now, I have gone from the front and I have disabled "Update unsecured queries" from the Magento administrator. However, the http versions of my store pages did not load at all.

Configuration file exported from the Magento administrator for Varnish 4. Replaced Varnish default.vcl by the exported file.
Now, Varnish also does not work for 127.0.0.1 (nor for my current domain name, nor with http or https)

I know the relative path "/ pub" added to the default.vcl problem exported by Magento. I removed the / pub and this did not solve my problem. I've completely removed the health check from the probe = {} and still no X-Varnish header (nor the X-Magento-Cache-Debug header).

grep -iw listen /usr/local/apache/conf/httpd.conf

Apache is listening to 0.0.0.0:8080 and 0.0.0.0:443

grep VARNISH_LISTEN_PORT / etc / sysconfig / varnish

VARNISH_LISTEN_PORT = 80

There seems to be a lot of information on the configuration of Varnish with Magento and I read a lot, I spent the last two days about it and I ran into a wall.

What do I forget here? What do not I understand?

Can anyone share his experience with detailed steps to successfully configure Varnish 4.x with Magento 2.2.x?

How did you configure Varnish (4.1) with Magento 2.2.x successfully?

I appreciate your response time. Thank you!

Here is the latest version of default.vcl that I have tried (the best until now, same effect that does not work):

                vcl 4.0;

import std;
# The minimal version of Varnish is 4.0
# For SSL offload, pass the following header on your proxy server or load balancer: X-Forwarded-Proto: https & # 39;

backend default {
.host = "127.0.0.1";
.port = "8080";
}

acl purge {
"127.0.0.1";
}

under vcl_recv {
if (req.method == "PURGE") {
if (client.ip! ~ purge) {
return (synth (405, "Unauthorized method"));
}
if (! req.http.X-Magento-Tags-Pattern) {
return (synth (400, "X-Magento-Tags-Pattern-Required Header"));
}
ban ("obj.http.X-Magento-Tags ~" + req.http.X-Magento-Tags-Pattern);
return (synth (200, "Purged"));
}

if (req.method! = "GET" &&
req.method! = "HEAD" &&
req.method! = "PUT" &&
req.method! = "POST" &&
req.method! = "TRACE" &&
req.method! = "OPTIONS" &&
req.method! = "DELETE") {
/ * No-RFC2616 or CONNECT which is weird. * /
return (pipe);
}

# We only deal with GET and HEAD by default
if (req.method! = "GET" && req.method! = "HEAD") {
return (pass);
}

# Bypass shopping cart, orders and search requests
if (req.url ~ "/ checkout" || req.url ~ "/ catalogsearch") {
return (pass);
}

# normalize url in case of schema and main HTTP domain
set req.url = regsub (req.url, "^ http[s]?: // "," ");

# collect all cookies
std.collect (req.http.ookie);

# Compression filter. See https://www.varnish-cache.org/trac/wiki/FAQ/Compression
if (req.http.Accept-Encoding) {
if (req.url ~ ". (jpg | jpeg | png | gif | gz | tgz | bz2 | tbz | mp3 | ogg | swf | flv) $") {
# No need to compress them
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent! ~ "MSIE") {
set req.http.Accept-Encoding = "deflate";
} other {
# unknown algorithm
unset req.http.Accept-Encoding;
}
}

# Remove Google gclid settings to minimize cache objects
set req.url = regsuball (req.url, "? gclid =[^&]+ $ "," "); # bands when QS ="? gclid = AAA "
set req.url = regsuball (req.url, "? gclid =[^&]+ & ","? "# bands when QS ="? gclid = AAA & foo = bar "
set req.url = regsuball (req.url, "& gclid =[^&]+ "," "# stripping QS ="? foo = bar & gclid = AAA "or QS ="? foo = bar & gclid = AAA & bar = baz "

# Static files are always cacheable. remove the SSL flag and the cookie
if (req.url ~ "^ / (pub /)? (media | static) /.* . (ico | css | jpg | jpeg | png | gif | tiff | bmp | mp3 | ogg | svg | swf | woff | woff2 | eot | ttf | otf) $ ") {
unset req.http.Https;
unset req.http.X-Forwarded-Proto;
unset req.http.Cookie;
}

return (hash);
}

under vcl_hash {
if (req.http.cookie ~ "X-Magento-Vary =") {
hash_data (regsub (req.http.cookie, "^. *? X-Magento-Vary = ([^;]+); *. * $ ","  1 "));
}

# For multi-site configurations to not cache content from one another
if (req.http.host) {
hash_data (req.http.host)
} other {
hash_data (server.ip);
}

# To ensure that HTTP users do not see SSL warnings
if (req.http.X-Forwarded-Proto) {
hash_data (req.http.X-Forwarded-Proto);
}
/ * {{design_exceptions_code}} * /
}

under vcl_backend_response {
if (beresp.http.content-type ~ "text") {
set beresp.do_esi = true;
}

if (bereq.url ~ " .js $" || beresp.http.content-type ~ "text") {
set beresp.do_gzip = true;
}

# only cache responses and 404 successfully
if (beresp.status! = 200 && beresp.status! = 404) {
set beresp.ttl = 0s;
set beresp.uncacheable = true;
return (deliver);
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.uncacheable = true;
set beresp.ttl = 86400s;
return (deliver);
}

if (beresp.http.X-Magento-Debug) {
define beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
}

# validate if we need to cache it and prevent the installation of cookies
# images, css and js can be cached by default, so we must also delete cookies
if (beresp.ttl> 0s && (bereq.method == "GET" || bereq.method == "HEAD")) {
beresp.http.set-cookie undefined;
bereq.url! ~ ". (ico | css | js | jpg | jpeg | png | gif | tiff | bmp | gz | tgz | bz2 | tbz | mp3 | ogg | svg | swf | woff | woff2 | eoff | ttf | otf) ( ? | $) ") {
set beresp.http.Pragma = "no-cache";
set beresp.http.Expires = "-1";
set beresp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age = 0";
set beresp.grace = 1m;
}
}

# If the page can not be cached, ignore Varnish for 2 minutes as a Hit-For-Pass.
if (beresp.ttl <= 0s ||
beresp.http.Surrogate-control ~ "no-store" ||
(! beresp.http.Surrogate-Control && beresp.http.Vary == "*")) {
# Mark as Hit-For-Pass for the next 2 minutes
set beresp.ttl = 120s;
set beresp.uncacheable = true;
}
return (deliver);
}

under vcl_deliver {
if (resp.http.X-Magento-Debug) {
if (resp.http.x-varnish ~ "") {
set resp.http.X-Magento-Cache-Debug = "HIT";
} other {
set resp.http.X-Magento-Cache-Debug = "MISS"
}
} other {
unset resp.http.Age;
}

unset resp.http.X-Magento-Debug;
unset resp.http.X-Magento-Tags;
unset resp.http.X-Powered-By;
unset resp.http.Server;
unset resp.http.X-Varnish;
unset resp.http.Via;
unset resp.http.Link;
}