ฉันได้พยายามกำหนดค่าวานิชบนเซิร์ฟเวอร์ที่มีการรับรองความถูกต้องเบื้องต้นโดยใช้วิธีแก้ไขปัญหาเหล่านี้:
แต่มันไม่ได้ช่วย
บันทึกการเคลือบเงายังคงแสดงข้อผิดพลาด 401:
varnishlog -g ดิบ -i Backend_health
0 Backend_health - mag2.default ยังคงป่วย 4--X-R- 0 5 10 0.001574 0.000000 HTTP/1.1 401 ไม่ได้รับอนุญาต
My Varnish config (เวอร์ชัน 4.0):
vcl 4.0;
นำเข้ามาตรฐาน;
# เวอร์ชันวานิชขั้นต่ำคือ 4.0
# สำหรับการถ่าย SSL ให้ส่งส่วนหัวต่อไปนี้ในพร็อกซีเซิร์ฟเวอร์หรือโหลดบาลานซ์ของคุณ: 'X-Forwarded-Proto: https'
แบ็กเอนด์เริ่มต้น {
.host = "127.0.0.1";
.port = "8080";
.first_byte_timeout = 600s;
.probe = {
.url = "/health_check.php";
.timeout = 2 วินาที;
.interval = 5 วินาที;
.window = 10;
.threshold = 5;
}
}
ล้าง acl {
"โลคอลโฮสต์";
}
ย่อย vcl_recv {
ถ้า (! req.http.Authorization ~ "พื้นฐาน ZGV2OmRldg = ") {
กลับ (สังเคราะห์ (401, "ถูก จำกัด "));
}
ถ้า (req.method == "PURGE") {
ถ้า (client.ip !~ ล้าง) {
กลับ (synth (405, "วิธีการที่ไม่ได้รับอนุญาต"));
}
# หากต้องการใช้ส่วนหัว X-Pool เพื่อล้างสารเคลือบเงาในระหว่างการปรับใช้อัตโนมัติ ตรวจสอบให้แน่ใจว่าส่วนหัวของ X-Pool
# ถูกเพิ่มในการตอบกลับในการกำหนดค่าเซิร์ฟเวอร์ส่วนหลังของคุณ ตัวอย่างเช่นสิ่งนี้ใช้โดย the
# capistrano-magento2 gem สำหรับการล้างเนื้อหาเก่าออกจากสารเคลือบเงาในระหว่างการปรับใช้รูทีน
ถ้า (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
กลับ (synth (400, "X-Magento-Tags-Pattern หรือ X-Pool header ต้องการ"));
}
ถ้า (req.http.X-Magento-Tags-Pattern) {
ห้าม ("obj.http.X-Magento-Tags ~" + req.http.X-Magento-Tags-Pattern);
}
ถ้า (req.http.X-Pool) {
ห้าม ("obj.http.X-Pool ~" + req.http.X-Pool);
}
กลับ (synth (200, "Purged"));
}
ถ้า (req.method != "GET" &&
req.method != "หัว" &&
req.method != "ใส่" &&
req.method != "โพสต์" &&
req.method != "ติดตาม" &&
req.method != "ตัวเลือก" &&
req.method != "ลบ") {
/* ไม่ใช่ RFC2616 หรือ CONNECT ซึ่งแปลก */
กลับ (ท่อ);
}
# เราจัดการกับ GET และ HEAD ตามค่าเริ่มต้นเท่านั้น
ถ้า (req.method != "GET" && req.method != "HEAD") {
กลับ (ผ่าน);
}
# บายพาสตะกร้าสินค้าและชำระเงิน
ถ้า (req.url ~ "/checkout") {
กลับ (ผ่าน);
}
# ข้ามคำขอตรวจสุขภาพ
ถ้า (req.url ~ "/pub/health_check.php") {
กลับ (ผ่าน);
}
# ตั้งค่าสถานะการใช้งานระยะเวลาผ่อนผันเริ่มต้น
กำหนด req.http.grace = "ไม่มี";
# ทำให้ URL เป็นมาตรฐานในกรณีของโครงร่าง HTTP และโดเมนชั้นนำ
ตั้ง req.url = regsub(req.url, "^http[s]?://", "");
# รวบรวมคุกกี้ทั้งหมด
std.collect (req.http.Cookie);
#ตัวกรองการบีบอัด ดู https://www.varnish-cache.org/trac/wiki/FAQ/Compression
ถ้า (req.http.Accept-Encoding) {
ถ้า (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
#ไม่มีประเด็นในการบีบอัดสิ่งเหล่านี้
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
ตั้ง req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
ตั้ง req.http.Accept-Encoding = "deflate";
} อื่น {
# อัลกอริทึมที่ไม่รู้จัก
unset req.http.Accept-Encoding;
}
}
# ลบพารามิเตอร์รับการตลาดทั้งหมดเพื่อลดวัตถุแคช
if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=" ) {
set 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+()%.]+&?", "");
ตั้ง req.url = regsub(req.url, "[?|&]+$", "");
}
# แคชไฟล์คงที่
ถ้า (req.url ~ "^/(pub/)?(สื่อ|คงที่)/") {
# ไม่ควรแคชไฟล์สแตติกเป็นค่าเริ่มต้น
กลับ (ผ่าน);
# แต่ถ้าคุณใช้โลแคลไม่กี่แห่งและไม่ได้ใช้ CDN คุณสามารถเปิดใช้งานการแคชไฟล์สแตติกได้โดยการแสดงความคิดเห็นในบรรทัดก่อนหน้า (#return (pass);) และยกเลิกการแสดงความคิดเห็นใน 3 บรรทัดถัดไป
#unset req.http.Https;
#unset req.http.X-Forwarded-Proto;
#unset req.http.Cookie;
}
# คำขอ GraphQL ที่รับรองความถูกต้องไม่ควรถูกแคชโดยค่าเริ่มต้น
ถ้า (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
กลับ (ผ่าน);
}
unset req.http.Authorization;
กลับ (แฮช);
}
ย่อย vcl_hash {
ถ้า (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
}
ถ้า (req.url ~ "/graphql") {
เรียก process_graphql_headers;
}
# เพื่อให้แน่ใจว่าผู้ใช้ http ไม่เห็นคำเตือน ssl
ถ้า (req.http.X-Forwarded-Proto) {
hash_data (req.http.X-Forwarded-Proto);
}
}
กระบวนการย่อย_graphql_headers {
ถ้า (req.http.Store) {
hash_data (req.http.Store);
}
ถ้า (req.http.Content-Currency) {
hash_data (req.http.Content-Currency);
}
}
ย่อย vcl_backend_fetch {
# รับรองความถูกต้องกับผู้ดูแลระบบ:ผู้ดูแลระบบ
ตั้ง bereq.http.Authorization = "พื้นฐาน ZGV2OmRldg==";
}
ย่อย vcl_backend_response {
ตั้ง beresp.grace = 3d;
ถ้า (beresp.http.content-type ~ "ข้อความ") {
ตั้ง beresp.do_esi = จริง;
}
ถ้า (bereq.url ~ "\.js$" || beresp.http.content-type ~ "ข้อความ") {
ตั้ง beresp.do_gzip = จริง;
}
ถ้า (beresp.http.X-Magento-Debug) {
ตั้ง beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
}
# แคชตอบสนองสำเร็จและ 404 เท่านั้น
ถ้า (beresp.status != 200 && beresp.status != 404) {
ตั้ง beresp.ttl = 0s;
ตั้ง beresp.uncacheable = จริง;
ส่งคืน (ส่งมอบ);
} elsif (beresp.http.Cache-Control ~ "ส่วนตัว") {
ตั้ง beresp.uncacheable = จริง;
ตั้ง beresp.ttl = 86400s;
ส่งคืน (ส่งมอบ);
}
# ตรวจสอบว่าเราจำเป็นต้องแคชและป้องกันไม่ให้ตั้งค่าคุกกี้
ถ้า (beresp.ttl > 0 วินาที && (bereq.method == "GET" || bereq.method == "HEAD")) {
ยกเลิกการตั้งค่า beresp.http.set-cookie;
}
# หากเพจไม่สามารถแคชได้ ให้ข้ามการเคลือบเงาเป็นเวลา 2 นาทีเป็น Hit-For-Pass
ถ้า (beresp.ttl <= 0s ||
beresp.http.Surrogate-control ~ "ไม่มีร้านค้า" ||
(!beresp.http.Surrogate-ควบคุม &&
beresp.http.Cache-Control ~ "ไม่มีแคช|ไม่มีที่เก็บ") ||
beresp.http.Vary == "*") {
# ทำเครื่องหมายเป็น Hit-For-Pass ในอีก 2 นาทีข้างหน้า
ตั้ง beresp.ttl = 120s;
ตั้ง beresp.uncacheable = จริง;
}
ส่งคืน (ส่งมอบ);
}
ย่อย vcl_deliver {
ถ้า (resp.http.X-Magento-Debug) {
ถ้า (resp.http.x-วานิช ~ " ") {
ตั้งค่า resp.http.X-Magento-Cache-Debug = "HIT";
ตั้ง resp.http.Grace = req.http.grace;
} อื่น {
ตั้งค่า resp.http.X-Magento-Cache-Debug = "MISS";
}
} อื่น {
ยกเลิกการตั้งค่า resp.http.Age;
}
# ไม่ให้เบราว์เซอร์แคชไฟล์ที่ไม่คงที่
ถ้า (resp.http.Cache-Control !~ "private" && req.url !~ "^/(pub/)?(media|static)/") {
ตั้ง resp.http.Pragma = "ไม่มีแคช";
ตั้ง resp.http.Expires = "-1";
ตั้งค่า resp.http.Cache-Control = "ไม่มีที่เก็บ, ไม่มีแคช, ต้องตรวจสอบความถูกต้องใหม่, max-age=0";
}
ยกเลิกการตั้งค่า resp.http.X-Magento-Debug;
ยกเลิกการตั้งค่า resp.http.X-Magento-Tags;
ยกเลิกการตั้งค่า resp.http.X-Powered-By;
ยกเลิกการตั้งค่า resp.http.Server;
unset resp.http.X-วานิช;
unset resp.http.Via;
ยกเลิกการตั้งค่า resp.http.Link;
}
ย่อย vcl_hit {
ถ้า (obj.ttl >= 0 วินาที) {
# เข้าชมภายในระยะเวลา TTL
ส่งคืน (ส่งมอบ);
}
ถ้า (std.healthy(req.backend_hint)) {
ถ้า (obj.ttl + 300s > 0s) {
# เข้าชมหลังจาก TTL หมดอายุ แต่อยู่ในระยะเวลาผ่อนผัน
ตั้ง req.http.grace = "ปกติ (เซิร์ฟเวอร์ปกติ)";
ส่งคืน (ส่งมอบ);
} อื่น {
# เข้าชมหลังจาก TTL และวันหมดอายุ
กลับ (ดึง);
}
} อื่น {
# เซิร์ฟเวอร์ไม่แข็งแรง เรียกคืนจากแคช
กำหนด req.http.grace = "ไม่จำกัด (เซิร์ฟเวอร์ไม่แข็งแรง)";
ส่งคืน (ส่งมอบ);
}
}
ย่อย vcl_synth {
ถ้า (resp.status == 401) {
ตั้ง resp.status = 401;
ตั้ง resp.http.WWW-Authenticate = "พื้นฐาน";
ส่งคืน (ส่งมอบ);
}
}