2009-02-20 8 views
3

Suite à horrible, horrible errors, nous avons modifié la manière dont nous connectons Apache à Tomcat. Nous utilisions mod_jk:Utilisation de ProxyPass pour les pages mais pas les images

JkMount /path ajp13 

Maintenant, nous utilisons mod_proxy_ajp:

ProxyPass /path ajp://localhost:8009/path 
ProxyPassReverse /path ajp://localhost:8009/path 

Cependant, il y a une fonctionnalité qui JkMount offert, mais ProxyPass ne compte pas: la possibilité de sélectionner des types de fichiers. Cela a rendu possible l'utilisation de fichiers html par procuration, mais pas d'images - en d'autres termes, permettre à l'Apache rapide de bien servir le contenu statique, et de recourir au Tomcat lent uniquement pour les éléments dynamiques.

JkMount /*.html ajp13 

Est-il possible d'y parvenir avec ProxyPass? Peut-être en utilisant une directive <Location> ou quelque chose comme ça?

Répondre

5

Utilisation ProxyPassMatch:

ProxyPassMatch ^/(path/.*\.html)$ ajp://localhost:8009/$1 

Modifié: Correction de Marcus Downing

+0

L'utilisation d'une expression régulière a-t-elle des implications sur les performances? –

+0

L'expression régulière a des problèmes de performances lorsque vous avez des expressions surcomplexes. Pour ce genre d'expression régulière, ça va. – kmkaplan

1

Pas votre problème, mais quelque chose à surveiller pour utiliser cette configuration. Tout en utilisant apache mod_proxy pour se connecter à tomcat, mon journal d'erreurs montrait des connexions interrompues sous une charge modérée. Ajout de cela à httpd.conf résolu mes problèmes. poste de

SetEnv force-proxy-request-1.0 1 
SetEnv proxy-nokeepalive 1 
+0

Pouvez-vous expliquer ce que ceux-ci font? –

+0

désactive les connexions actives et demande à la requête d'utiliser http 1.0 au lieu de 1.1 – jlintz

+0

Correct. Je crois que les messages d'erreur d'origine où un symptôme d'un problème différent, mais je les recevais à la fois sur les applications internes et des applications tierces sur la même instance de tomcat. Quoi qu'il en soit, ces modifications ont effacé le journal des erreurs. –

1

kmkaplan est la bonne réponse, mais il m'a donné l'erreur:

Syntax error on line 32 of .../httpd-vhosts.conf: 
ProxyPass Unable to parse URL 

Il a travaillé quand j'ai changé la directive comme suit:

ProxyPathMatch ^/(path/.*\.html)$ ajp://localhost:8009/$1 

Je peux seulement supposer que mettre le $1 juste à côté du numéro de port 8009 était confus.

0

Nous utilisons les éléments suivants pour laisser Apache servir les images et définir les en-têtes expires raisonnable:

<Virtualhost *:80> 
    ServerName domain.com 
    ServerAlias *.domain.com 

    Alias /img/ /var/www/domain/img/ 
    <Directory /var/www/domain/img/> 
     ExpiresActive On 
     ExpiresByType image/gif "access plus 1 months" 
     ExpiresByType image/jpg "access plus 1 months" 
     ExpiresByType image/jpeg "access plus 1 months" 
     ExpiresByType image/png "access plus 1 months" 
     ExpiresByType image/x-icon "access plus 1 months" 
     ExpiresByType image/ico "access plus 1 months" 
     # This will prevent apache from having to check for a .htaccess file on each request. 
     AllowOverride None 
     # Allow symlinks. Otherwise, apache will make a separate call on each filename to ensure it is not a symlink. 
     Options +FollowSymLinks -SymLinksIfOwnerMatch 
     Order allow,deny 
     Allow from all 
    </Directory> 

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

    # Prevent domain.com/img from being served by Tomcat 
    ProxyPass /img ! 

    # Pass all other requests to Tomcat 
    ProxyPass/ajp://localhost:8009/ 

    # 1. Note that usually no ProxyPassReverse directive is necessary. The AJP request includes 
    # the original host header given to the proxy, and the application server can be expected to 
    # generate self-referential headers relative to this host, so no rewriting is necessary. 
    # 2. If you still want to use it, read this first: 
    # http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html 
    # ProxyPassReverse/http://domain.com/ 
</Virtualhost> 

Cependant, comme vous pouvez le voir, nous enregistrons des images en dehors de notre application Tomcat. Je ne sais pas si cela fonctionne aussi pour les images à l'intérieur de l'application.

Questions connexes