รักษาการเชื่อมต่อ SSL ให้ใช้งานได้ระหว่าง reverse proxy และ backend server

Aug 19 2020

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

แวบแรกมันใช้งานได้อย่างมีเสน่ห์ ไฟล์สแตติกที่แคชไว้จะให้บริการเร็วมาก แต่สำหรับสิ่งอื่น ๆ reverse proxy (NGINX) จำเป็นต้องเชื่อมต่อกับเซิร์ฟเวอร์ส่วนหลังซึ่งใช้เวลาพอสมควรในการจับมือ SSL ทำให้คำขอแรกเหล่านี้ช้า

ฉันกำลังค้นหาข้อมูลเกี่ยวกับเรื่องนี้ แต่ไม่พบวิธีที่จะรักษาความสัมพันธ์นี้ไว้ได้ มีวิธีทำไหม?

ฉันพยายามเรียนรู้เพิ่มเติมเกี่ยวกับ websockets ด้วยซ้ำ แต่การใช้งานทั้งหมดที่ฉันพบคือการตอบสนองคำขอเฉพาะไม่ใช่เพื่อให้การเชื่อมต่อเป็นตัวกลางระหว่างเว็บเซิร์ฟเวอร์ทั้งสอง (NGINX ที่ reverse proxy และ Apache ที่แบ็คเอนด์)

คุณมีความคิดหรือคำแนะนำเกี่ยวกับสิ่งที่ต้องศึกษา / ใช้ / ค้นหาเพื่อให้บรรลุเป้าหมายนั้นหรือไม่?

ขอบคุณมากล่วงหน้า!

คำตอบ

MichaelHampton Aug 19 2020 at 07:54

ใน nginx คุณสามารถระบุkeepaliveการเชื่อมต่ออัพสตรีมได้ก็ต่อเมื่อการเชื่อมต่อถูกกำหนดไว้ในupstreamบล็อก ตัวอย่างเช่น:

upstream backend {
    server private-api.example.com:443;

    keepalive 32;
}

นี่keepaliveระบุจำนวนสูงสุดของการเปิดการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์ต้นน้ำ (s) ต่อกระบวนการทำงาน

ในการใช้อัปสตรีมคุณต้องระบุชื่อในของคุณproxy_passแทนที่อยู่แบ็กเอนด์

ตัวอย่างเช่นหากคุณเคยใช้:

     proxy_pass https://private-api.example.com:443;

คุณจะเปลี่ยนเป็น:

     proxy_pass https://backend;

serverตัวอักษรแทนชื่อต้นน้ำสำหรับที่กำหนดไว้

คุณต้องตั้งค่าเวอร์ชัน HTTP เป็น 1.1 (เนื่องจากค่าเริ่มต้นค่อนข้างไร้เหตุผลเป็น 1.0) และล้างส่วนหัวการเชื่อมต่อ:

    proxy_http_version 1.1;
    proxy_set_header Connection "";

โปรดทราบว่ายังมีสิ่งที่keepalive_timeoutคุณสามารถกำหนดได้upstreamซึ่งคุณอาจต้องปรับแต่ง โดยค่าเริ่มต้นคือ 60 วินาทีดังนั้นหากการเชื่อมต่อไม่ได้ใช้งานเป็นเวลานานการเชื่อมต่อจะถูกปิดแม้ว่าจะมีน้อยกว่าkeepaliveการเชื่อมต่อที่เปิดอยู่ก็ตาม เซิร์ฟเวอร์แบ็กเอนด์จะมีการหมดเวลาแบบ Keepalive ของตัวเองซึ่งคุณจะต้องปรับแต่งแยกต่างหาก