FreeBSD で Apache Tomcat を動かす

前提条件


Apache httpd

Apache httpd をportsでインストールする

いくつかのコンパイルオプションを有効にするために ports からインストー ルします。

# cd /usr/ports/www/apache24
# make install clean 

/boot/loader.conf

HTTP/SSLバッファリング用のカーネルモジュールを有効にします。

accf_http_load="YES"
accf_data_load="YES"

/etc/rc.conf

apache24_enable="YES"
apache24_http_accept_enable="YES"

/usr/local/etc/apache24/extra/httpd-ssl.conf

Let's Encryptの証明書を使用します。

SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.next-hop.net/fullchain.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.next-hop.net/privkey.pem"

/usr/local/etc/apache24/httpd.conf

プロキシでAJPとWebSocketが使えるようにコメントを外します。

LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_wstunnel_module libexec/apache24/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module libexec/apache24/mod_proxy_ajp.so

/usr/local/etc/apache24/Includes/proxy.conf

サンプルプログラムをApacheから起動できるようにプロキシでリダイレクトします。

ProxyPass /examples/websocket/ ws://localhost:8080/examples/websocket/
ProxyPassReverse /examples/websocket/ ws://localhost:8080/examples/websocket/
ProxyPass /examples/ ajp://localhost:8009/examples/

Apache httpd を起動する

# /usr/local/etc/rc.d/apache start

Apache Tomcat

Tomcat8をパッケージでインストールする

# pkg install tomcat8

/etc/rc.conf

tomcat8_enable="YES"

/usr/local/apache-tomcat-8.0/conf/tomcat-users.xml

<user username="tomcat" password="secret" roles="manager-gui,admin-gui"/>

/usr/local/apache-tomcat-8.0/conf/server.xml

TLSを有効にします。

<Connector port="8443"
	   protocol="org.apache.coyote.http11.Http11NioProtocol"
	   maxThreads="150" SSLEnabled="true"
           scheme="https" secure="true"
	   clientAuth="false" sslProtocol="TLS"
           keystoreFile="/usr/local/apache-tomcat-8.0/.keystore"
           keyAlias="tomcat" keyPass="changeit" keystorePass="changeit" />

/usr/local/apache-tomcat-8.0/webapps/manager/WEB-INF/web.xml

マネージャのアップロード制限を大きくします。

--- web.xml.old 2016-05-01 15:57:43.000000000 +0900
+++ web.xml     2016-05-01 19:57:27.000000000 +0900
@@ -51,9 +51,9 @@
  </init-param>
  -->
    <multipart-config>
      -      <-- 50MB max -->
      -      <max-file-size>52428800</max-file-size>
      -      <max-request-size>52428800</max-request-size>
      +      <;-- 500MB max -->
      +      <max-file-size>524288000</max-file-size>
      +      <max-request-size>524288000</max-request-size>
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>
  </servlet>

Let's Encrypt の証明書を Tomcat で使う

Let's Encrypt の証明書はそのままでは Tomcat で使えないので、 OpenSSL を用いて一旦 PKCS#12 形式に変換してから JDK の keytool を 用いてキーストアに変換します。
これらを一括で行うために以下のスクリプトを実行します。

#!/bin/sh

export LANG=C
LEDIR="/usr/local/etc/letsencrypt/live"
TOMCATDIR="/usr/local/apache-tomcat-8.0"
JAVABIN="/usr/local/openjdk8/bin"
HOSTNAME="`uname -n`"
SHORTNAME="tomcat"
KEYSTORE=".keystore"
PASSWD="changeit"

cd $TOMCATDIR
openssl pkcs12 -export -in $LEDIR/$HOSTNAME/cert.pem -inkey $LEDIR/$HOSTNAME/privkey.pem -out $HOSTNAME.p12 -name $SHORTNAME -CApath $LEDIR/$HOSTNAME/chain.pem -caname root -passout pass:

if [ -f $TOMCATDIR/$KEYSTORE ]; then
        $JAVABIN/keytool -list -keystore $KEYSTORE -storepass $PASSWD
        cp -p $TOMCATDIR/$KEYSTORE $TOMCATDIR/${KEYSTORE}.old
        rm -f $TOMCATDIR/$KEYSTORE
fi
$JAVABIN/keytool -importkeystore -deststorepass $PASSWD -destkeypass $PASSWD -destkeystore $KEYSTORE -srckeystore $HOSTNAME.p12 -srcstoretype PKCS12 -srcstorepass "" -alias $SHORTNAME
$JAVABIN/keytool -import -trustcacerts -alias root -file $LEDIR/$HOSTNAME/chain.pem -keystore $KEYSTORE -storepass $PASSWD
$JAVABIN/keytool -list -keystore $KEYSTORE -storepass $PASSWD
rm -f $HOSTNAME.p12

以下のようにキーストアが作成されます。

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 2 entries

root, Dec 3, 2016, trustedCertEntry,
Certificate fingerprint (SHA1):
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
tomcat, Dec 3, 2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

Tomcat を起動する

# service tomcat8 start

Tomcat の動作を確認する

Tomcatに直接アクセスしてみます。

http://tomcat.next-hop.net:8080/
https://tomcat.next-hop.net:8443/

Tomcat

サンプルプログラムがすべてのパターンで動作することを確認します。

http://tomcat.next-hop.net:8080/examples/
https://tomcat.next-hop.net:8443/examples/
http://tomcat.next-hop.net/examples/
https://tomcat.next-hop.net/examples/

Tomcat

と言いつつ、WebSocketがhttpd経由だと動かない...


参考