2009-06-05 28 views
20

¿Hay alguna forma de conectar Apache a Tomcat utilizando un proxy HTTP de manera que Tomcat obtenga el nombre de host entrante correcto en lugar de localhost? Estoy usando esta directiva en Apache:Apache + Tomcat: utilizando mod_proxy en lugar de AJP

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

sino que viene a través como localhost, que no sirve para nada cuando tenemos un montón de sitios en el mismo servidor. Pude configurar el host manualmente en la configuración del servidor:

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

Pero eso no sirve para más de un sitio. Y no me gusta la idea de usar un puerto interno diferente para cada sitio, eso suena realmente feo.

¿No hay forma de transferir el puerto cuando lo proxy?

(Si usted pregunta por qué no me acaba de uso AJP, la respuesta es this error. Estoy intentando todo lo que pueda antes de abandonar Tomcat and Apache entirely)

Respuesta

36

La configuración que está buscando son:

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

Tenga en cuenta que estamos utilizando localhost como objetivo proxy. Podemos hacer esto ya que habilitamos ProxyPreserveHost. La documentación indica que

Es principalmente útil en configuraciones especiales como el servidor virtual basado en nombre masivo con proxy, donde el servidor de back-end necesita evaluar el encabezado Host original.

que suena exactamente como lo que está haciendo.

+1

Excelente, eso es exactamente lo que necesitaba. ¡Gracias! –

+0

¿Cómo se abastecerían los archivos estáticos? Es decir. ¿Cómo le dirías a Apache al servidor todo lo solicitado desde '/ static' cómo establecerías la raíz del documento para esto? – Luke

+0

@Luke - ProxyPassMatch debería ayudarlo: http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypassmatch –

5

Creo que la mejor opción si desea que varios sitios en el mismo servidor es usar hosts virtuales en su configuración de Apache. He aquí un ejemplo:

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

Como siempre y cuando tenga server.domain.com registrado en su DNS externo, el nombre de host de entrada se mostrará en las URL de los clientes. Estoy ejecutando un servidor único que hospeda 6 sitios separados, incluidos 3 que están de regreso por Tomcat, usando este método.

+0

Estamos, por supuesto, el uso de máquinas virtuales en Apache, pero yo estaba usando localhost en la directiva ProxyPass. En su lugar, usar el dominio apropiado es aceptable, pero no del todo perfecto: anula el dominio en el que entró la solicitud, información que luego se utiliza en el futuro. –

0

Aún puede usar AJP, y debe hacerlo ya que es más rápido que HTTP. Sólo asegúrese de habilitarlo en http.conf:

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

En ese caso, esta configuración funciona para mí:

<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> 
Cuestiones relacionadas