web-dev-qa-db-fra.com

Apache + Tomcat: Utilisation de mod_proxy au lieu de AJP

Existe-t-il un moyen de connecter Apache à Tomcat à l'aide d'un proxy HTTP, de sorte que Tomcat obtienne le nom d'hôte entrant correct plutôt que l'hôte local? J'utilise cette directive dans Apache:

ProxyPass /path http://localhost:8080/path

Mais cela arrive en tant que localhost, ce qui est inutile lorsque nous avons plusieurs sites sur le même serveur. Je pourrais définir l'hôte manuellement dans la configuration du serveur:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           proxyName="pretend.Host" proxyPort="80" />

Mais cela encore ne sert pas plus d'un site. Et je n'aime pas l'idée d'utiliser un port interne différent pour chaque site, cela semble vraiment moche.

N'y a-t-il aucun moyen de transférer le port lorsque je le proxy?

(Si vous demandez pourquoi je n'utilise pas seulement AJP, la réponse est cette erreur . J'essaie tout ce que je peux avant d'abandonner/ Tomcat et Apache entièrement )

20
Marcus Downing

Les paramètres que vous recherchez sont:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Notez que nous utilisons localhost comme cible proxy. Nous pouvons le faire puisque nous activons ProxyPreserveHost . La documentation indique que 

Il est surtout utile dans les configurations spéciales telles que l'hébergement virtuel basé sur le nom en masse avec proxy, où l'en-tête d'origine de l'hôte doit être évalué par le serveur principal.

ce qui ressemble exactement à ce que vous faites.

38
Robert Munteanu

Je pense que votre meilleur pari si vous voulez plusieurs sites sur le même serveur est d'utiliser des hôtes virtuels dans votre configuration Apache. Voici un exemple:

<VirtualHost *:80>
ServerName server.domain.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://server.domain.com:8080/
ProxyPassReverse / http://server.domain.com:8080/
<Location />
    Order allow,deny
    Allow from all
</Location>

Tant que server.domain.com est enregistré dans votre DNS externe, le nom d'hôte entrant sera affiché dans les URL du client. J'utilise un seul serveur hébergeant 6 sites distincts, dont 3 de retour par Tomcat, en utilisant cette méthode.

5
gareth_bowles

Vous pouvez toujours utiliser AJP, et vous devriez le faire puisqu'il est plus rapide que HTTP. Assurez-vous simplement de l'activer dans http.conf:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

Dans ce cas, cette configuration fonctionne pour moi:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / ajp://localhost:8080/
# ProxyPassReverse might not be needed,
# it's only for redirecting from inside.
#  ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
0
John Mikic