ฉันจะเชื่อมต่อคอนเทนเนอร์วานิชกับคอนเทนเนอร์ PHP-FPM + NGINX ได้อย่างไร
นักเทียบท่าเริ่มต้นอย่างถูกต้อง ไซต์ใช้งานได้ แต่บันทึกแบ็กเอนด์เปิดว่างเปล่า
แบ็กเอนด์ทำงานได้ดี (ส่งคืนสถานะ HTTP 200)
varnishlog -g ดิบ -i Backend_health
0 Backend_health - ค่าดีฟอลต์ยังคงปกติ 4---X-RH 7 5 10 0.048069 0.065633 "HTTP/1.1 200 ตกลง"
จากคอนเทนเนอร์ http (nginx) ฉันเห็นคำขอในบันทึกนักเทียบท่า
บันทึกนักเทียบท่า http
[10/ก.ย./2021:17:24:01 +0000] "GET /health_check.php HTTP/1.1" 200 5 "-" "-"
แต่การเชื่อมต่อแบ็กเอนด์ไม่เปิดการเชื่อมต่อ บันทึกว่างเปล่า ตรวจสอบผ่าน: varnishlog -i แบ็กเอนด์เปิด สั่งการ.
ฉันได้ลองวิธีแก้ปัญหาจากไซต์นี้แล้ว แต่ไม่ได้ผล: Php+Nginx+วานิชบน docker-compose, ubuntu18.
นักเทียบท่า-compose.yml
http:
สร้าง:
บริบท: นักเทียบท่า/http
ชื่อคอนเทนเนอร์: http
พอร์ต:
- 80:80
- 443:443
ขึ้นอยู่กับ:
- php
ปริมาณ:
- ./project:/var/www/project
php:
สร้าง:
บริบท: นักเทียบท่า/php.ini
ชื่อคอนเทนเนอร์: php.ini
working_dir: /var/www/project
ปริมาณ:
- ./project:/var/www/project
วานิช:
สร้าง:
บริบท: นักเทียบท่า/วานิช
container_name: วานิช
พอร์ต:
- 6081:6081
- 6082:6082
การกำหนดค่า VCL:
vcl 4.0;
นำเข้ามาตรฐาน;
แบ็กเอนด์เริ่มต้น {
.host = "http";
.port = "80";
.first_byte_timeout = 600s;
.probe = {
#.url = "/health_check.php";
.request =
"รับ /health_check.php HTTP/1.1"
"โฮสต์: http"
"การเชื่อมต่อ: ปิด";
.timeout = 2 วินาที;
.interval = 5 วินาที;
.window = 10;
.threshold = 5;
}
}
ล้าง acl {
"http";
}
ย่อย vcl_recv {
ถ้า (req.restarts > 0) {
ตั้ง req.hash_always_miss = จริง;
}
ถ้า (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") {
กลับ (ผ่าน);
}
กลับ (แฮช);
}
ย่อย vcl_hash {
ถ้า (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
}
# เพื่อให้แน่ใจว่าผู้ใช้ http ไม่เห็นคำเตือน ssl
ถ้า (req.http.X-Forwarded-Proto) {
hash_data (req.http.X-Forwarded-Proto);
}
ถ้า (req.url ~ "/graphql") {
เรียก process_graphql_headers;
}
}
กระบวนการย่อย_graphql_headers {
ถ้า (req.http.Store) {
hash_data (req.http.Store);
}
ถ้า (req.http.Content-Currency) {
hash_data (req.http.Content-Currency);
}
}
ย่อย 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 = "ไม่จำกัด (เซิร์ฟเวอร์ไม่แข็งแรง)";
ส่งคืน (ส่งมอบ);
}
}