Tôi đã thử định cấu hình Varnish trên máy chủ có xác thực Basic Auth bằng cách sử dụng các giải pháp sau:
nhưng nó không giúp được gì.
Nhật ký Varnish vẫn hiển thị lỗi 401:
varnishlog -g raw -i Backend_health
0 Backend_health - mag2.default Vẫn ốm 4--X-R- 0 5 10 0,001574 0,000000 HTTP/1.1 401 Trái phép
Cấu hình Varnish của tôi (phiên bản 4.0):
vcl 4.0;
tiêu chuẩn nhập khẩu;
# Phiên bản Varnish tối thiểu là 4.0
# Để giảm tải SSL, hãy chuyển tiêu đề sau vào máy chủ proxy hoặc bộ cân bằng tải của bạn: 'X-Forwarded-Proto: https'
phụ trợ mặc định {
.host = "127.0.0.1";
.port = "8080";
.first_byte_timeout = 600 giây;
.thăm dò = {
.url = "/health_check.php";
.thời gian chờ = 2s;
.khoảng cách = 5s;
.cửa sổ = 10;
.ngưỡng = 5;
}
}
thanh lọc acl {
"máy chủ cục bộ";
}
phụ vcl_recv {
if (! req.http.Authorization ~ "ZGV2OmRldg=") cơ bản {
return(synth(401, "Restricted"));
}
if (req.method == "PURGE") {
if (client.ip !~ thanh lọc) {
return (synth(405, "Phương thức không được phép"));
}
# Để sử dụng tiêu đề X-Pool để tẩy vecni trong quá trình triển khai tự động, hãy đảm bảo rằng tiêu đề X-Pool
# đã được thêm vào phản hồi trong cấu hình máy chủ phụ trợ của bạn. Điều này được sử dụng, ví dụ, bởi
# capistrano-magento2 đá quý để xóa nội dung cũ khỏi véc ni trong quy trình triển khai của nội dung đó.
if (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
return (synth(400, "Yêu cầu tiêu đề X-Magento-Tags-Pattern hoặc X-Pool"));
}
nếu (req.http.X-Magento-Tags-Pattern) {
ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
}
nếu (req.http.X-Pool) {
ban("obj.http.X-Pool ~ " + req.http.X-Pool);
}
return (synth(200, "Đã thanh lọc"));
}
nếu (req.method != "NHẬN" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "TÙY CHỌN" &&
req.method != "XÓA") {
/* Non-RFC2616 hoặc CONNECT lạ. */
trở lại (ống);
}
# Chúng tôi chỉ xử lý GET và HEAD theo mặc định
if (req.method != "GET" && req.method != "HEAD") {
trở về (vượt qua);
}
# Bỏ qua giỏ hàng và thanh toán
nếu (req.url ~ "/checkout") {
trở về (vượt qua);
}
# Bỏ qua yêu cầu kiểm tra sức khỏe
nếu (req.url ~ "/pub/health_check.php") {
trở về (vượt qua);
}
# Đặt trạng thái sử dụng thời gian gia hạn ban đầu
đặt req.http.grace = "không";
# bình thường hóa url trong trường hợp tên miền và sơ đồ HTTP hàng đầu
đặt req.url = regsub(req.url, "^http[s]?://", "");
# thu thập tất cả cookie
std.collect(req.http.Cookie);
# Bộ lọc nén. Xem 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)$") {
# Không có điểm nào trong việc nén những thứ này
bỏ đặt req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
đặt req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
đặt req.http.Accept-Encoding = "xả hơi";
} khác {
# thuật toán chưa biết
bỏ đặt req.http.Accept-Encoding;
}
}
# Xóa tất cả các tham số nhận tiếp thị để giảm thiểu các đối tượng bộ đệm
if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=" ) {
đặt req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=[- _A-z0-9+()%.]+&?", "");
đặt req.url = regsub(req.url, "[?|&]+$", "");
}
# Bộ nhớ đệm tệp tĩnh
if (req.url ~ "^/(pub/)?(media|static)/") {
# Các tệp tĩnh không nên được lưu vào bộ nhớ cache theo mặc định
trở về (vượt qua);
# Nhưng nếu bạn sử dụng một vài ngôn ngữ và không sử dụng CDN, bạn có thể kích hoạt các tệp tĩnh lưu vào bộ nhớ đệm bằng cách nhận xét dòng trước đó (#return (pass);) và bỏ ghi chú 3 dòng tiếp theo
#unset req.http.Https;
#unset req.http.X-Forwarded-Proto;
#unset req.http.Cookie;
}
# Các yêu cầu GraphQL đã xác thực không được lưu vào bộ đệm theo mặc định
if (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
trở về (vượt qua);
}
bỏ đặt req.http.Authorization;
trả lại (băm);
}
phụ vcl_hash {
nếu (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
}
nếu (req.url ~ "/graphql") {
gọi process_graphql_headers;
}
# Để đảm bảo người dùng http không nhìn thấy cảnh báo ssl
nếu (req.http.X-Forwarded-Proto) {
hash_data(req.http.X-Forwarded-Proto);
}
}
quy trình phụ_graphql_headers {
nếu (req.http.Store) {
hash_data(req.http.Store);
}
if (req.http.Content-Tiền tệ) {
hash_data(req.http.Content-Tiền tệ);
}
}
phụ vcl_backend_fetch {
# xác thực với quản trị viên:quản trị viên
đặt bereq.http.Authorization = "ZGV2OmRldg cơ bản ==";
}
phụ vcl_backend_response {
đặt beresp.grace = 3d;
if (beresp.http.content-type ~ "văn bản") {
đặt beresp.do_esi = true;
}
if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") {
đặt beresp.do_gzip = true;
}
nếu (beresp.http.X-Magento-Debug) {
đặt beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
}
# bộ đệm chỉ phản hồi thành công và lỗi 404
if (beresp.status != 200 && beresp.status != 404) {
đặt beresp.ttl = 0s;
đặt beresp.uncacheable = true;
trả lại (giao);
} elsif (beresp.http.Cache-Control ~ "riêng tư") {
đặt beresp.uncacheable = true;
đặt beresp.ttl = 86400s;
trả lại (giao);
}
# xác thực nếu chúng tôi cần lưu vào bộ nhớ cache và ngăn cài đặt cookie
if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) {
bỏ đặt beresp.http.set-cookie;
}
# Nếu trang không thể lưu trong bộ nhớ cache thì bỏ qua véc ni trong 2 phút dưới dạng Hit-For-Pass
nếu (beresp.ttl <= 0s ||
beresp.http.Surrogate-control ~ "no-store" ||
(!beresp.http.Surrogate-Control &&
beresp.http.Cache-Control ~ "no-cache|no-store") ||
beresp.http.Vary == "*") {
# Đánh dấu là Hit-For-Pass trong 2 phút tiếp theo
đặt beresp.ttl = 120s;
đặt beresp.uncacheable = true;
}
trả lại (giao);
}
phụ vcl_deliver {
nếu (resp.http.X-Magento-Debug) {
nếu (resp.http.x-véc ni ~ " ") {
đặt resp.http.X-Magento-Cache-Debug = "HIT";
đặt resp.http.Grace = req.http.grace;
} khác {
đặt resp.http.X-Magento-Cache-Debug = "MISS";
}
} khác {
hủy đặt resp.http.Age;
}
# Không cho phép trình duyệt lưu trữ các tệp không tĩnh.
if (resp.http.Cache-Control !~ "private" && req.url !~ "^/(pub/)?(media|static)/") {
đặt resp.http.Pragma = "no-cache";
đặt resp.http.Expires = "-1";
đặt resp.http.Cache-Control = "no-store, no-cache, must-validate, max-age=0";
}
bỏ đặt resp.http.X-Magento-Debug;
bỏ đặt resp.http.X-Magento-Tags;
bỏ đặt resp.http.X-Powered-By;
bỏ đặt resp.http.Server;
bỏ đặt resp.http.X-Varnish;
hủy đặt resp.http.Via;
bỏ đặt resp.http.Link;
}
phụ vcl_hit {
nếu (obj.ttl >= 0s) {
# Lượt truy cập trong khoảng thời gian TTL
trả lại (giao);
}
if (std.healthy(req.backend_hint)) {
if (obj.ttl + 300s > 0s) {
# Lượt truy cập sau khi hết hạn TTL, nhưng trong thời gian gia hạn
đặt req.http.grace = "bình thường (máy chủ khỏe mạnh)";
trả lại (giao);
} khác {
# Đánh sau TTL và hết hạn gia hạn
trả lại (lấy);
}
} khác {
# máy chủ không khỏe, truy xuất từ bộ đệm
đặt req.http.grace = "không giới hạn (máy chủ không lành mạnh)";
trả lại (giao);
}
}
phụ vcl_synth {
nếu (resp.status == 401) {
đặt resp.status = 401;
đặt resp.http.WWW-Authenticate = "Cơ bản";
trả lại (giao hàng);
}
}