10

Ich habe eine Node.js App auf Elastic Beanstalk läuft auf mehreren ec2-Instanz hinter einem Load Balancer (elb).Amazon ELB - Sticky Sitzung verloren von Cookie

Ursache der Notwendigkeit meiner App, ich musste die Sitzung Klebrigkeit aktivieren. Ich habe die "AppCookieStickinessPolicy" mit meinem benutzerdefinierten Cookie "sails.sid" als Referenz aktiviert.

Das Problem ist, dass meine App dieses Cookie brauchen proprely zu arbeiten, aber als der Moment aktiviere ich die Sitzung Klebrigkeit (über Dauer-Based Session Stickiness oder in meinem Fall: applikationsgesteuerte Session Stickiness), die Header gehen zu meinem Server werden geändert und ich habe mein benutzerdefiniertes Cookie verloren, welches durch das AWSELB (amazon ELB) Cookie ersetzt wird.

Wie kann ich den Loadbalancer so konfigurieren, dass er mein Cookie nicht ersetzt?

Wenn ich gut verstanden habe, muss die AppCookieStickinessPolicies meine benutzerdefinierte Cookie beibehalten, aber es ist nicht der Fall. Ich mache mich irgendwo falsch?

Vielen Dank im Voraus

Beschreibung meiner Load Balancer:

{ 
    "LoadBalancerDescriptions": [ 
     { 
      "AvailabilityZones": [ 
       "us-east-1b" 
      ], 

      .... 

      "Policies": { 
       "AppCookieStickinessPolicies": [ 
        { 
         "PolicyName": "AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664", 
         "CookieName": "sails.sid" 
        } 
       ], 
       "LBCookieStickinessPolicies": [ 
        { 
         "PolicyName": "awseb-elb-stickinesspolicy", 
         "CookieExpirationPeriod": 0 
        } 
       ], 
       "OtherPolicies": [] 
      }, 
      "ListenerDescriptions": [ 
       { 
        "Listener": { 
         "InstancePort": 80, 
         "LoadBalancerPort": 80, 
         "InstanceProtocol": "HTTP", 
         "Protocol": "HTTP" 
        }, 
        "PolicyNames": [ 
         "AWSConsole-AppCookieStickinessPolicy-awseb-e-y-AWSEBLoa-175QRBIZFH0I8-1452531192664" 
        ] 
       } 
      ] 

      .... 

     } 
    ] 
} 
+1

Haben Sie die Amazon EC2-Konsole aktualisiert, um Ihren benutzerdefinierten Cookie-Namen und Ihre Cookie-Richtlinie hinzuzufügen? Haben Sie auch versucht, einen anderen Cookie-Namen zu verwenden (z. B. einen, der keine Periode enthält)? – Cahit

Antwort

1

Der klebrige Session-Cookie von der ELB gesetzt wird verwendet, was Knoten im Cluster zu identifizieren, zu routen Anfrage.

Wenn Sie in Ihrer Anwendung ein Cookie setzen, auf das Sie sich verlassen müssen, dann wird erwartet, dass der ELB diesen Cookie verwendet, wodurch der von Ihnen festgelegte Wert überschrieben wird.

Versuchen Sie einfach, dem ELB zu erlauben, den Session-Cookie zu verwalten.

1

Ich habe viel Zeit damit verbracht, die ELB-Sticking-Funktionen und Routing-Anforderungen von demselben Client an dieselbe Maschine in einem Back-End-Cluster-Server zu testen.

Problem ist, es hat nicht immer 100% funktioniert, also musste ich ein Backup-Verfahren schreiben mit Sitzungen in MySQL gespeichert. Aber dann erkannte ich, dass ich die ELB-Stickiness-Funktionalität nicht brauchte, ich konnte einfach das MySQL-Session-System verwenden.

Es ist komplexer, ein Datenbanksitzungssystem zu schreiben, und natürlich gibt es einen Overhead, da jeder HTTP-Aufruf zwangsläufig eine Datenbankabfrage beinhaltet. Wenn diese Abfrage jedoch einen primären Index verwendet, ist dies nicht so schlimm.

Der große Vorteil ist, dass jede Anfrage an jeden Server gehen kann. ODER wenn einer Ihrer Server stirbt, kann der nächste auch den Job übernehmen. Für wirklich belastbare Anwendungen ist ein Datenbanksitzungssystem unvermeidlich.

+0

Oder Sie können etwas wie Memcached oder Redis für Ihre Sitzungen verwenden. Schneller Zugriff, keine zusätzliche Belastung Ihrer Datenbank. – chris

Verwandte Themen