Nginx jako loadbalancer

Spouštím na 3 ruzných serverech tu stejnou NodeJS aplikaci, takže mi Nginx rozkláda zátěž rovnoměrně na všechny 3 servery. To je výchozí nastavení: 1. request obslouží 1. server, 2. request 2. server, 3. reques 3. server, 4. request 1. server a furt dokola… Nádhera. Dá se samozřejmě nastavit jiné chování load balanceru, ale tohle je pro rovnoměrné rozložení zátěže ideál. Já si Round Robin můžu dovolit, protože o mé sessions se stará redis a všechny instance aplikace ví, jak si o proměnné session říct. Pokud budete mít session třeba v cookies, pak bacha, protože jednotlivé requesty neví nic co bylo včera a nepředávájí si žádné informace, pokud se o to teda sami nějak nepostaráte…

nodejs, load balancer, nginx

NodeJS apka jako multithread aplikace

Aby to byla ještě větsí legrace, samotná aplikace se spouští pomocí knihovny cluster. To proto, že normální NodeJS je singlethread aplikace… Takže pokud máte vícejádrový procesor na serveru, tak pak pokud nepoužijete cluster, beží vaše aplikace jen v jednom vlákně. Super, ale né dokonalé… Nedokonalé třeba i proto, že když vám aplikace spadne, což se může stát, tak pokud nemáte pořešené jinak, např přes PM2, nebo nodemon, tak webová aplikace zemře a neběží.
Tenhle kus kódu mi zajistí, že aplikace poběží ve všech jádrech procesoru, v případě pádu některého vlákna znovu nastartuje. Každé vlákno má svou konektivitu do MongoDB…

Pěkné je, že všechny vlákna aplikace jsou schovaná za jediným portem a master v clusteru se stará o rozdělování trafiku. To mi umožňuje maimální jednoduchost v Nginx konfiguraci, kde jen specifikuju jednotlivé fyzické servery a port onoho masteru aplikace… Super.

NodeJS a remote address

No a pokud si nenastavíte v Nginx konfiguráku proxy_set_header (jak je výše uvedeno), budete mít problém zjistit IP adresu vašeho živého návštěvníka webových stránek, protože Nginx, jako reverzní proxy a loadbalancer uvdete jako IP adresu IP adresu stroje, na kterém běží…

Proto jsou důležitá ty proxy hlavičky, protože až s nimi pak funguje: