Tomcat 通过 SSL 在 Apache httpd 后面(httpd 工作,tomcat returns 错误 500)
Tomcat behind Apache httpd via SSL (httpd works, tomcat returns error 500)
我有一个 tomcat,侦听端口 8080 和一个 apache httpd,侦听端口 80 和 443。
The httpd proxies the client through to tomcat via ajp. This works like a charm.
我在上面引用的声明是错误的。我错误地假设我将代理设置为使用 ajp 协议,但我确实使用了纯 http。 这也引出了这个问题的答案。
但是,如果我尝试通过 https 连接,我会得到一个安全连接,该连接显示未在 任何地方 记录的错误 500。我的猜测是,与 httpd (443) 的 https 连接正在工作,ajp 代理也可以工作,但是 tomcat 期望一些我不知道的事情。
我已经尝试将代理连接到端口 8443 和 8080。在我看来,在端口 8080 上访问 tomcat 就足够了,因为无论如何所有流量都通过 httpd 重定向。
配置如下:
/etc/apache2/sites-available/default-ssl
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel error
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.doma.in
ServerAlias doma.in
ServerSignature Off
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl_certificate.crt
SSLCertificateKeyFile /etc/ssl/certs/ssl_certificate.key
SSLCertificateChainFile /etc/ssl/certs/intermediate_ca.crt
ProxyPass / ajp://localhost:8080/ retry=0 timeout=240
ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
</IfModule>
/etc/tomcat7/server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URLEncoding="UTF-8" />
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8080" URLEncoding="UTF-8" /> also tried this, but same result. -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>
</Engine>
</Service>
</Server>
很遗憾,我无法提供任何日志,因为错误没有出现在任何日志中。
关于如何使这项工作有任何想法吗?
此致
z
答案很简单。我不使用ajp,而是在未加密的网站上做一个简单的http-proxy。
所以最终有效的代码是:
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel error
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.doma.in
ServerAlias doma.in
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl_certificate.crt
SSLCertificateKeyFile /etc/ssl/certs/ssl_certificate.key
SSLCertificateChainFile /etc/ssl/certs/intermediate_ca.crt
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
</IfModule>
虽然在性能方面,ajp 协议比这个更可取。
我有一个 tomcat,侦听端口 8080 和一个 apache httpd,侦听端口 80 和 443。
The httpd proxies the client through to tomcat via ajp. This works like a charm.
我在上面引用的声明是错误的。我错误地假设我将代理设置为使用 ajp 协议,但我确实使用了纯 http。 这也引出了这个问题的答案。
但是,如果我尝试通过 https 连接,我会得到一个安全连接,该连接显示未在 任何地方 记录的错误 500。我的猜测是,与 httpd (443) 的 https 连接正在工作,ajp 代理也可以工作,但是 tomcat 期望一些我不知道的事情。
我已经尝试将代理连接到端口 8443 和 8080。在我看来,在端口 8080 上访问 tomcat 就足够了,因为无论如何所有流量都通过 httpd 重定向。
配置如下:
/etc/apache2/sites-available/default-ssl
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel error
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.doma.in
ServerAlias doma.in
ServerSignature Off
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl_certificate.crt
SSLCertificateKeyFile /etc/ssl/certs/ssl_certificate.key
SSLCertificateChainFile /etc/ssl/certs/intermediate_ca.crt
ProxyPass / ajp://localhost:8080/ retry=0 timeout=240
ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
</IfModule>
/etc/tomcat7/server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URLEncoding="UTF-8" />
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8080" URLEncoding="UTF-8" /> also tried this, but same result. -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>
</Engine>
</Service>
</Server>
很遗憾,我无法提供任何日志,因为错误没有出现在任何日志中。
关于如何使这项工作有任何想法吗?
此致 z
答案很简单。我不使用ajp,而是在未加密的网站上做一个简单的http-proxy。
所以最终有效的代码是:
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_engine.log
LogLevel error
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.doma.in
ServerAlias doma.in
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl_certificate.crt
SSLCertificateKeyFile /etc/ssl/certs/ssl_certificate.key
SSLCertificateChainFile /etc/ssl/certs/intermediate_ca.crt
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
</IfModule>
虽然在性能方面,ajp 协议比这个更可取。