Tomcat在Apache httpd后面通过SSL(httpd工作,tomcat返回错误500)

时间:2016-09-23 09:00:36

标签: apache tomcat ssl proxy ajp

我有一个tomcat,正在侦听8080端口,并在端口80和443上侦听apache httpd。

  

httpd通过ajp将客户端代理到tomcat。这就像一个魅力。

我所做的陈述 - 上面引用 - 是错误的。我错误地假设我将代理设置为使用ajp-protocol,但我确实使用了普通的http。 这也导致了这个问题的答案。

但是,如果我尝试通过https进行连接,我会收到一个安全连接,显示错误500, 。我的猜测是,与httpd(443)的https连接正在运行,ajp-proxy也可以工作,但是tomcat期待我不知道的事情。

我已经尝试将代理连接到端口8443和8080.在我看来,只需要在端口8080上访问tomcat就足够了,因为无论如何都会通过httpd重定向所有流量。

以下是配置:

的/ etc / apache2的/位点可用/默认-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>

不幸的是,我无法提供任何日志,因为错误不会出现在任何日志中。

关于如何使这项工作的任何想法?

此致 ž

1 个答案:

答案 0 :(得分:1)

答案很简单。我不使用ajp,而是在未加密的网站上做一个简单的http代理。

所以最终有效的代码是:

<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协议比这更好。