Использование ProxyPass для страниц, но не для изображений
Вопрос
В результате ужасные, ужасные ошибки, мы изменили способ подключения Apache к Tomcat.Мы использовали mod_jk
:
JkMount /path ajp13
Теперь мы используем mod_proxy_ajp
:
ProxyPass /path ajp://localhost:8009/path
ProxyPassReverse /path ajp://localhost:8009/path
Однако есть особенность, которая JkMount
предлагали, но ProxyPass
не делает:возможность выбора по типам файлов.Это позволило использовать прокси-файлы html, но не изображения - другими словами, позволить хорошему быстрому Apache обслуживать статический материал и прибегать к медленному Tomcat только для динамического материала.
JkMount /*.html ajp13
Есть ли какой-нибудь способ достичь этого с помощью ProxyPass
?Возможно, используя окружающий <Location>
директива или что-то в этом роде?
Решение
Использование Совпадение прокси - паролей:
ProxyPassMatch ^/(path/.*\.html)$ ajp://localhost:8009/$1
Отредактированный:Поправка Маркуса Даунинга
Другие советы
Не ваша проблема, но на что следует обратить внимание при использовании этой конфигурации.При использовании apache mod_proxy для подключения к tomcat в моем журнале ошибок отображались обрывы соединений при умеренной нагрузке.Добавление этого в httpd.conf решило мои проблемы.
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
сообщение kmkaplan - правильный ответ, но оно выдало мне ошибку:
Syntax error on line 32 of .../httpd-vhosts.conf:
ProxyPass Unable to parse URL
Это сработало, когда я изменил директиву на read:
ProxyPathMatch ^/(path/.*\.html)$ ajp://localhost:8009/$1
Я могу только предположить, что, поместив $1
прямо рядом с номером порта 8009
это сбивало с толку.
Мы используем следующее, чтобы позволить Apache обслуживать изображения и устанавливать разумные заголовки expires:
<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>
Однако, как вы можете видеть, мы храним изображения вне нашего приложения Tomcat.Я не знаю, работает ли это также для изображений внутри приложения.