Я пытаюсь настроить сервер с несколькими веб-приложениями, которые будут обслуживаться через Apache VirtualHost (Apache работает на одном сервере). Мое основное ограничение заключается в том, что каждое веб-приложение должно использовать шифрование SSL. Пройдя некоторое время, погуглив и посмотрев другие вопросы о стековом потоке, я написал следующую конфигурацию для VirtualHost:
<VirtualHost 1.2.3.4:443>
ServerName Host.example.org
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/
</VirtualHost>
Хотя https://Host.example.org:844 доступно, https://Host.example.org нет, что противоречит цели моего виртуального хоста конфигурации. Firefox жалуется, что, хотя он успешно подключился к серверу, соединение было прервано. Я также получаю следующее предупреждение в Apache error.log:
proxy: no HTTP 0.9 request (with no Host line) on incoming request and preserve Host set forcing hostname to be Host.example.org for uri
В веб-приложении (сервер Tomcat) в журнале доступа отображается странный запрос доступа:
"?O^A^C / HTTP/1.1" 302
Ниже приведен правильный запрос доступа, который я получаю, когда подключаюсь напрямую к https://Host.example.org:844 :
"GET / HTTP/1.1" 302
Наконец, я должен также упомянуть, что виртуальный хост отлично работает, когда я не использую SSL.
Как я могу сделать эту работу?
Наконец-то я нашел способ заставить его работать. Сначала я попробовал предложение Дейва Чейни, поэтому я установил другой сертификат для сервера Apache, перенаправленного на Tomcat без порта SSL (поэтому прокси-сервер перенаправлял на http: // localhost: 8080 / ). К сожалению, он не работал полностью, так как в веб-браузере https был преобразован в http сразу после подключения. Поэтому я вернулся к использованию https: // localhost: 8443 / , и последнее, что заставило его работать, было добавление снова SSLProxyEngine.
Вот итоговая конфигурация VirtualHost:
<VirtualHost 1.2.3.4:443>
ServerName Host.domain.org
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/Apache2/ssl/certificate.crt
SSLCertificateKeyFile /etc/Apache2/ssl/certificate.key
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/
</VirtualHost>
Попробуйте этот конфиг
<VirtualHost 1.2.3.4:443>
ServerName Host.domain.org
SSLEngine On
# include other ssl options, like cert and key here
ProxyRequests Off
ProxyPreserveHost On
<Location />
ProxyPass http://localhost:8443/
</Location>
</VirtualHost>
Если вашему приложению необходим доступ к информации SSL из прокси-соединения, вам следует рассмотреть возможность использования mod_proxy_ajp и коннектора Tomcat ajp1.3.
Но если ваша цель - запустить несколько веб-приложений с поддержкой ssl на одном сервере. добавление Apache впереди не приведет к их балансировке с помощью вышеуказанного конфига, вам все равно понадобится балансировщик нагрузки или вы можете использовать прокси-балансировочный модуль Apache с чем-то вроде следующего:
ProxyRequests Off
<Proxy balancer://someapplication>
BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>
<VirtualHost 1.2.3.4:443>
SSLEngine on
SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile //path/to/key.pem
SSLVerifyClient optional
RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
<Location />
SetHandler balancer-manager
Order allow,deny
Allow from all
</Location>
ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on
Что я не понимаю, так это то, почему вам нужно иметь SSL-соединение между вашим Apache и вашим приложением, которое, кажется, находится на той же машине ( http: // localhost: 8443 / ).
Я предполагаю, что обычный способ настроить такие вещи - это обеспечить Apache шифрование SSL на стороне клиента, например, Интернет, и иметь незашифрованное подключение к приложению. Это также дает вам больше свободы для отладки ответов вашего приложения.
Еще одна вещь, о которой упоминал Дейв Чейни, - это использовать собственный разъем Tomcat для балансировки нагрузки и других функций.
Вам действительно нужен прокси для службы HTTPS? Возможно, вы захотите использовать прокси для службы не-ssl в localhost, например,.
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
Сначала я посмотрю, можно ли сделать запрос с localhost на localhost: 8443 и посмотреть, успешно ли это (IE делает GET или wget http: // localhost: 844 )
Я не совсем уверен, почему ваш виртуальный хост прослушивает порт 443, а затем передает его на другой хост SSL
почему приложение не может просто использовать 443 изначально? если вы не можете изменить его, вы можете просто использовать iptables для перенаправления порта
Проверьте журнал ошибок SSL и убедитесь, что у вас нет ошибок, связанных с невозможностью проверки цепочки сертификатов CA.