Score:0

บางครั้งวานิช (มากถึง ~ 5% ของคำขอ) ทริกเกอร์ err_too_many_redirects ทำงานในนักเทียบท่ารวมกับ plesk สำหรับ wordpress

ธง tf

เราได้ทำตามคำแนะนำเหล่านี้แล้ว https://support.plesk.com/hc/en-us/articles/115001888894-Does-Plesk-support-Varnish- และสามารถทำให้มันทำงานได้ 'ถูกต้อง' มันให้บริการเว็บไซต์ wordpress ผ่านการเคลือบเงาและความเร็วนั้นยอดเยี่ยมมาก ทุกอย่างดีและดี แต่หุ่นยนต์เวลาทำงานของเรารายงานเวลาหยุดทำงานสั้นๆ เป็นระยะๆ (ไม่สม่ำเสมอมาก แต่ระหว่าง 1 ถึง 8 ครั้งต่อวันเป็นระยะเวลา <5 นาที ในช่วงเวลาต่างๆ ตลอดทั้งวัน)

หลังจากการทดสอบต่างๆ เราพบปัญหากับ wp-admin url เราจึงสรุปได้ว่าสิ่งนี้เกิดขึ้นเนื่องจาก DirectoryIndex ของเรา (ซึ่งเป็น index.html โดยค่าเริ่มต้น) เราได้แก้ไขปัญหานี้โดยเพิ่ม 'DirectoryIndex index.php ' ไปที่ 'คำสั่ง Apache เพิ่มเติม' ซึ่งแก้ไขปัญหานั้น

สิ่งหนึ่งที่น่าสนใจสำหรับเราคือเมื่อเราเปลี่ยนวิธีการให้บริการ PHP (FPM) จะมีผลกับข้อผิดพลาดเดียวกัน เมื่อเราให้บริการผ่าน NGINX เราจะได้รับ err_too_many_redirects เช่นกัน หากเราให้บริการผ่าน Apache จะใช้งานได้ 95% ของเวลาทั้งหมด

ฉันได้เพิ่มการบันทึก (varnishncsa) ด้านล่างเมื่อการตอบกลับส่วนหัวระบุ 301 นั่นคือเมื่อเราอยู่ในลูป:

172.17.0.1 - - [11/Jan/2022:13:54:55 +0000] "HEAD http://[โดเมนวานิช]/ HTTP/1.0" 200 0 "https://[โดเมนวานิช]" " Mozilla/5.0+ (เข้ากันได้; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

172.17.0.1 - - [11/Jan/2022:13:56:51 +0000] "GET http://[โดเมนวานิช]/ HTTP/1.0" 200 11184 "-" "-"

172.17.0.1 - - [11/Jan/2022:13:58:31 +0000] "HEAD http://[โดเมนวานิช]/ HTTP/1.0" 301 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/56.0.2924.76 Safari/537.36"

172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] "HEAD http://[โดเมนวานิช]/ HTTP/1.0" 301 0 "http://[โดเมนวานิช]" " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/56.0.2924.76 Safari/537.36"

หลังจากนี้ เราบันทึกต่อไปนี้ 8 ครั้ง: 172.17.0.1 - - [11/Jan/2022:13:58:32 +0000] "HEAD http://[โดเมนวานิช]/ HTTP/1.0" 301 0 "https://[โดเมนวานิช]/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/56.0.2924.76 Safari/537.36"

จากนั้นหนึ่ง: 172.17.0.1 - - [11/Jan/2022:13:58:34 +0000] "GET http://[โดเมนวานิช]/ HTTP/1.0" 301 238 "-" "Mozilla/5.0 (X11; Linux x86_64 ) AppleWebKit/537.36 (KHTML เช่น Gecko) HeadlessChrome/96.0.4664.110 Safari/537.36"

จากนั้น 7 ครั้ง: 172.17.0.1 - - [11/Jan/2022:13:59:55 +0000] "HEAD http://[โดเมนวานิช]/ HTTP/1.0" 301 0 "https://[โดเมนวานิช]" " Mozilla/5.0+ (เข้ากันได้; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

จากนั้น 22 ครั้ง: 172.17.0.1 - - [11/Jan/2022:14:00:17 +0000] "GET http://[โดเมนวานิช]/ HTTP/1.0" 301 238 "https://[โดเมนวานิช]" " Mozilla/5.0+ (เข้ากันได้; UptimeRobot/2.0; http://www.[uptimerobot].com/)"

หลังจากนั้นทุกอย่างก็ดูดีอีกครั้ง

อัปเดต: ตรวจสอบบันทึก

@thijs-feryn ชี้ให้เห็นบางสิ่งที่น่าสนใจ ซึ่งทำให้เราสรุปได้ว่าเราเลิกสนใจทฤษฎีเก่าเร็วเกินไป เนื่องจากเรารู้สึกแน่ใจว่า X-Forwarded-Proto ถูกส่งต่อไป เพราะมันอยู่ใน 'การกำหนดค่าส่วนหัว apache เพิ่มเติม' ของเรา

อย่างไรก็ตาม หลังจากอ่านคำตอบของเขาอย่างระมัดระวัง เราได้เรียนรู้ว่า X-Forwarded-Proto ไม่ผ่านทุกคำขอ (อย่างน้อยก็ไม่ใช่ในคำขอที่เสียหาย) เขาชี้ให้เห็นว่า [โดเมนวานิชอื่น] ดูเหมือนจะผ่านบันทึกนี้ได้ดีในคำขอที่คล้ายกัน

หลังจากเปรียบเทียบการกำหนดค่าอย่างระมัดระวังแล้ว มีสิ่งหนึ่งที่โดดเด่นสำหรับเรา นั่นคือโดเมนที่ต้องการใน plesk สำหรับ [โดเมนวานิชอื่น] ถูกตั้งค่าเป็น 'ไม่มี' และสำหรับ [โดเมนวานิช] ถูกตั้งค่าเป็น [วานิช โดเมน].

ดังนั้นเราจึงไปที่ www.[โดเมนวานิช] ในเบราว์เซอร์ของเรา และนั่นดูเหมือนจะทำให้เกิดปัญหา เราเปลี่ยน 'โดเมนที่ต้องการ' เป็น 'ไม่มี' ที่นี่เช่นกัน และตอนนี้ www.[โดเมนเคลือบเงา] เปลี่ยนเส้นทางไปยัง [โดเมนเคลือบเงา] ก็ไม่เป็นไร

สมมติฐาน

ดูเหมือนว่าการเปลี่ยนเส้นทางของ plesk จะไม่สนใจ 'คำสั่งเพิ่มเติมสำหรับ HTTP' และ ดังนั้นจึงไม่ได้เพิ่ม 'Vary: X-Forwarded-Proto'. เราจะติดตามเรื่องนี้และจะโพสต์อัปเดตในเร็วๆ นี้ เมื่อเรามั่นใจเต็มที่ว่านี่คือสาเหตุ

Score:0
ธง in

ปัญหาอาจเกี่ยวข้องกับการขาดการรับรู้ของโปรโตคอลเมื่อพูดถึงการแคช เป็นเรื่องปกติที่คำขอ HTTP ที่ควรเปลี่ยนเส้นทางไปยังคำขอ HTTPS จะจบลงในแคช ซึ่งเปลี่ยนเส้นทางผู้ใช้ไปยังเวอร์ชัน HTTPS อย่างไม่มีเงื่อนไข แม้ว่าผู้ใช้จะร้องขอเวอร์ชัน HTTPS ก็ตาม

มีหลายวิธีในการแก้ไขปัญหานี้ ขึ้นอยู่กับประเภทของเว็บเซิร์ฟเวอร์ที่คุณใช้

เอาต์พุตวานิชล็อก

แต่ก่อนที่เราจะข้ามไปสู่ข้อสรุป ฉันต้องการเห็นบางอย่าง วานิชล็อก เอาต์พุต

ฉันต้องการเห็นผลลัพธ์ของคำสั่งต่อไปนี้เมื่อเกิด redirect loop:

varnishlog -g คำขอ -q "ReqUrl eq '/'"

ข้อสันนิษฐานคือปัญหาเกิดขึ้นในหน้าแรกที่เราเพิ่มเป็นแบบสอบถาม VSL ไปยัง วานิชล็อก สั่งการ.

ฉันสังเกตเห็นคุณ เคลือบเงา เอาต์พุต แต่น่าเสียดายที่มันจำกัดเกินไปในแง่ของเอาต์พุต วานิชล็อก ดีกว่ามากสำหรับการดีบักในขณะที่ เคลือบเงา เป็นเพียง

การทดสอบสมมติฐาน

หากการวนซ้ำการเปลี่ยนเส้นทางเกิดจากการขาดการรับรู้ของโปรโตคอล เราสามารถทำให้เกิดปัญหาได้ดังนี้:

  • วิ่ง varnishadm ห้าม obj.status "!=" 0 เพื่อล้างแคช
  • เรียกใช้ HTTP URL ธรรมดาของเว็บไซต์เพื่อให้แน่ใจว่าเวอร์ชันนี้ถูกแคชไว้
  • โทร HTTPS URL ของเว็บไซต์เพื่อตรวจสอบว่าคุณติดอยู่ในลูปเปลี่ยนเส้นทางหรือไม่

แก้ไขปัญหา

หากการทดสอบทั้งหมดรวมกันและสมมติฐานได้รับการพิสูจน์ การแก้ปัญหานั้นค่อนข้างง่าย

หากคุณใช้ Apache เป็นเว็บเซิร์ฟเวอร์ คุณสามารถเพิ่มเนื้อหาต่อไปนี้ลงใน .htaccess ไฟล์:

SetEnvIf X-Forwarded-Proto "https" HTTPS=on
ส่วนหัวต่อท้าย Vary: X-Forwarded-Proto

มิฉะนั้น คุณสามารถเพิ่มรหัสต่อไปนี้ในไฟล์ VCL ของคุณ:

ย่อย vcl_backend_response {
    ถ้า (beresp.http.Vary) {
        ถ้า (beresp.http.Vary !~ "X-Forwarded-Proto") {
            ตั้ง beresp.http.Vary = ตั้ง beresp.http.Vary + ", X-Forwarded-Proto";
        }
    } อื่น {
        ตั้ง beresp.http.Vary = "X-Forwarded-Proto";
    }
}

การเพิ่ม X-ส่งต่อโปรโต ไปที่ ต่างกันไป ส่วนหัวจะทำให้แน่ใจว่าวานิชสร้างวัตถุแยกกันในแคชสำหรับ HTTP และ HTTPS

ฉันยังถือว่าพร็อกซี TLS ของคุณส่งไฟล์ X-ส่งต่อโปรโต หัวข้อ.

อัปเดต: ตรวจสอบบันทึก

หลังจากแสดงความคิดเห็นกลับไปกลับมา ฉันได้รับบันทึกเชิงลึกผ่านทาง https://pastebin.com/QzPh1r5R ที่อธิบายสิ่งที่เกิดขึ้น

ใน ** << BeReq >> 951078 คุณสามารถดู X-ส่งต่อโปรโต: http หัวข้อ. ซึ่งหมายความว่าคำขอถูกส่งผ่านคำขอ HTTP ธรรมดา คำขอประเภทนี้ควรส่งผลให้มีการเปลี่ยนเส้นทาง 301 และดำเนินการตามบรรทัดบันทึกต่อไปนี้:

-- Berespโปรโตคอล HTTP/1.1
-- BerespStatus 301
-- BerespReason ย้ายอย่างถาวร
-- BerespHeader วันที่: พฤ. 13 ม.ค. 2565 08:55:17 น. GMT
-- เซิร์ฟเวอร์ BerespHeader: Apache
-- ตำแหน่ง BerespHeader: https://[โดเมนวานิช]/
-- ความยาวของเนื้อหา BerespHeader: 238
-- ประเภทเนื้อหา BerespHeader: text/html; ชุดอักขระ=iso-8859-1
-- TTL RFC 120 10 0 1642064118 1642064118 1642064117 0 0 แคชได้

การเปลี่ยนเส้นทางไม่เพียงเกิดขึ้นเท่านั้น แต่ยังได้รับการแคชเป็นเวลา 120 วินาทีอีกด้วย นอกจากนี้ยังน่าสนใจที่จะเห็นว่าไม่มี ต่างกันไป: X-Forwarded-Proto หัวข้อ.

ในเวลาต่อมา พ * << ขอ >> 951080 ธุรกรรมปรากฏขึ้นในบันทึก เราเห็นส่วนหัวของคำขอต่อไปนี้:

- ReqHeader X-Forwarded-Proto: https
- ReqHeader Host: [โดเมนวานิชอื่น]

ดังนั้นนี่คือคำขอ HTTPS สำหรับโดเมน Varnish อื่น และด้วยเหตุผลบางอย่าง ส่งผลให้เกิดการเข้าชมแคชที่ส่งคืน a ต่างกันไป หัวข้อ:

- RespHeader แตกต่างกันไป: ยอมรับการเข้ารหัส, คุกกี้, X-Forwarded-Proto
- VCL_call HIT
- กด 886585 90003.966201 10.000000 0.000000

ไม่เพียงแต่คุณเห็นการเข้าชม คุณยังสามารถสรุปได้ว่าวัตถุนั้นถูกแทรกในแคชโดยธุรกรรม 886585.

แม้ว่าจะเป็นการดีที่จะมี ต่างกันไป ส่วนหัวอันนี้ประกอบด้วย คุกกี้ ค่าที่เป็นอันตรายซึ่งหมายความว่าวัตถุแยกต่างหากจะถูกเก็บไว้ในแคชสำหรับทุกค่าคุกกี้ที่เป็นไปได้ซึ่งแสดงต่อวานิช สิ่งนี้ค่อนข้างอันตราย ดังนั้นโปรดลบออก คุกกี้ จาก ต่างกันไป ส่วนหัวและติดกับ แตกต่างกันไป: ยอมรับการเข้ารหัส, X-Forwarded-Proto.

ธุรกรรมล่าสุดที่ฉันดูคือ * << ขอ >> 951082. มันมี X-ส่งต่อโปรโต: https ส่วนหัวของคำขอและไม่ควรส่งผลให้เกิดการเปลี่ยนเส้นทาง 301 แต่น่าเสียดายที่เป็นเช่นนั้น

เดอะ ตี แท็กเปิดเผยข้อมูลที่น่าสนใจ:

- กด 951078 82.391648 10.000000 0.000000

ออบเจกต์ที่ถูกโจมตีแต่เดิมถูกแทรกในแคชโดยธุรกรรม 951078. หากคุณให้ความสนใจอย่างใกล้ชิด นั่นคือสิ่งแรกที่เรากล่าวถึง ธุรกรรมนี้เป็นธุรกรรม HTTP เท่านั้นที่ส่งผลให้เกิดการเปลี่ยนเส้นทาง 301

และนั่นคือวัตถุที่ส่งคืน ดังนั้น แม้ว่าคุณจะร้องขอเนื้อหา HTTPS คุณก็ยังถูกเปลี่ยนเส้นทางและนั่นคือวิธีที่คุณลงเอยด้วยการวนซ้ำไม่รู้จบ

หากคุณดูการตอบสนองที่ส่งกลับโดยธุรกรรม 951082คุณไม่เห็น ต่างกันไป หัวข้อ:

- โปรโตคอลการตอบสนอง HTTP/1.1
- สถานะตอบกลับ 301
- RespReason ย้ายอย่างถาวร
- วันที่ตอบกลับ: พฤ. 13 ม.ค. 2565 08:55:17 น. GMT
- เซิร์ฟเวอร์ RespHeader: Apache
- ตำแหน่ง RespHeader: https://[โดเมนวานิช]/
- ความยาวเนื้อหา RespHeader: 238
- ประเภทเนื้อหา RespHeader: text/html; ชุดอักขระ=iso-8859-1
- RespHeader X-วานิช: 951082 951078
- อายุหัวหน้าทีม: 37
- RespHeader ผ่าน: 1.1 วานิช (วานิช/7.0)

บทสรุป: กรุณาตรวจสอบให้แน่ใจว่า X-ส่งต่อโปรโต ถูกเพิ่มเข้าไปในของคุณ ต่างกันไป หัวข้อ. มันจะป้องกันการติดอยู่ในวงเปลี่ยนเส้นทาง

tf flag
ก่อนอื่น ขอขอบคุณสำหรับการตอบกลับโดยละเอียดของคุณ ฉันได้ลองทำตามขั้นตอนที่อธิบายไว้ใน 'การทดสอบสมมติฐาน' และสร้างบันทึกของการทดสอบนั้นโดยใช้ varnishlog (ฉันได้อัปโหลดบันทึก https://pastebin.com/hxtp8gX9) ฉันเข้าสู่ระบบผ่าน varnishlog อย่างต่อเนื่องตามที่คุณอธิบายไว้ และฉันจะโพสต์บันทึกเมื่อเกิดปัญหาขึ้น >SetEnvIf X-Forwarded-Proto "https" HTTPS=on ส่วนหัวต่อท้าย Vary: X-Forwarded-Proto อยู่ใน 'การกำหนดค่า apache เพิ่มเติม' ของฉัน ซึ่งโดยพื้นฐานแล้วจะเหมือนกับการเพิ่มลงในไฟล์ .htaccess
Thijs Feryn avatar
in flag
@RemcovanGrinsven ให้ฉันโพสต์ Remco ตั้งหน้าตั้งตารอการบันทึกที่เหมาะสมเมื่อมีสิ่งผิดปกติเกิดขึ้น
tf flag
ขอบคุณสำหรับความสนใจของคุณฉันสามารถบันทึกช่วงเวลาหนึ่งของการหยุดทำงานใน varnishlog สามารถดูบันทึกฉบับย่อได้ที่นี่: https://pastebin.com/QzPh1r5R ฉันได้อัปโหลดบันทึกแบบเต็มแล้ว https://we.tl/t-wDfhPo57in (หากคุณต้องการไซต์อื่น เราจะอัปโหลดที่นั่น) แต่นั่นเป็นการบันทึกจำนวนมาก รอคอยที่จะได้ยินความคิดเห็นของคุณ
Thijs Feryn avatar
in flag
@RemcovanGrinsven ฉันคิดว่าฉันพบแล้ว ฉันอัปเดตคำตอบและเพิ่มข้อสรุปของฉัน ลองดู
tf flag
ขอบคุณมากสำหรับการป้อนข้อมูลของคุณ จากการป้อนข้อมูลของคุณ เราสามารถพบสิ่งที่น่าสงสัยได้ ขณะนี้เรากำลังทดสอบวิธีแก้ปัญหาที่เป็นไปได้ (ฉันได้อัปเดตโพสต์ต้นฉบับของเราเพื่อดูรายละเอียดเพิ่มเติม)
tf flag
ปัญหานี้ไม่ได้เกิดขึ้นตลอดช่วงสุดสัปดาห์ที่ผ่านมา นั่นอาจเป็นเรื่องบังเอิญอย่างมาก หรือไม่ก็สรุปได้อย่างปลอดภัยว่าปัญหาได้รับการแก้ไขแล้วในตอนนี้ ฉันจะยอมรับข้อมูลของคุณเพื่อเป็นทางออกสำหรับคนอื่นๆ ที่อาจมีบางอย่างที่คล้ายกัน ข้อมูลของคุณนั้นลึกซึ้งมาก!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา