ฉันได้ตั้งค่า nginx เพื่อยุติการเชื่อมต่อ SSL และส่งต่อคำขอไปยังแบ็กเอนด์ http ไคลเอนต์สร้างคำขอพื้นหลังจำนวนหนึ่ง ซึ่งหนึ่งในนั้นล้มเหลวด้วย 400 คำขอไม่ถูกต้อง
เมื่อใดก็ตามที่พยายามเจรจาการเชื่อมต่อ SSL หากไม่จำเป็นต้องเจรจาการเชื่อมต่อ - เช่น หากคำขอพื้นหลังอื่นเพิ่งโพสต์สำเร็จ คำขอนั้นสำเร็จ การตรวจสอบแท็บเครือข่าย Chrome ไม่พบความแตกต่างระหว่างคำขอที่สำเร็จและคำขอที่ล้มเหลว การเดินทางของฉันถูกโพสต์ที่นี่ใน รายงานข้อบกพร่องนี้แต่นี่คือสิ่งที่ฉันกลั่นมาได้จนถึงตอนนี้:
การเชื่อมต่อ SSL
เมื่อคำขอปัญหาสำเร็จ ฉันสามารถบอกได้ว่าไม่จำเป็นต้องเจรจาการเชื่อมต่อ SSL โดยดูที่แท็บเวลาของคำขอเครือข่าย (ใน Chrome): เวลา - คำขอสำเร็จ
ในทางกลับกัน เมื่อใดก็ตามที่คำขอล้มเหลว ฉันเห็นว่าคำขอนั้นพยายามต่อรองการเชื่อมต่อ SSL ดังที่เห็นในภาพนี้: เวลา - คำขอล้มเหลว
การจัดการ Nginx
จากการตรวจสอบบันทึกการเข้าถึงแอปพลิเคชัน ฉันได้พิจารณาแล้วว่าเป็น nginx ที่ส่งคืนไฟล์ 400 คำขอไม่ถูกต้อง
ข้อผิดพลาด และไม่ใช่แอปพลิเคชัน HTTPเมื่อคำขอล้มเหลว บันทึก nginx ทั้งหมดจะเป็นเนื้อความ POST ค่อนข้างมากกว่า วิธี HTTP และ URL ตามปกติ (ฉันยังไม่ได้ปรับแต่งรูปแบบบันทึก nginx)
ฉันเปิดการดีบักในบันทึกข้อผิดพลาด nginx (ด้วยบรรทัด error_log /var/log/nginx/error.log ดีบัก;
). สิ่งนี้ทำให้ฉันเห็นสิ่งที่เกิดขึ้นระหว่างการเจรจา SSL (แม้ว่าฉันจะไม่เข้าใจก็ตาม)
ดังที่ฉันได้กล่าวไว้สั้น ๆ ข้างต้น มีคำขอพื้นหลังอื่น ๆ ที่ประสบความสำเร็จ แม้ว่าจะเรียกใช้น้อยกว่าก็ตาม หลังจากคำขอใดๆ สำเร็จ คำขอทั้งหมดจะสำเร็จในช่วงระยะเวลาหนึ่ง (จนกว่าจะต้องมีการเจรจาการเชื่อมต่อ SSL)
นอกจากนี้ ถ้าฉันใช้ คัดลอกเป็นขด
การทำงานจาก Chrome และเรียกใช้คำขอเป็นคำขอ cURL ก็จะสำเร็จเสมอ ครั้งเดียวที่ฉันสังเกตว่าล้มเหลวคือเมื่อเบราว์เซอร์ส่งคำขอ
บันทึกการดีบัก Nginx
นี่คือบิตที่เกี่ยวข้องจากคำขอ SSL ที่สำเร็จในบันทึก:
22/10/2021 20:37:59 [แก้ปัญหา] 1858722#1858722: *441 ว่าง: 0000562A9F69F340
22/10/2021 20:37:59 [แก้ปัญหา] 1858722#1858722: *438 http คำขออัพสตรีม: "/api/method/frappe.core.doctype.log_settings.log_settings.has_unseen_error_log?"
22/10/2021 20:37:59 [debug] 1858722#1858722: *438 http ส่วนหัวของกระบวนการอัปสตรีม
22/10/2021 20:37:59 [แก้ปัญหา] 1858722#1858722: *438 malloc: 0000562A9F712CB0:131072
22/10/2021 20:37:59 [แก้ปัญหา] 1858722#1858722: *438 recv: eof:0, avail:-1
22/10/2021 20:37:59 [แก้ปัญหา] 1858722#1858722: *438 recv: fd:9 678 จาก 131072
22/10/2021 20:37:59 [แก้ไขข้อบกพร่อง] 1858722#1858722: *438 http สถานะพร็อกซี 200 "200 ตกลง"
22/10/2021 20:37:59 [แก้ไขข้อบกพร่อง] 1858722#1858722: *438 ส่วนหัวของพร็อกซี http: "เซิร์ฟเวอร์: gunicorn"
... ส่วนหัวพร็อกซี http เพิ่มเติม ...
22/10/2021 20:37:59 [debug] 1858722#1858722: *438 http proxy header เสร็จแล้ว
22/10/2021 20:37:59 [debug] 1858722#1858722: *438 xslt filter header
22/10/2021 20:37:59 [แก้ไขข้อบกพร่อง] 1858722#1858722: *438 HTTP/1.1 200 ตกลง
เซิร์ฟเวอร์: nginx/1.18.0 (Ubuntu)
... การตอบสนอง HTTP
นี่คือการเจรจาที่ล้มเหลว:
22/10/2021 20:39:00 [แก้ปัญหา] 1858722#1858722: *446 ว่าง: 0000562A9F69F340
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 http wait ตัวจัดการคำขอ
22/10/2021 20:39:00 [แก้ไขข้อบกพร่อง] 1858722#1858722: *446 malloc: 0000562A9F69F340:1024
22/10/2021 20:39:00 [แก้ปัญหา] 1858722#1858722: *446 SSL_read: 812
22/10/2021 20:39:00 [แก้ปัญหา] 1858722#1858722: *446 SSL_read: -1
22/10/2021 20:39:00 [แก้ปัญหา] 1858722#1858722: *446 SSL_get_error: 2
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 การเชื่อมต่อที่ใช้ซ้ำได้: 0
22/10/2021 20:39:00 [แก้ปัญหา] 1858722#1858722: *446 posix_memalign: 0000562A9F70CEB0:4096 @16
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 http บรรทัดคำขอกระบวนการ
22/10/2021 20:39:00 น. [ข้อมูล] 1858722#1858722: *446 ไคลเอนต์ส่งวิธีที่ไม่ถูกต้องขณะอ่านบรรทัดคำขอไคลเอนต์ ไคลเอ็นต์: 107.185.20.83 เซิร์ฟเวอร์: atlas-dev.ebs.llc คำขอ: "doctype= Error+Log&fields=%5B%22%60tabError+Log%60.%60name%60%22%2C%22%60tabError+Log%60.%60owner%60%22%2C%22%60tabError+Log%60.% 60creation%60%22%2C%22%60tabError+Log%60.%60modified%60%22%2C%22%60tabError+Log%60.%60modified_by%60%22%2C%22%60tabError+Log%60 %60_user_tags%60%22%2C%22%60tabError+Log%60.%60_comments%60%22%2C%22%60tabError+Log%60.%60_assign%60%22%2C%22%60tabError+Log%60 .%60_liked_by%60%22%2C%22%60tabError+Log%60.%60docstatus%60%22%2C%22%60tabError+Log%60.%60parent%60%22%2C%22%60tabError+Log% 60.%60parenttype%60%22%2C%22%60tabError+Log%60.%60parentfield%60%22%2C%22%60tabError+Log%60.%60idx%60%22%2C%22%60tabError+Log %60.%60method%60%22%2C%22%60tabError+Log%60.%60seen%60%22%5D&filters=%5B%5D&order_by=%60tabError+Log%60.%60modified%60+desc&start=0&page_length= 20&view=List&with_comment_count=true"
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 http จบคำขอ: 400, "?" ก:1, ค:1
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 ตัวจับเวลาเหตุการณ์ del: 9:337737968
22/10/2021 20:39:00 [แก้ไขข้อบกพร่อง] 1858722#1858722: *446 http การตอบกลับพิเศษ: 400, "?"
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 http set ทิ้งเนื้อหา
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 xslt filter header
22/10/2021 20:39:00 [debug] 1858722#1858722: *446 HTTP/1.1 400 คำขอไม่ถูกต้อง
เซิร์ฟเวอร์: nginx/1.18.0 (Ubuntu)
วันที่: ศุกร์ 22 ต.ค. 2564 20:39:00 GMT
ประเภทเนื้อหา: text/html
ความยาวเนื้อหา: 166
การเชื่อมต่อ: ปิด
จากสิ่งที่ฉันรู้เพียงเล็กน้อยเกี่ยวกับบันทึกการดีบัก nginx (เช่น ไม่มีอะไรเลย) สำหรับฉันแล้ว ดูเหมือนว่า nginx จะสลับเมธอด HTTP และ url สำหรับเนื้อหาในระหว่างการเจรจา เมื่อค้นหาเมธอด HTTP จะไม่มีอยู่อีกต่อไป และหยุดทำงาน
การกำหนดค่า SSL ของ Nginx
ข้อมูลเวอร์ชัน: nginx/1.18.0 (อูบุนตู)
, อูบุนตู 20.04 LTS
ฉันใช้ค่าเริ่มต้น nginx.conf
. ส่วน SSL ของเซิร์ฟเวอร์ conf มีลักษณะดังนี้:
ฟัง 443 ssl;
ชื่อเซิร์ฟเวอร์ [โฮสต์];
รูท /opt/erpnext/bench/sites;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
ssl_certificate /etc/letsencrypt/live/[โฮสต์]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[โฮสต์]/privkey.pem;
ssl_session_timeout 5 นาที;
ssl_session_cache ที่ใช้ร่วมกัน: SSL:10m;
ปิด ssl_session_tickets;
เปิด ssl_stapling;
เปิด ssl_stapling_verify;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
เปิด ssl_prefer_server_ciphers;
มีการเปลี่ยนเส้นทาง SSL ที่ด้านล่างของไฟล์ และ nginx ได้รับการตั้งค่าให้เซิร์ฟเวอร์เว็บเซิร์ฟเวอร์ HTTP ที่ใช้ไฟล์แบนบนพอร์ต 8080 จากการกำหนดค่าอื่น
ฉันจะทราบได้อย่างไรว่าอะไรเป็นสาเหตุของปัญหา ฉันรู้ว่าคำขอถูกสร้างขึ้นอย่างถูกต้อง เนื่องจากคำขอที่เหมือนกันสำเร็จ... จนกว่าจะต้องมีการเจรจาการเชื่อมต่อ SSL ช่วย?