Przyklejone sesje z proxy Nginx

10

Mam aplikację działającą w dwóch różnych instancjach AWS i chciałbym włączyć sesje „lepkie” lub „trwałe” oparte na IP, aby w szczególny sposób móc korzystać z technologii gniazd sieciowych.

Mam dwie różne konfiguracje, z których obie wymagają użycia, ip_hashaby umożliwić te lepkie sesje.

W pierwszej instalacji procesy aplikacji działają w tej samej instancji, co konfiguracja Nginx. To jest praca , sesje są trwałe, jak oczekiwano.

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;
}

W drugiej konfiguracji wskazuję na instancje zewnętrzne i staram się osiągnąć ten sam efekt. Ta konfiguracja nie działa . Innymi słowy, sesje wciąż są równoważone obciążeniem.

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;
}

Czy używam ip_hashpoprawnie? Jak mogę włączyć „lepkie” sesje IP dla serwerów zewnętrznych?

Himmel
źródło
Czy twój Nginx ma zainstalowany „ngx_http_upstream_module”? Nie wiem, czy jest domyślnie dołączony, czy nie. „nginx -V” zwykle generuje moduły, z którymi jest zbudowany. Mój (zbudowany ze źródła) nie wspomina o tym
Tim

Odpowiedzi:

7

Mój serwer był za równoważeniem obciążenia AWS, więc musiałem przekazać odpowiednie nagłówki do nadrzędnego, aby zawsze odzwierciedlało adres IP klienta. Następująca konfiguracja naprawiła mój problem (patrz skomentowany wiersz):

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;
    }
}
Himmel
źródło
7

Zgodnie z dokumentacją Nginx obsługa sesji lepkich jest dostępna tylko dla ich drogiej wersji Plus. Badam alternatywy i im bliżej jestem tego starego widelca, który nie jest kompatybilny z Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

Próbowałem także zbudować moduł LUA, ale nie ma żadnych haczyków API do wyboru równorzędnego, tylko do wyliczania i blokowania.

Równoważenie obciążenia Nginx Plus

Aktualizacja

Znalazłem kolejny świetny moduł, patrz https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

Mr. Bug
źródło
Czy możesz link do tej dokumentacji?
James Shewey,