Apache2 + Tomcat статические ресурсы - PullRequest
0 голосов
/ 27 августа 2018

Я установил Apache2 в качестве обратного прокси-сервера для Tomcat. Мой server.xml в Tomcat имеет следующую конфигурацию AJP:

<!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

Конфигурация Apache:

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
        SSLProxyEngine On
SSLEngine On
SSLCertificateFile /home/xxxxxx/store/f******.pem
SSLCertificateKeyFile /home/xxxxxx/p*******.pem
    # Servers to proxy the connection, or
    # List of application servers Usage
    ProxyPass / ajp://localhost:8009/x/
    ProxyPassReverse / ajp://localhost:8009/x/
    ServerName localhost
</VirtualHost> 

Мое веб-приложение использует Spring Security. В настоящее время Apache прекрасно обслуживает страницы (jsp), но не имеет статических ресурсов. Невозможно добраться ни до какого ресурса. Если я поставлю в браузере

https://example.com/x/resources/img/logo.jpg

Я не вижу логотип. Но если я поставлю

https://example.com:8443/x/resources/img/logo.jpg

Похоже.

Любая помощь будет приветствоваться.

Заранее спасибо, ребята; -)

1 Ответ

0 голосов
/ 27 августа 2018

Вы не отображаете URL так, как хотите. У вас есть:

ProxyPass / ajp://localhost:8009/x/

Это означает, что часть /x уже находится в URL и скрыта вне Apache. Так что если вы хотите /x/resources/img/logo.jpg от Tomcat, тогда URL будет http://hostname.tld/resources/img/logo.jpg вне Apache.

Если вы хотите сохранить /x в пути, измените ваше отображение на

ProxyPass / ajp://localhost:8009/

так что /x будет пройдено.

EDIT

В целях ясности и предотвращения множества комментариев я опишу четыре основных способа использования Apache перед Tomcat.

1 - Чистый проход. В этом случае ваша конфигурация Apache выглядит как ProxyPass / ajp://localhost:8009/ (или ProxyPass / http://localhost:8080/ для HTTP-прокси). Экземпляр Tomcat получает тот же URL, что и Apache. Я использовал это, чтобы позволить Apache быть конечной точкой SSL, поскольку это проще и лучше документировано о том, как настроить SSL на Apache. Обычно в этом случае существует только один виртуальный хост Tomcat.

2 - перезапись URL (вроде). Это то, на что ты сейчас смотришь. Конфигурация Apache выглядит как ProxyPass / ajp://localhost:8009/appName/. Это позволяет вам «скрыть» часть URL appName. Поэтому, если внешний пользователь запрашивает http://hostname.tld/blah.jpg, URL-адрес, который отправляется Tomcat, является /appName/blah.jpg. Единственная проблема с этой настройкой состоит в том, что код на стороне Tomcat, который генерирует ссылку (т. Е. Тег привязки HTML), должен знать, что создать URL, который включает в себя /appName в нем. В этом случае может быть несколько виртуальных хостов Tomcat, которые могут быть параллельно виртуальным хостам Apache.

3 - Apache обслуживает статические ресурсы. В этом случае ваше отображение в Apache выглядит примерно так: ProxyPass /dynamic ajp://localhost:8009/appName/. Вы бы запрашивали ресурсы Tomcat как-то вроде http://hostname.tld/dynamic/index.jsp. Вы переместили бы свои статические ресурсы куда-нибудь, где Apache мог бы получить к ним доступ и обработать это с помощью префикса в URL-адресе, например http://hostname.tld/static/picture.jpg. Это может быть сделано с помощью правил перезаписи или других конфигураций Apache.

4 - Забудь про Apache. Запустите Tomcat как пользователь, который может связываться с портом 80 (root в Unix-подобных средах) и просто обслуживать все из Tomcat. SSL немного затруднит настройку, но это можно сделать, и контекст веб-приложения (т. Е. /x в вашем случае) можно устранить несколькими способами, самым простым из которых является размещение вашего контента в ROOT для Tomcat.

Дайте мне знать, если это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...