Sesi lengket dengan proksi Nginx

10

Saya memiliki aplikasi yang berjalan pada dua contoh AWS yang berbeda dan saya ingin mengaktifkan sesi "sticky" atau "persistent" berdasarkan IP sehingga saya dapat memanfaatkan teknologi socket web dengan cara tertentu.

Saya memiliki dua pengaturan berbeda yang melibatkan keduanya menggunakan ip_hashuntuk mengaktifkan sesi lengket ini.

Pada pengaturan pertama, proses aplikasi berjalan pada instance yang sama dengan konfigurasi Nginx. Ini bekerja , sesi tetap seperti yang diharapkan.

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

Pada pengaturan kedua, saya menunjuk ke instance eksternal dan mencoba untuk mencapai efek yang sama. Pengaturan ini tidak berfungsi . Dengan kata lain, sesi-sesi tersebut masih dimuat dengan seimbang.

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

Apakah saya menggunakan ip_hashdengan benar? Bagaimana saya bisa mengaktifkan sesi berbasis ip "sticky" untuk server eksternal?

Himmel
sumber
Apakah Nginx Anda sudah menginstal "ngx_http_upstream_module"? Saya tidak tahu apakah ini disertakan secara default atau tidak. "nginx -V" biasanya menampilkan modul yang dibuatnya. Milik saya (dibangun dari sumber) tidak menyebutkannya
Tim

Jawaban:

7

Server saya berada di belakang load balancing AWS, jadi saya harus meneruskan header yang benar ke hulu sehingga selalu mencerminkan IP klien. Konfigurasi berikut memperbaiki masalah saya (lihat baris yang dikomentari):

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
sumber
7

Menurut dokumentasi Nginx, dukungan sesi Sticky hanya tersedia untuk versi Plus mahal mereka. Saya sudah meneliti alternatif dan semakin dekat saya adalah garpu tua ini yang tidak kompatibel dengan Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

Saya juga telah mencoba membangun modul LUA tetapi tidak ada kait API untuk seleksi rekan, hanya untuk enumerasi dan pemblokiran.

Penyeimbangan Beban Nginx Plus

Memperbarui

Saya telah menemukan modul hebat lainnya, lihat https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

Tuan bug
sumber
Apakah Anda dapat menautkan ke dokumentasi ini?
James Shewey