Klaster Nginx + Passenger


#1

Cześć,

Od jakiegoś czasu chcę zbudować klaster dla aplikacji w Railsach, składający się z kilku maszyn.
Moim głównym celem nie jest wcale podniesienie wydajności (chociaż to “przy okazji” też) lecz stworzenie rozwiązania aby możliwa była praca ciągła nawet w chwili wgrywania aktualizacji systemowych lub prac administracyjnych na jakiejś maszynie,

Utworzyłem zatem klaster PostgreSQL z pojedynczym, wirtualnym adresem IP (3 maszyny z PostgreSQL pod kontrolą Patroni, ETCD na 5-ciu węzłach + HAPRoxy + Keepalived / konfiguracja bez pojedynczego punktu awarii)

Mam kolejny virtualny adres IP dla dwóch serwerów z HAProxy, które działają jako LoadBalancer do hostów aplikacyjnych, gdzie chciałbym postawić 2-3 maszyny z NginX + Passenger.
(To tutaj mają być postawione aplikacje (i sięgać do danych postgreSQL poprzez klaster Patroni)

Jak prawidłowo skonfigurować Passengera (czy musi to być wersja Enterprise?) i NginX aby to dobrze działało?
Czy może zamiast Passengera powinienem użyć Pumy?

Wdzięczny będę za sugestie, pomysły i linki do opisanych rozwiązań.

Pozdrawiam

/P.S.
Wiem, że to nie forum dla administratorów tylko dla programistów RoR, ale może od Was dowiem się więcej niż od nich :slight_smile: /


#2

Podbijam temat.
Pomimo braku jakiejkolwiek sugestii - odpowiedzi nadal wierzę w społeczność tego forum. :smile:


#3

To co chcesz zrobić to zestawienie load-balancingu i tak naprawdę nie ma to znaczenia, jaką aplikacje masz(rails, sinatra czy nawet php np. wordpress). W gruncie rzeczy zestawiasz sobie load-balancer i zamiast wskazywać na jakiś socket, czy też port na jakim pracuje aplikacja to dajesz mu proxy pass do kolejnych hostów. Jeśli chodzi o serwer aplikacji to nie ma . to znaczenia czy to będzie puma, unicorn, thin, passenger(darmowy czy enterprrise). Wybierasz wg. swoich potrzeb. Zestawiasz sobie aplikację z ngnix(nie ma znaczenia czy na port czy socket, aczkolwiek ja preferuję socket) gdyż requesty, które będą “przekazywane” przez load balancer trafią w taki sam sposób jakbyś je wysyłał bezpośrednio do maszyny lub przez load-balancer. Z HAproxy nie pracowałem, więc nie wielę mogę pomóc, ale z ngnix odpowiem na wszelkie pytania.
Kilka wskazówek:

  • Jeżeli serwery pracują we wspólnej sieci(posiadają i adres publiczny i prywatny) to warto serwer aplikacji z load-balancerem zestawić po sieci prywatnej bo jest szybciej, bezpieczniej. Jeżeli jednak nie chcesz(lub nie możesz) po sieci prywatnej to zadbaj aby dostęp do aplikacji bezpośredno był zablokowany(w twoim przypadku to na ngnix), gdyż chcesz aby ruch przychodizł tylko do load-balancera.
  • Pamiętaj, że jak aplikacja stanie ZA load-balancerem to wykonanie request.remote_ip zwróci Ci adres load-balancera a nie klienta. Żeby to sobie ogarnąć to musisz na load-balancerze ustawić odpowiednio proxy nagłówków. Jak tego nie zrobisz to każdy request będzie z adresem load-balancera :stuck_out_tongue_winking_eye:

Jak coś wyjaśniłem niejasno to pytaj dalej. Pomogę :wink:
Pozdrawiam