Connexion
Imaginez une organisation qui vous donne les moyens réels de travailler, de
progresser, de réaliser vos projets personnels.
Thématiques
Android annotation BEA Cloud Computing développement Devoxx Eclipse ESB Exploitation Flash Flex
Google Grails Groovy GWT Hibernate IBM J2EE Java JavaFX jazoon JBoss jdk-7 JEE JPA JVM
Méthodes agiles Maven NoSQL Oracle OSGi Paris JUG Performance RIA scala SCRUM SOA
Spring SpringSource Sun Tomcat Websphere Wicket Xebia XP
Catégories
Divers (45)
Exploitation (24)
J2EE (81)
Java (169)
Méthodes agiles (66)
Mobilité (8)
Mot du président (15)
Performance (18)
Publications (4)
Quel beau métier ! (21)
Revue de presse (164)
RIA (26)
SOA (45)
Tests (1)
Xebia recrute ! (16)
Derniers billets
Revue de Presse Xebia
Jazoon’10 – Jour 2
Jazoon’10 – Jour 1
Xebia recherche un Responsable informatique / Administrateur Réseau
H/F (stage/apprentissage)
Revue de Presse Xebia
En route pour Jazoon’10
Rendez-vous exclusif : Mercredi 26 mai à 17h00 les Xebians en chat
pendant 2 heures !
Revue de Presse Xebia
KawaCamp jeudi 27 chez Xebia
Xebia recrute aussi des jeunes diplômés (H/F) !
Blogs anglophones
Eamonn McManus
Weblogic & Java EE
Blogs francophones
Bistro!
Le Touilleur Express
Xebia
Xebia Blog (NL)
Xebia Corporate
Xebia France
Xebia sur developpez.com
Archives
juin 2010
mai 2010
avril 2010
mars 2010
février 2010
janvier 2010
décembre 2009
novembre 2009
octobre 2009
septembre 2009
août 2009
juillet 2009
juin 2009
mai 2009
avril 2009
mars 2009
février 2009
janvier 2009
décembre 2008
novembre 2008
octobre 2008
septembre 2008
août 2008
juillet 2008
juin 2008
mai 2008
avril 2008
mars 2008
février 2008
janvier 2008
décembre 2007
novembre 2007
octobre 2007
septembre 2007
août 2007
juillet 2007
juin 2007
mai 2007
avril 2007
mars 2007
février 2007
décembre 2006
novembre 2006
A propos ...
Xebia est un groupe d'experts, exclusivement dédié aux technologies J2EE.
Licence
Sauf mention contraire, le contenu de ce blog est sous contrat Creative
Commons.
3 février 2010
Un peu d'histoire
Tout commence en 1997 avec la création d'Apache JServ. A l'époque, il s'agit
d'un serveur de Servlet qui supporte uniquement le protocole AJP créé pour
l'occasion. Dans l'architecture initiale, c'est Apache 1.1 qui fournit le serveur
web et transfère les requêtes par socket au moteur de Servlet. C'est la naissance
du protocole AJP dans sa première version implémentée par le mod_jserv.
L'Apache JServ Protocol fonctionne au départ comme un proxy qui redirige le
flux vers JServ. Le protocole est en texte clair et utilise un caractère en début de
ligne pour distinguer les différents éléments de la requête.
Rapidement, le protocole initial est considéré comme trop limité car il fonctionne
uniquement en loopback et possède une authentification pauvre. En 1998, le
protocole AJP 1.1 permet à JServ de tourner sur une autre machine que le
serveur web et d'assurer une authentification forte basée sur md5. Avec le
développement de JServ appparaît un problème de performance important : le
coût d'ouverture d'une socket et la vitesse des réseaux. Ils sont considérés à
l'époque comme les principaux goulets d'étranglement. Pour résoudre ces
problèmes, le protocole passe à la version 1.2 dont vous trouverez le draft initial
ici. AJP 1.2 est un protocole binaire orienté paquets qui permet de recycler la ou
les sockets connectées à JServ. Le passage au binaire permet aussi d'améliorer
les performances car il diminue la taille des données qui transitent et simplifie le
traitement.
Apache. C'est le point de départ des projets Tomcat et Ant. Commence alors une
période de transition qui finira par l'abandon d'Apache JServ. Pendant cette
transition, AJP sera porté sur Tomcat qui bénéficiera d'emblée d'une facilité
d'interconnexion avec Apache. Aux alentours de 2000, le mod_jk est développé
pour étendre AJP qui pourra supporter le transport des données SSL. C'est la
version 1.3 que l'on retrouve aujourd'hui supportée par les dernières
générations de Tomcat. Après toutes ces années de développement, le mod_jk est
maintenu par le projet Tomcat Connectors et n'a jamais été intégré aux projets
Apache.
Installation
mod_proxy
mod_jk
Si mod_jk était autrefois très délicat à installer avec la compilation du code sur
un serveur similaire au serveur cible, la situation s'est grandement simplifiée. Le
projet Apache Tomcat Connector fournit désormais les binaires pour les
principales plateformes (Linux, Windows, Free BSD, Mac, Solaris, AIX, etc). Il
faut donc télécharger le binaire du module et le copier dans le répertoire
contenant les modules Apache.
Configuration
Pour mieux comparer les deux solutions, nous avons choisi de prendre comme
exemple l'utilisation d'Apache en front desservant deux Tomcat en
# LOAD MODULES
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
ProxyStatus On
<Location /server-status>
SetHandler server-info
Order deny,allow
Deny from all
Allow from localhost
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
# APPLICATIONS CONFIGURATION
<Proxy balancer://my-application-cluster>
BalancerMember http://node-1:8080 route=node-1 disablereuse=On
# ...
BalancerMember http://node-n:8081 route=node-n disablereuse=On
</Proxy>
ProxyPreserveHost On
ProxyPass /my-application balancer://my-application-cluster/my-application stickys
mod_jk
# LOAD MODULES
# APPLICATIONS CONFIGURATION
JkMount /my-application/* loadbalancer
worker loadbalancer est en fait chargé de répartir les sessions entre le worker1 et le
worker2 via le type lb. Ce sont finalement les workers 1 à n qui assurent le
transport des requêtes sur AJP1.3 vers le port 8009 d'un Tomcat distant.
Configuration avec mod_jk - workers.properties
# WORKER 1 TO N
worker.worker1.type=ajp13
worker.worker1.host=node-1
worker.worker1.port=8009
# ...
worker.worker2.port=8009
worker.worker2.host=node-n
worker.worker2.type=ajp13
Interfaces graphiques
Les deux modules fournissent des interfaces web pour assurer la supervision du
load-balancer. Cette fois, le mod_proxy se contente de fournir des statistiques
réduites dans une interface minimaliste. L'interface liste principalement le statut
de chaque nœud du load-balancer ainsi que la quantité de données envoyée et
reçue par nœud.
De son côté, le mod_jk prouve sa maturité avec son interface rustique elle aussi,
mais plus voire trop complète. Elle est composée de plusieurs pages dont une
page d'accueil similaire en tout point à l'interface du mod_proxy. L'avantage
réside dans la fourniture d'une page détaillant l'état complet pour chaque nœud.
Mais le mod_jk ne se contente pas de cela : il fournit aussi une page permettant
de modifier à chaud la configuration du load-balancer. Il est parfaitement
envisageable pour le déploiement en production d'une nouvelle version de
l'application de couper les nœuds un à un au moment de leur mise à jour puis de
les réactiver sans interruption du service.
Attention toutefois, car les modifications faites par ce biais sont uniquement
enregistrées en mémoire, la nouvelle configuration sera perdue au prochain
redémarrage d'Apache.
En ce qui concerne la gestion d'erreur, il n'y a pas grand chose à dire car il n'y a
pas grand chose de fait. Si un timeout claque, un certain nombre de tentatives
de reconnexion seront réalisées jusqu'à ce que le noeud soit marqué en erreur et
n'en décolle plus.
C'est sur la gestion d'erreur que le mod_jk possède une plus grande
sophistication que son récent concurrent.
Tout d'abord le protocole AJP fournit un mécanisme de health check
(CPing/CPong) qui permet de tester l'état du lien entre le serveur frontal et un
membre du cluster. Cependant, c'est beaucoup plus limité que les heart beat des
load balancer hardware, il n'est pas possible de tester une url pour détecter des
indisponibilités applicatives (échec de démarrage de la web app, web app KO à
cause de l'indisponibilité d'un backend clef).
D'autre part, le module fait une distinction entre les erreurs locales temporaires
qui sont sans impact particulier, un code d'erreur HTTP par exemple, et les
erreurs globales qui indiquent que le serveur est clairement en erreur et ne
recevra plus de nouvelles requêtes. Il existe un système d'escalade qui, en cas de
répétition trop fréquente d'erreurs locales sur un noeud se charge de le passer
en erreur globale. Le module se charge de réactiver le noeud en mode recovery
après un délai paramétré.
Le mod_jk marque ici un petit point sur le mod_proxy grâce à sa gestion d'erreur
plus fine. Attention aux effets de bord, le retry sur timeout en a surpris plus d'un
et l'éviction de serveurs tomcat pour cause de répétition d'erreur est un beau
sujet de déni de service
En cas de problème réseau avec HTTP comme avec AJP, n'oubliez pas que
désactiver les connections persistantes simplifie grandement les investigations et
n'a rien de scandaleux en 2010 (cf HAProxy) ; c'est " disablereuse=On" pour
mod_proxy_http et " JkOptions +DisableReuse" pour mod_jk
Conclusion
Avec sa simplicité de configuration, sa répartition de charge calquée sur le
mod_jk, le mod_proxy conviendra parfaitement dans la grande majorité des cas.
Il s'accommode de clusters répartissant la charge sur plusieurs noeuds ou bien
en tant que simple reverse proxy. La cerise sur le gateau étant l'utilisation du
protocole HTTP qui permet de garantir la portabilité des services et facilite
grandement l'analyse du trafic.
Il reste, dans les deux cas, quelques efforts à faire pour permettre de plus
facilement monter des serveurs à chaud dans un cluster. Pour la haute
disponibilité sans perte, il faudra mettre en place un cluster Tomcat assurant la
réplication des sessions utilisateur entre les serveurs. Encore faut-il en avoir
vraiment besoin ...
Vous pouvez suivre les réponses reçues par cet article grâce au fil des
commentaires.
J'ai lu attentivement et avec intérêt cet article, qui montre une véritable
connaissance de ses problematiques de connectivité HTTPd / Tomcat.
- ajp n'est pas un protocol si méconnu, il est présent dans jetty mais aussi
dans la liste des dissecteurs de l'analyseur de réseau Wire Shark.
- mod_cluster pourrait être utilisé avec des Tomcat, JBoss As utilisant une
version de Tomcat proche du Tomcat standard.
- Longtemps l'objection contre mod_jk était qu'il devait être compilé, mais
les binaires Win32/64 et OS/X sont disponibles sur le site. Pour les Linux
c'est présent dans la plupart des distributions.
Pour finir l'avenir passera par un module qui saura détecter la topologie
dynamique des membres du cluster, leur capacité, leur charge afin
d'assurer un routage pertinent et automatique. mod_cluster est une bonne
piste de départ.
@Henri,
Mon expérience personnelle n'a pas été meilleure. Je n'ai peut être pas eu
de chance mais je n'ai jamais trouvé sur un projet des gens qui
connaissaient AJP ; par connaitre, j'entends plus que "savoir que ca existe".
A l'inverse, j'ai travaillé avec beaucoup de personnes très à l'aise avec
HTTP, des personnes qui n'avaient aucune difficulté à utiliser telnet ou un
tcpdump pour troubleshooter une communication défaillante.
J'ai l'impression que le niveau de maitrise d'AJP sur les mailing lists Tomcat
n'est pas tellement meilleur.
Même s'il offre plein de paramètres très savants, mod_jk ne répond ni mieux
ni moins bien que mod_proxy_balancer à mes attentes de clustering.
J'aimerais avoir :
1) un graceful shutdown (aka session draining ) de chaque noeud pour ne
pas couper les sessions en cours,
2) un progressive startup pour laisser mon application s'initialiser en
douceur plutôt que d'avoir un démarrage en "burst" et des énormes à-coup
sur la répartition des sessions,
3) pouvoir scripter ces graceful shutdown et progressive startup ,
4) monitorer l'équilibrage de mes load-balancers avec Hyperic HQ.
Cyrille (Xebia)
@Henri,
Je rêverai encore plus loin que vous : une Java Platform as a Service (1) !
Un deployment manager installerait mon war sur plusieurs noeuds de ma
grille avec exactement les versions de JVM et de serveur Java que je
demande.
Malgré cela, SpringSource est beaucoup plus présent que JBoss sur la
scène du Java Platform as a Service notamment avec le rachat de Cloud
Foundry qui leur permet de surfer sur la notoriété d'Amazon EC2.
Cyrille (Xebia)
Benoit (Xebia)
C'est aussi pour ça que j'avais fait des propositions et add-on comme le
cping/cpong.
Si vous remontez dans les archives vous pourrez voir que le sujet de la
pondération du routage par collecte des infos de charge OS/webapp (voir
En conclusion, dès qu'on a des besoins un tant soit peu complexe, il faut
mettre en place des verrues pour utiliser le mod_proxy.
Benoît
@Benoit D,
Je conviens que cela nécessite de nettoyer les headers http à l'entrée des
data centers mais je ne vois hélas pas d'alternative.
Pour les situations complexes dont vous parlez, j'ai l'impression qu'il y a le
plus souvent un load balancer hardware de niveau 7 suivi d'une couche de
serveurs web et seulement après nos serveurs Java.
Pour revenir à AJP et mod_jk, si mon serveur Apache Httpd est précédé d'un
load-balancer ou un firewall de niveau 7, je ne vois pas comment il est
possible de récupérer l'adresse IP de l'internaute sauf à utiliser
mod_remoteip qui n'est disponible que sur Apache 2.3.5-alpha ; pour ssl,
ai-je d'autre solution que des headers http ?
En revanche, si je peux me dispenser de composants réseau de niveau 7 en
amont des Apache, je conviens que mod_jk permet plus facilement que
mod_proxy_http
de récupérer ces informations. Hélas, ca n'a pas été le cas sur mes projets
ces dernières années.
Cyrille (Xebia)
@Cyrille Le Clerc
@Olivier
Cyrille
@Benoit D,
Cyrille
@Olivier,
Pour les environnements dans lesquels j'ai ou des collègues ont utilisé des
load balancers de niveau 7 en amont des serveurs web, j'ai en tête :
* les portails grand public et gateway web services de deux des trois grand
opérateurs telco français,
* deux grandes banques françaises en intranet et site web grand public
(HAProxy n'est pas très éloigné de l'une d'elle ),
* une compagnie d'assurance,
* Une radio nationale,
* ...
Cyrille
Bonjour,
merci pour ce post et dont je partage les conclusions(nous avons jk 1.2.27
en prod)
juste une question cependant
as tu a un lien sur le session draining ?
Quelle difference avec le status disabled de noeuds en jk
Cordialement
Marc Godin
Bonsoir,
@Marco,
Voici les liens que je connais sur le session draining / graceful shutdown :
Zeus : Zeus 6.0 User Manual - 11.2.5 Draining Connections et How can I
remove back-ends from the cluster without disrupting sessions?.
Pour le status : disabled , j'ai fait il y a quelques mois des essais avec
mod_proxy_balancer qui hélas s'étaient soldés par un échec puisque plus
aucune requête http n'est transmise à un noeud disabled ; passer le loadfactor à
0 n'a pas marché non plus car l'interface graphique interdit cette valeur.
J'avais trouvé pour astuce de passer le loadfactor du noeud que je voulais
éteindre à 1 et celui de tous les autres noeuds à 100 ; quasiment plus aucune
nouvelle session n'était envoyée vers le noeud à éteindre mais ce n'est que
de la bidouille .
Cyrille
@Henri,
Merci pour l'invitation à exposer nos idées sur la mailing list Tomcat et pour
y avoir cité ce billet.
Cyrille
Bonjour.
J'ai du rater quelque chose, mais pourquoi ne pas utiliser mod_proxy_ajp
qui apporte finalement le meilleur de mod_proxy et de mod_ajp ? Tu en
parles brièvement au début de l'article comme la "cerise sur le gateau", et
puis ça disparait ...)
Personnellement, je n'utilise plus que mod_proxy_ajp depuis qu'il est
intégré à apache 2.2 (cad, de puis longtemps. Je ne pensais pas que mod_jk
était toujours utilisé ... ).
@Marco,
Dans les faits, mon plus grand problème est qu'une webapp ne démarre pas
pour un défaut de configuration et j'aimerais alors que Tomcat, plutôt que
de retourner une erreur 404, s'arrête.
Cyrille (Xebia)
@ Mike,
Cyrille (Xebia)
Mais comme tu l'auras compris, nous sommes Cyrille et moi convaincus que
c'est par HTTP que le salut vient. C'est d'ailleurs le point de vue que nous
avons tenté de mettre en avant dans l'historique d'AJP qui montre les
faiblesses du protocole devenu standard de facto. A mon sens, le succès
d'AJP vient surtout de son histoire et de toutes ces années ou il fût la seule
solution possible. Mais maintenant qu'il existe une solution full HTTP pour
faire tourner un serveur HTTP, je suis totalement partisan de cette
dernière.
Cette solution à été particulièrement appréciée par les auditeurs de
sécurité d'une grande régie de transport parisien qui préfère largement
l'homogénéité des flux réseaux. C'est très utile en résolution de problèmes
mais c'est aussi utile pour maintenir une topologie réseau simple.
Donc une fois encore les avantages principaux sont d'utiliser HTTP d'abord,
puis l'intégration native à Apache qui offre une facilité de configuration
largement accrue.
Cependant, selon l'adage il ne faut pas dire "Fontaine je ne boirai pas de ton
eau" , je n'exclue pas qu'un jour, HTTP soit dépassé par des protocoles
comme SPDY et que mod_proxy_balancer devienne moins intéressant que
des initiatives extérieures à Httpd comme mod_cluster .
Cyrille
exemple de configuration :
BalancerMember ajp://node1:8060 route=tomcat1 ping=2
BalancerMember ajp://node2:8060 route=tomcat2 ping=2
Pour moi le gros problème avec proxy_http, c'est que l'on a aucun
healthcheck, or un load balancing sans healthcheck, ca ne marche qu'en
fonctionnement nominal, quand tout est up and runing .....
C'est pour cela que sur les loadbalancer hardware type F5-BigIP, on peut
(et on doit) configurer une URL de healthcheck
--Fabrice
@Cyrille:
Dans les faits, mon plus grand problème est qu'une webapp ne démarre pas
pour un défaut de configuration et j'aimerais alors que Tomcat, plutôt que
de retourner une erreur 404, s'arrête.
->j'en parlé sur le forum tomcat mais il ne demordent pas que si la page est
absente un 404 est la bonne réponse http, on peut les comprendre, on
regrette juste que ce code de retour soit dans le marbe...*
@Cyrille
* La désactivation de noeud de cluster sur exception peut causer des arrêts
inattendus et être une faille importante de déni de service.
** Les mécanismes de Reply Timeout sont très délicats à gérer en cas de
requêtes longues.
c gentils de prevenir mais pour moi c trops tards ca ma déja planté mes 6
serveurs
@Fabrice,
Par conséquent, je vous rejoins sur l'intérêt d'un healthcheck pour tester la
disponibilité d'un noeud de cluster mais seulement si c'est un healthcheck
applicatif ; cela passerait probablement par le requêtage d'une URL.
Le ping AJP est en ce sens un faux ami à mes yeux. Il permet de détecter les
échecs de communication vers le connecteur que mod_jk et mod_proxy_balancer
détectent aussi en échouant l'acheminement d'une requête. Le seul gain est
que le ping AJP détectera peut être l'indisponibilité avec une tentative
@Marc,
Merci d'avoir défendu la cause de la 503 plutôt que la 404 en cas d'échec
de démarrage d'une web application !
J'avais une idée similaire : forcer l'arrêt d'un Tomcat si une application
échoue à démarrer. Un simple ContainerListener Tomcat devrait suffire. Dès
que je trouve le temps ...
Cyrille
Bonjour,
ServerName test-monsite.com
ServerAlias test-monsite.com
ErrorLog "logs/monsite.com-error.log"
CustomLog "logs/monsite.com-access.log" common
ProxyPass / ajp://127.0.0.1:8009/monsite/
ProxypassReverse / ajp://127.0.0.1:8009/monsite/
Merci d'avance
RewriteEngine On
RewriteRule ^/$ /monsite/index.do
RewriteRule (.*) asp://127.0.0.1:8009$1 [P]
et en supprimant les ProxyPass ...
Bonjour,
ServerName test-monsite.com
ServerAlias test-monsite.com
ErrorLog "logs/monsite.com-error.log"
CustomLog "logs/monsite.com-access.log" common
RewriteEngine On
RewriteRule ^/$ /monsite/index.do
RewriteRule (.*) ajp://127.0.0.1:8009$1 [P]
Cdt
Cdt
Bonjour,
@Jean,
Cyrille (Xebia)
@ toty
<Proxy balancer://my-application-cluster>
BalancerMember ajp://node-1:8009 route=node-1 disablereuse=On
# ...
BalancerMember ajp://node-n:8009 route=node-n disablereuse=On
</Proxy>
Cyrille (Xebia)
Bonjour,
Cdt
@Jean,
Cyrille (Xebia)
ServerName test-appli2.com
ServerAlias test-appli2.com
ErrorLog "logs/test-appli2.com-error.log"
CustomLog "logs/test-appli2.com-access.log" common
RewriteEngine On
RewriteRule ^/$ /appli2/index.do
RewriteRule (.*) ajp://127.0.0.1:8009$1 [P]
@Jean,
Cyrille (Xebia)
Je vous en prie
Cyrille
Bonjour,
J'ai développé une application multilangue en struts et mes urls sont sur
cette forme http://monsite/mapage.do?locale=fr.
Comment les transformer (avec apache je pense que c'est la meilleur
solution ???) pour qu'il soit visible pour l'utilisateur comme suit
http://monsite/fr/mapage.do.
Merci
Votre aide sera vraiment utile
@Jean,
@Jean,
LocaleFilter
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterC
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) req;
String to;
if (request.getPathInfo() == null) {
to = "/" + locale + request.getServletPath();
} else {
to = "/" + locale + request.getServletPath() + request.getPath
}
request.getRequestDispatcher(to).forward(request, response);
} else {
chain.doFilter(req, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO : code real implementation
defaultLocale = "fr";
supportedLocales = new HashSet<String>(Arrays.asList("fr", "en"));
}
...
}
Cyrille (Xebia)
Bonjour,
Merci pour la qualité de vos réponses.
J'ai testé la méthode de Cyrille, j'obtiens cependant une erreur 404:
ERROR RequestProcessor:664 - Invalid path /fr/index was requested
Cdt
@Jean,
Navré mais moi ça marche avec Tomcat 6.0.26 et une jsp de test "toto.jsp"
.
Quelle URL avez vous invoqué ? N'est-elle pas traitée par Struts qui cherche
une action enregistrée en "/fr/index.do" qui n'existerait pas ? N'auriez-vous
pas appelé "/" qui votre configuration "web.xml" redirigerait vers le
welcome-file "index.do" ?
Votre problème me fait penser au "filtrage fin des URL à traiter" que j'ai
évoqué précédemment
Bon courage,
Cyrille
@Jean,
<web-app ...>
<filter>
<filter-name>LocaleFilter</filter-name>
<filter-class>LocaleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LocaleFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
</web-app>
Cyrille (Xebia)
Mes urls sont traitées par struts. la configuration "web.xml" redirige vers le
welcome-file "index.do".
Et l'action recherchée dans mon struts-config est définie comme suit
Pour votre dernière remarque, si j'exclus les appels aux actions "*.do", le
LocaleFilter ne pourra pas s'appliquer
@Jean,
Cyrille (Xebia)
Alors,
Bonjour,
Merci pour votre réponse.
Cdl.
Toty
@Toty,
j'ai l'impression que vous avez oublié un paramètre important dans votre
configuration du load balancer.
Pour rappel Cyrille vous a fourni un exemple :
Proxy balancer://my-application-cluster>
BalancerMember ajp://node-1:8009 route=node-1 disablereuse=On
# ...
BalancerMember ajp://node-n:8009 route=node-n disablereuse=On
Bonjour,
J'ai essayé plusieurs fois mais je n'arrive toujours pas réécrire mes urls
sous le format http://monsite/fr/mapage.do. au lieu de http://monsite
/mapage.do?locale=fr. J'étais parti sur apache avec mod_rewrite mais il
parait que c'est mieux de le gérer dans la web application.
Pouvez vous me donner quelques piste svp?
Merci d'avance
Bonjour Jean,
Cyrille vous aidera sûrement sur la partie côté webapp. De mon côté j'ai une
solution fonctionnelle en mod_rewrite à vous de tester :
RewriteEngine on
RewriteRule ^([a-z]+)/(.*)\.do$ $2.do?locale=$1 [QSA,L]
@Jean,
Cyrille
(1) http://static.springsource.org/spring/docs/3.0.2.RELEASE/spring-
framework-reference/html/mvc.html#mvc-themeresolver
Bien cordialement,
Jean
@seven,
Merci effectivement cela marche très bien, j'avais tenté d'essayer de mettre
l'option failover.
Savez-vous dans quels cas et à quoi sert cette option? car sur le site
d'apache il indique que l'option est à utiliser lorsque notre backend et notre
front possède un firewall entre ?
Cordialement,
Toty
J'avoue être assez surpris que la RewriteRule ne fonctionne pas car je l'ai
testé en local sur un apache 2.0 .
Attention, la RewriteRule garantie qu'apache convertisse les requêtes
entrantes vers la nouvelle URL typiquement :
Utilisateur -> (Apache) /fr/mapage.do -> (Tomcat) /mapage.do?locale=fr
Apache n'est pas responsable de convertir les URLs fournies par la page
générée ccôté Tomcat. Il faut donc que la page web expose des URL
compatibles avec la règle de conversion:
Pour confirmer, vous pouvez commencer par tester l'url directement dans
votre navigateur http://localhost/fr/mapage.do pour vérifier que la page est
affiché avec la bonne locale.
Côté Apache il faudra aussi vous assurer que la RewriteRule soit bien
appliquée pour le contexte correspondant.
Séven.
Comment faire pour les urls qui contiennent aussi d'autres paramètres en
plus . ( http://monsite/mapage.do?param1=val1&locale=fr ou encore
http://monsite/mapage.do?param1=val1¶m2=val2&locale=en.
Cdt
@Jean,
Eh bien, il n'y a rien de plus à faire que d'ajouter vos paramètres comme à
votre habitude, ils seront reçus normalement du côté Tomcat.
C'est le rôle du drapeau QSA en fin de ligne de la RewriteRule, cela indique
simplement à Apache d'ajouter à l'URL convertie les paramètres reçus en
entrée.
Séven.
Laisser un commentaire
Nom (requis)
Site Web
Valider le commentaire