2009-06-05 13 views
20

Esiste un modo per connettere Apache a Tomcat utilizzando un proxy HTTP in modo che Tomcat ottenga il nome host in entrata corretto anziché localhost? Sto usando questa direttiva in Apache:Apache + Tomcat: utilizzo di mod_proxy anziché di AJP

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

Ma passa attraverso come localhost, che è inutile quando abbiamo un sacco di siti sullo stesso server. Ho potuto impostare manualmente l'host nella configurazione del server:

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

Ma ancora una volta non serve più di un sito. E non mi piace l'idea di usare una porta interna diversa per ogni sito, che suona davvero brutta.

Non esiste un modo per trasferire la porta quando la si esegue il proxy?

(Se chiedete il motivo per cui non mi basta usare AJP, la risposta è this error. Sto provando tutto il possibile prima di rinunciare a Tomcat and Apache entirely)

risposta

36

Le impostazioni che stai cercando sono:

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

Si noti che stiamo usando localhost come destinazione proxy. Possiamo farlo poiché abilitiamo ProxyPreserveHost. La documentazione indica che

È utile soprattutto in configurazioni speciali come l'hosting virtuale basato sul nome di massa proxy, in cui l'intestazione host originale deve essere valutata dal server di backend.

che suona esattamente come quello che si sta facendo.

+1

Eccellente, è esattamente ciò di cui avevo bisogno. Grazie! –

+0

Come faresti per i file statici? Cioè come diresti ad Apache di server tutto ciò che è richiesto da '/ static', come avresti impostato la radice del documento per questo? – Luke

+0

@Luke - ProxyPassMatch dovrebbe aiutarti: http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypassmatch –

5

Credo che la soluzione migliore se si vuole più siti su lo stesso server utilizza host virtuali nella configurazione di Apache. Ecco un esempio:

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

Finché hai server.domain.com registrato nel DNS esterno, il nome host in ingresso verrà visualizzato in URL del cliente. Sto utilizzando un singolo server che ospita 6 siti separati, inclusi 3 che sono tornati da Tomcat, utilizzando questo metodo.

+0

Stiamo ovviamente utilizzando host virtuali in Apache, ma mi stava usando localhost in la direttiva ProxyPass. L'utilizzo del dominio appropriato è invece accettabile, ma non del tutto perfetto: sovrascrive il dominio su cui è arrivata la richiesta, informazioni che vengono poi utilizzate lungo la linea. –

0

È ancora possibile utilizzare AJP, e si dovrebbe poiché è più veloce di HTTP. Basta fare in modo di consentire in http.conf:

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

In questo caso, questa configurazione funziona per me:

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