0
votes

I have a tomcat, listening on port 8080 and an apache httpd listening on ports 80 and 443.

The httpd proxies the client through to tomcat via ajp. This works like a charm.

The statement I made - quoted above - is wrong. I mistakenly assumed I set the proxy to use ajp-protocol, but I did really use plain http. This also lead to the answer of this question.

But if I try to connect via https, I get a secure connection which displays an error 500 that isn't logged anywhere. My guess is, that the https-connection to the httpd (443) is working, the ajp-proxy also works, but tomcat expects something I do not know about.

I already tried to connect the proxy to ports 8443 and 8080. In my opinion it would suffice for tomcat to be accessed on port 8080, because all traffic is redirected through httpd anyway.

Here is the configuration:

/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>

Unfortunately I can't provide any logs, because the error does not appear in any of them.

Any ideas on how to make this work?

Sincerely z

1
Star by matching slashes in the proxypass directives like ` ProxyPass / ajp://localhost:8080/` and try again. On a sidenote, you don't need RewriteEngine on at all, so you could also remove it.ezra-s
@ezra-s I added the missing slashes. Unfortunately this didn't change the outcome. The RewriteEngine is a remnant of a block I use for some url tweaking (that will not take effect for the URL I'm testing).zoku

1 Answers

1
votes

The answer was quite easy. I don't use ajp, but do a simple http-proxy on the unencrypted site.

So in the end the code that worked was:

<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>

Performance-wise the ajp-protocol would be preferable to this, though.