Bekijk Volledige Versie : nginx + varnish + apache + mod_php sessie probleem
Het vermoeden is dat deze setup bij hoge bezoekers aantallen sessie door elkaar gaat gooien.
Men komt binnen via een loadbalancer (nginx), wordt doorgestuurd naar een webserver (varnish + apache + mod_php) en op een zeker moment krijg je opeens een andere (PHP) sessie terug. Momenteel wordt je nog maar doorgestuurd naar 1 webserver dus op dat punt kan het niet mis gaan lijkt me. Het lijkt er op dat nginx (+ varnish) hier het probleem veroorzaakt, nu ben ik benieuwd of meer mensen hier daarmee te maken hebben gehad en hoe jullie dit op hebben gelost. Ik vermoed zelf dat de combinatie nginx + varnish niet echt lekker met elkaar praat.
Het vermoeden? Heb je wat meer informatie daarover?
Waarom doe je de load balancing met nginx en niet met haproxy? Of waarom doe je de caching niet op nginx in plaats van varnish? Doe je niet toevallig caching op zowel nginx als varnish? Dan kan ik me voorstellen dat er soms iets niet helemaal soepel loopt.
systemdeveloper
21/12/13, 13:53
Het is ook een aparte setup. Beter kun je de boel eerst op varnish laten uitkomen en die laten loadbalancen op de acherliggende webservers. De hash functie in de vcl van varnish zorgt dan dat requests van clients op dezelfde webserver uitkomen. Anders moet je je php sessies in een database zetten, maar daarvoor moet je wel je achterliggende websites aanpassen.
Edit: als je nginx wilt houden is het ook mogelijk om varnish op je cache server draaien, die te laten loadbalancen naar je webservers en daarop nginx + apache draaien al kan dat een beetje overkill zijn omdat je dan op 2 plekken kunt gaan cachen. Waarschijnlijk kun je nginx of apache zelfs droppen, afhankelijk van je sites en requirements.
Het vermoeden? Heb je wat meer informatie daarover?
Waarom doe je de load balancing met nginx en niet met haproxy? Of waarom doe je de caching niet op nginx in plaats van varnish? Doe je niet toevallig caching op zowel nginx als varnish? Dan kan ik me voorstellen dat er soms iets niet helemaal soepel loopt.
Ik vermoed dat varnish de load balancer als 1 client ziet op het moment dat het mis gaat en wellicht daarom de sessies door elkaar gaan lopen. Dit zou natuurlijk niet moeten kunnen, maar dat is de enige mogelijke verklaring die ik er voor heb.
HAProxy heb ik geen ervaring mee, tot nu toe hele goede ervaringen met nginx als loadbalancer. Caching van nginx staat op dit moment uit, nginx wordt puur en alleen voor load balancing gebruikt. Om zaken uit te sluiten ga ik wellicht testen om nginx ook voor de caching te gebruiken en varnish er tussen uit te halen.
Het is ook een aparte setup. Beter kun je de boel eerst op varnish laten uitkomen en die laten loadbalancen op de acherliggende webservers. De hash functie in de vcl van varnish zorgt dan dat requests van clients op dezelfde webserver uitkomen. Anders moet je je php sessies in een database zetten, maar daarvoor moet je wel je achterliggende websites aanpassen.
Edit: als je nginx wilt houden is het ook mogelijk om varnish op je cache server draaien, die te laten loadbalancen naar je webservers en daarop nginx + apache draaien al kan dat een beetje overkill zijn omdat je dan op 2 plekken kunt gaan cachen. Waarschijnlijk kun je nginx of apache zelfs droppen, afhankelijk van je sites en requirements.
Daar ben ik me van bewust inderdaad. Ik wist niet dat je varnish ook als load balancer kan gebruiken, ik overweeg nu dan ook om 1 van de 2 (nginx of varnish) voor beiden (load balancing + caching) te gaan gebruiken om zaken uit te kunnen sluiten en beter beheersbaar te maken.
systemdeveloper
21/12/13, 17:13
Daar ben ik me van bewust inderdaad. Ik wist niet dat je varnish ook als load balancer kan gebruiken, ik overweeg nu dan ook om 1 van de 2 (nginx of varnish) voor beiden (load balancing + caching) te gaan gebruiken om zaken uit te kunnen sluiten en beter beheersbaar te maken.
https://www.varnish-cache.org/trac/wiki/LoadBalancing
Ik raad je aan om e.e.a. over varnish eens door te lezen aangezien het een aantal leuke mogelijkheden heeft.
https://www.varnish-cache.org/trac/wiki/LoadBalancing
Ik raad je aan om e.e.a. over varnish eens door te lezen aangezien het een aantal leuke mogelijkheden heeft.
Ben al bezig met lezen ;) thanks voor de tip!
set client.identity = req.http.cookie; zorgt er als ik het goed heb voor dat een user altijd naar dezelfde backend doorverwezen zal worden?
systemdeveloper
21/12/13, 17:37
Ben al bezig met lezen ;) thanks voor de tip!
set client.identity = req.http.cookie; zorgt er als ik het goed heb voor dat een user altijd naar dezelfde backend doorverwezen zal worden?
Zolang ie een (uniek) cookie heeft wel.
Varnish is heel tof. Bedenk alleen wel dat wanneer je Varnish als entry point gaat inzetten je iets nodig hebt die je SSL kan afhandelen (als dat van toepassing is). Varnish ondersteunt dit zelf niet en gaat het ook nooit ondersteunen. Daar zul je dus iets als Pound voor moeten gebruiken.
Varnish is trouwens ook wat hipper als het op health checks in load balancing aan komt. Nginx heeft alleen de basis eigenlijk en wanneer je iets meer wilt doen zul je een subscription moeten nemen. Als het even kan zou ik adviseren om daar in ieder geval niet Nginx voor te gebruiken. Al kan het natuurlijk wel. Het is een beetje waar je je comfortabel bij voelt ook. Ik vind zelf HaProxy erg makkelijk bijvoorbeeld.
Kan Apache de ip adressen van de bezoeker wel goed zien? Dat kan ook bepaalde problemen voorkomen dan wel het makkelijker maken ze op te lossen. Zelf hebben we een setup staan voor shared hosting die eerst Varnish heeft en daarachter webservers met Apache. Bij ons kan een bezoeker echter naar elke webserver door verwezen worden zonder problemen met sessies (sessies staan op een NFS volume dat gedeeld is). Per request kan een andere webserver het afhandelen.
Voor Varnish zetten we enkel nginx als we https willen gebruiken.
Wat je beschrijft kan overigens ook het effect zijn van een Varnish config die zeer veel zal cachen, echter daarbij de cookies niet verwijdert (deze zijn ook te cachen met Varnish en dan krijgen meerdere bezoekers dezelfde cookie).
systemdeveloper
21/12/13, 18:16
Varnish is heel tof. Bedenk alleen wel dat wanneer je Varnish als entry point gaat inzetten je iets nodig hebt die je SSL kan afhandelen (als dat van toepassing is). Varnish ondersteunt dit zelf niet en gaat het ook nooit ondersteunen. Daar zul je dus iets als Pound voor moeten gebruiken.
Varnish is trouwens ook wat hipper als het op health checks in load balancing aan komt. Nginx heeft alleen de basis eigenlijk en wanneer je iets meer wilt doen zul je een subscription moeten nemen. Als het even kan zou ik adviseren om daar in ieder geval niet Nginx voor te gebruiken. Al kan het natuurlijk wel. Het is een beetje waar je je comfortabel bij voelt ook. Ik vind zelf HaProxy erg makkelijk bijvoorbeeld.
Je kunt ook een minimale nginx op poort 443 draaien voor de ssl en die requests dan naar varnish laten connecten. Als je tussen nginx -> varnish -> apache geen ssl nodig hebt tenminste.
Edit: Mark was me voor :)
Probleem gevonden, doordat 404's herschreven werden naar een custom PHP 404 handler en varnish er de cookie afstript in geval van afbeeldingen enzovoorts werd daardoor een nieuwe/andere sessie aangemaakt.