Apache + Tomcat - Masalah dengan sesi lengket dan penyeimbangan beban

Saya menghadapi beberapa masalah dengan Apache mod_proxy_balancer terkait sesi lengket.

Kami telah mengembangkan layanan web yang tenang di Java, berjalan di Tomcat. Backend sebenarnya menggunakan keamanan Acegi, dengan otentikasi Auth Basic.

Arsitekturnya adalah (maaf saya pengguna baru, saya tidak dapat memposting gambar):

     --------------------
     |Java Reverse Proxy|
     --------------------
            |
     --------------------
     |Apache load balancer|
     --------------------               
            |
    --------|--------
    |               |
--------        --------    
|tomcat1|       |tomcat2|
--------        --------    

Kami memiliki "Java Reverse Proxy" untuk melakukan berbagai hal bisnis. Itu juga melakukan otentikasi Basic Auth pada Tomcat (Tomcat1, Tomcat2).

Pengguna akhir memanggil url seperti: http:///a/b?username=foo&password=bar&session=xxx

Proksi terbalik kemudian memproksi permintaan ke Apache, mengirimkan kredensial sebagai token Basic Auth.

Pengguna akhir memiliki tiga url berbeda:

http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3

Hanya service1 dan service2 yang dilindungi melalui Acegi. service3 dapat diakses secara anonim (ini adalah persyaratan).

Kami memiliki konfigurasi berikut di Apache untuk melakukan penyeimbangan beban:

<Proxy balancer://cluster>
    Header set Cache-Control no-cache
    Header set Pragma no-cache
    BalancerMember http://xxx:9671 route=server1
    BalancerMember http://xxx:9672 route=server2
</Proxy>

ProxyPreserveHost On
ProxyPass / balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID

Pada panggilan pertama ke service1, maka JSESSIONID dikembalikan ke pengguna, dan kemudian dia mengirimkan informasi sesi ini sebagai bagian dari permintaan (dalam string kueri, parameter sesi)

Untuk mempertahankan status sesi di kucing jantan backend (Tomcat1, Tomcat2), proksi terbalik java mendapatkan sesi dari string kueri dan mengirimkannya ke kucing jantan yang diproksi sebagai cookie JSESSIONID.

Semuanya berfungsi dengan baik untuk URL yang dilindungi autentikasi dasar. Namun ketika pengguna memanggil url ketiga (yang tersedia untuk umum), Apache tidak melakukan penyeimbangan beban dengan benar.

Misalnya, ketika saya memanggil layanan 1 atau 2, saya mendapatkan log Apache berikut:

[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9672" : busy 0 : lbstatus 1

Tidak apa-apa, karena permintaan tersebut dimaksudkan untuk menargetkan kucing jantan2.

Tapi kemudian ketika saya menelepon service3, saya mendapatkan:

[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0

Seperti yang Anda lihat, meskipun cookie JSESSIONID sama, Apache mengirimkan permintaan ke kucing jantan yang salah (di sini kucing jantan1).

Mungkinkah fakta bahwa url untuk service3 tidak memerlukan otentikasi Auth Basic, sedangkan service1 dan service2 memerlukannya?

Saya cukup yakin saya telah melakukan sesuatu yang salah, tetapi saya sudah mencari-cari sejak lama, dan saya tidak dapat menjalankannya.

Bantuan Anda sangat kami hargai.

Terima kasih


person benjamin.d    schedule 22.02.2012    source sumber


Jawaban (3)


Saya tidak melihat akhiran jvmRoute di JSESSIONID Anda. mod_proxy menggunakan jvmRoute untuk merutekan sesi melekat dengan benar ke instance Tomcat Anda. jvmRoute dideklarasikan dalam konfigurasi server Tomcat Anda (di mana setiap instance server memiliki pengidentifikasi jvmRoute uniknya sendiri.

person Peter Cetinski    schedule 24.02.2012
comment
Benar sekali, pada contoh yang saya berikan saya lupa jvmRoute. Tetapi bahkan mengaturnya di server.xml tidak menyelesaikan masalah. - person benjamin.d; 26.02.2012

Mungkin ini bisa membantu. Ini konfigurasi saya di server web:

<Proxy balancer://hybriscluster>
BalancerMember ajp://tomcatServer1:8009 route=tomcat1 keepalive=On ping=5 max=200 ttl=120
BalancerMember ajp://tomcatServer2:8009 route=tomcat2 keepalive=On ping=5 max=200 ttl=120
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60
</Proxy>

Konfigurasi di server.xml dari Tomcat Server 1:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}">
person user1019100    schedule 26.09.2013

Saya menghadapi masalah yang sama dan menyelesaikannya dengan memodifikasi baris di bawah ini -

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.2:80 route=node1
BalancerMember http://192.168.1.3:80 route=node2
</Proxy>

Harap perhatikan konfigurasi scolonpathdelim=On Referensi - http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

person Munish Chandel    schedule 16.04.2014