เซสชัน Sticky กับพร็อกซี Nginx


10

ฉันมีแอปพลิเคชั่นที่ทำงานบนอินสแตนซ์ AWS สองแบบที่แตกต่างกันและฉันต้องการเปิดใช้งานเซสชัน "เหนียว" หรือ "ถาวร" โดยใช้ IP เพื่อให้ฉันสามารถใช้ประโยชน์จากเทคโนโลยีซ็อกเก็ตเว็บได้ด้วยวิธีการเฉพาะ

ฉันมีการตั้งค่าที่แตกต่างกันสองแบบที่เกี่ยวข้องกับการใช้ip_hashเพื่อเปิดใช้งานเซสชันที่ติดหนึบเหล่านี้

ในการตั้งค่าครั้งแรกกระบวนการแอปกำลังทำงานบนอินสแตนซ์เดียวกันกับการกำหนดค่า Nginx สิ่งนี้ใช้งานได้เซสชันจะคงอยู่ตามที่คาดไว้

upstream my_app {
    ip_hash;
    # local servers
    server 127.0.0.1:3001 weight=100 max_fails=5 fail_timeout=300;
    server 127.0.0.1:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

ในการตั้งค่าที่สองฉันกำลังชี้ไปที่อินสแตนซ์ภายนอกและพยายามทำให้ได้ผลที่เหมือนกัน ชุดนี้ขึ้นไม่ได้ทำงาน กล่าวอีกนัยหนึ่งเซสชั่นยังคงโหลดสมดุล

upstream my_app {
    ip_hash;
    # external servers
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

ฉันใช้ip_hashอย่างถูกต้องหรือไม่ ฉันจะเปิดใช้งานเซสชันที่ยึดตาม "ip" สำหรับเซิร์ฟเวอร์ภายนอกได้อย่างไร


Nginx ของคุณติดตั้ง "ngx_http_upstream_module" หรือไม่ ฉันไม่รู้ว่ามันรวมอยู่ในค่าเริ่มต้นหรือไม่ "nginx -V" มักจะส่งออกโมดูลที่สร้างขึ้นด้วย เหมือง (สร้างขึ้นจากแหล่งที่มา) ไม่ได้พูดถึงมัน
ทิม

คำตอบ:


7

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

upstream my_app {
    ip_hash;
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

server {
    server_name my-app.com;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_pass http://my_app/;
        proxy_redirect off;
    }
}

7

ตามเอกสารของ Nginx การสนับสนุนเซสชัน Sticky นั้นมีให้เฉพาะในรุ่น Plus ที่มีราคาแพงเท่านั้น ฉันได้ทำการค้นคว้าทางเลือกแล้วและยิ่งฉันใกล้ชิดมากขึ้นก็คือทางแยกเก่าที่ไม่สามารถใช้งานร่วมกับ Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

ฉันยังพยายามสร้างโมดูล LUA แต่ไม่มี API hooks สำหรับการเลือกเพียร์สำหรับการแจงนับและการบล็อก

โหลดบาลานซ์ Nginx Plus

ปรับปรุง

ฉันได้พบโมดูลที่ยอดเยี่ยมอื่นดูที่https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src


คุณสามารถเชื่อมโยงไปยังเอกสารนี้ได้หรือไม่?
James Shewey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.