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