このサイトでWebアプリを公開したい。
仕事ではJBoss Enterprise Application Server(JBoss EAP)を使う機会が多いのでそれを使いたいがライセンス料がかかる。無償かつ、EAPと同様の機能を持っているWildflyを使用する。
概要
- セキュリティや柔軟性・機能性を踏まえて、フロントにapacheを配置し、そのバックエンドにwildflyを配置する構成とする。そのため、wildflyでバインドするインターフェイスは127.0.0.1(lo)とし、外部から直接wildflyを参照できないようにする。apache側では所定のコンテキスト名を含むhttp要求をwildfly側に転送するように設定する。
- wildflyのsysmtedサービス化に関しては、wildfly付属のdocs/contrib/scripts/systemd/にあるsystemd用ファイル群を使用する。これらのファイルを使った設定方法は、READMEの記載内容に沿う。
- READMEの手順通りに実行してもsystemctl startができない。確認してみた所、/opt/wildfly-12.0.0.Finalディレクトリのオーナがwildflyに変更されていなかったので、このディレクトリに対してもchownする手順を追加した。
- CentOS7, Apache2.4, Wildfly11を使用する。
構築手順
前提ソフトウェアのインストール
JDK(openjdk, openjdk-devel)をインストールする。
# yum install java ... Installing: java-1.8.0-openjdk x86_64 ... ... # yum install java-1.8.0-openjdk-devel ... # java -version openjdk version "1.8.0_xxx" ... # javac -version javac 1.8.0_xxx # alternatives --list ... java_sdk_1.8.0 auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.... ...
Wildflyのインストール
Wildfly付属のREADMEに沿ってWildflyをsystemdのサービスとして登録する。
ローカルからしかアクセスできないので、curlを使って動作確認する。
JAVA_HOMEはalternativeで公開される”/usr/lib/jvm/java-1.8.0-openjdk”を使用するものとする。(”/usr/lib/jvm/java-1.8.0-openjdk-1.8.0…”のようにJDKの物理パスを指定した場合、yum等でJDKをアップデートすると物理パスが変わってしまいWildflyを起動できなくなるため。)
# useradd -r -d /opt/wildfly -s /sbin/nologin wildfly # cd /opt/ # unzip ~/work/wildfly-11.0.0.Final.zip # ln -s /opt/wildfly-11.0.0.Final /opt/wildfly # cd /opt/wildfly/docs/contrib/scripts/systemd/ # mkdir /etc/wildfly # cp wildfly.conf /etc/wildfly # cp wildfly.service /etc/systemd/system/ # cp launch.sh /opt/wildfly/bin/ # cd /opt/wildfly/bin # cp -p standalone.conf standalone.conf.org # vi standalone.conf ※JDKの指定、ログ出力先を/var/log/wildflyに変更 ... # # Specify the location of the Java home directory. If set then $JAVA will # be defined to $JAVA_HOME/bin/java, else $JAVA will be "java". # #JAVA_HOME="/opt/java/jdk" JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" ... # local setting JAVA_OPTS="$JAVA_OPTS -Djboss.server.log.dir=/var/log/wildfly" ... # vi launch.sh #!/bin/bash if [ "x$WILDFLY_HOME" = "x" ]; then #WILDFLY_HOME="/opt/wildfly" WILDFLY_HOME="/opt/wildfly-11.0.0.Final" fi ... # cd /opt/wildfly/standalone/configuration # cp -p standalone.xml standalone.xml.org # vi standalone.xml ※下記のajp-listenerの行を追加 ... <subsystem xmlns="urn:jboss:domain:undertow:4.0"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/> <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/> <ajp-listener name="ajp" socket-binding="ajp" /> <host name="default-host" alias="localhost"> ... # cd /etc/wildfly # vi wildfly.conf ... # The address to bind to #WILDFLY_BIND=0.0.0.0 WILDFLY_BIND=127.0.0.1 ... # chown -R wildfly.wildfly /opt/wildfly # chown -R wildfly.wildfly /opt/wildfly-11.0.0.Final # mkdir /var/log/wildfly # chown -R wildfly.wildfly /var/log/wildfly # systemctl start wildfly.service # systemctl status wildfly.service # systemctl enable wildfly.service Created symlink from /etc/systemd/system/multi-user.target.wants/wildfly.service to /etc/systemd/system/wildfly.service. # curl http://localhost:8080 <!-- ~ JBoss, Home of Professional Open Source. ~ Copyright (c) 2014, Red Hat, Inc., and individual contributors ~ as indicated by the @author tags. See the copyright.txt file in the ~ distribution for a full listing of individual contributors. ~ ...
- useraddで-rオプションを指定し、システムアカウントとしてwildflyユーザを作成する。パスワードは指定せずに”disabled password”状態(ログインは可能だがパスワード認証不可)とする。
- ログの出力先を変更するために、standalone.confでjboss.server.log.dirを定義しています。
- 特定バージョンに依存しないよう/opt/wildflyシンボリックリンクを定義していますが、起動時に次の警告が出力されるため、launch.shのWILDFLY_HOME値を変更しました。
WFLYSRV0266: Server home is set to ‘/opt/wildfly/standalone’, but server real home is ‘/opt/wildfly-11.0.0.Final/standalone’ – unpredictable results may occur.
- バインドするインターフェイスが0.0.0.0だと外部から直接Wildflyを参照できてしまうので、127.0.0.1を使用する。
Apacheの設定変更
特定のURL(/app)をwildflyに転送するように設定する。
これを行うためにはapacheのmod_proxy, mod_proxy_ajpを使用する。
wildfly側には、”/app”に対応するアプリを後でデプロイする想定で設定します。
(注意)localsite.confというファイルは、サイト固有の設定をするために私が独自に作成したファイルです。実際にはhttpd.conf等の読者さんの環境に合わせた設定ファイルを編集してください。
# cd /etc/httpd/conf.d/ # vi localsite.conf ※下記を追加 ... ProxyRequests Off ProxyPass /app ajp://localhost:8009/app/ ProxyPassReverse /app ajp://localhost:8009/app/ ... # systemctl restart httpd.service # systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded ... Active: active (running) ... ...
動作確認
wildflyにサンプルのアプリ(war)をデプロイし、apache経由で参照できるか確認します。
サンプルアプリapp.warが~root/workに配置した前提で手順を記載します。
CLIを使ってアプリをデプロイします。
tail等を使ってログを確認し、正常にデプロイされた(“Deployed”が表示されている)ことを確認します。
# cd /opt/wildfly/bin/ # ./jboss-cli.sh --connect "deploy --force ~root/work/app.war" # tail /opt/wildfly/standalone/log/server.log ... INFO [org.jboss.as.server] (management-handler-thread - 2) WFLYSRV0010: Deployed "app.war" (runtime-name : "app.war") ...