【APサーバ】Apache2とTomcat外部連携

TomcatをVMWearのCentOSに移してみようかと思い設定してみました。

  • VMWearのCentOS側の設定

    「http://Raspbain側のIP/examples/servlets/」でアクセスして
    VMWearのCnetOS側にTomcatログが出力されているようであれば成功です。
    ・・・しかし私の環境では接続が上手く出来ませんでした。
    急いではいないので、また別の機会に試そうと思います。

  • バージョン確認の方法

    【CentOS】

    1httpd -v
    2$CATALINA_HOME/bin/version.sh
    Apache2:Server version: Apache/2.2.15 (Unix)
    Tomcat:Apache Tomcat/7.0.42
    Architecture:amd64
    JVM Version:1.7.0_45-b18
    Apache2とTomcatを連携済。
    

    【Raspbain】

    1apache2 -v
    2$CATALINA_HOME/bin/version.sh
    Apache2:Apache/2.2.22 (Debian)
    Tomcat:Apache Tomcat/7.0.55
    Architecture:arm
    JVM Version:1.7.0_40-b43
    Apache2とTomcatを連携済。
    

【APサーバ】Tomcat起動ログ確認

Tomcatの起動ログ確認してみたところ、
予想はしていましたが、WARNINGやjarファイルに関するログが出てました。

【1つ目】

jar not loaded. See Servlet Spec

自動展開後の「$CATALINA_HOME/webapps/コンテキスト名/WEB-INF/lib」にあるjarファイルと
Tomcat固有で保持している「$CATALINA_HOME/lib」にあるjarファイルが重複していると
jarファイルをロードしていない旨のログが発生するようです。

というわけで、「el-api.jar」と「servlet-api.jar」を前者から削除しました。

【2つ目】

inside the host appBase has been specified, and will be ignored

コンテキスト名.xmlのdocBase属性値がTomcatのデフォルト設定値と等しい場合、
冗長な設定ということで、コンテキスト名.xmlを修正しました。

1vi /tomcat/apache-tomcat-7.0.55/conf/Catalina/localhost/コンテキスト名.xml
# 下記内容を変更
<Context path="/コンテキスト名" reloadable="true" docBase="/tomcat/apache-tomcat-7.0.55/webapps/コンテキスト名" />
↓
<Context path="/コンテキスト名" />

reloadableも重そうな気がしたし、更新する時は大抵再起動するので、削除しました。
Tomcatを再起動すると、WARNINGやjarファイルに関するログは消えました。

Tomcatの再起動時にrestart指定で実行すると、まれにエラーが発生してる。
呼び出しが早すぎるのか、stopする前にstartが呼ばれてたりするのかはよくわからず。
stop指定してから3秒後くらいにstart指定で再起動するとエラーは発生せず。
今のところは気にせずいきます。

【APサーバ】warファイル配置

ローカル環境で作成しておいたwarファイルを
Raspberry PiのTomcatに配置するので、
まずはTomcatの設定を確認します。

1vi /tomcat/apache-tomcat-7.0.55/conf/server.xml
# 下記内容が設定されていることを確認
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

【unpackWARs】
webappsに配置したwarファイルを自動展開するかの設定。

【autoDeploy】
Tomcat動作中に自動的にアプリケーションをデプロイしてくれるようにするかの設定。

デフォルトで両方trueになっていたので、
自動展開しつつ、自動デプロイする設定になっているようです。
その場合、web.xmlがwarファイル内と自動展開したディレクトリ内にも
web.xmlが存在していることになるが、ディレクトリのweb.xmlを優先するようです。

というわけで、FTPで「/home/ユーザ名」にwarファイルを配置しておきます。

1cp -pi /home/ユーザ名/ファイル名.war /tomcat/apache-tomcat-7.0.55/webapps

Tomcat起動状態で実施するとコピーした瞬間、自動展開されています。
root所有になっているので、Tomcat専用ユーザ所有に変えておきます。

1chown -R Tomcat専用ユーザ名.Tomcat専用ユーザ名 自動展開されたディレクトリ名

Server.xmlに書くよりも個別でコンテキスト名.xmlを書く方が好きなので、
コンテキスト名.xmlを作成します。
ローカルに自動作成されているので、それを参考にしました。

1cp -pi /home/ユーザ名/コンテキスト名.xml /tomcat/apache-tomcat-7.0.55/conf/Catalina/localhost/
2chown -R Tomcat専用ユーザ名.Tomcat専用ユーザ名 コンテキスト名.xml
3vi /tomcat/apache-tomcat-7.0.55/conf/Catalina/localhost/コンテキスト名.xml
# 下記内容を追加
<Context path="/コンテキスト名" reloadable="true" docBase="/tomcat/apache-tomcat-7.0.55/webapps/コンテキスト名" />
1vi /etc/apache2/sites-available/default
# 下記内容を追加
<Location /コンテキスト名/>
        ProxyPass ajp://localhost:8009/コンテキスト名/
        allow from all
</Location>

下記URLにアクセスする。

http://z-area.net/コンテキスト名/

作成した画面が表示されれば成功。
初回のJSPはコンパイルが入るとはいえ、重すぎ。

アップロードしておいたファイルを削除しておきます。

1rm -f /home/ユーザ名/ファイル名.war
2rm -f /home/ユーザ名/コンテキスト名.xml

【APサーバ】Apache2とTomcat連携

Apache2とTomcatを連携させて
ポート番号を指定せずに画面表示出来るように設定します。

バーチャルホストの設定ファイルを変更します。

1vi /etc/apache2/sites-available/default
<VirtualHost *:80>
    ~略~
    <Directory /var/www/>
        ~略~
    </Directory>
# 上記のすぐ下に下記内容を追加。(Directoryではなく、Locationです)
    <Location /examples/servlets/>
        ProxyPass ajp://localhost:8009/examples/servlets/
        allow from all
    </Location>

連携モジュールを有効化します。

Considering dependency proxy for proxy_ajp:
Enabling module proxy.
Enabling module proxy_ajp.
To activate the new configuration, you need to run:
  service apache2 restart

Apache2を再起動する。

Tomcatの設定から8080ポートの設定をコメントアウトし、
8009ポートの設定がコメントアウトされていないことを確認する。

1vi /tomcat/apache-tomcat-7.0.55/conf/server.xml
# 下記内容を変更する。(コメントアウト)
<Connector port="8080" protocol="HTTP/1.1" ~略~
↓
<!-- <Connector port="8080" protocol="HTTP/1.1" ~略~ -->

# 下記内容がコメントアウトされていないことを確認する。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

下記URLにアクセスする。

http://z-area.net/examples/servlets/

Servletのサンプル画面が出てくれば成功。

http://z-area.net:8080/examples/servlets/

接続失敗すれば成功。

私の環境ではApahce2とTomcatともに再起動してもポート8080で表示できてしまったので、
サーバをrebootして、再度Apache2、Tomcatを起動したらポート8080で接続不可になっていました。

簡易ファイアウォールでポート8080を閉じる。

1ufw delete allow 8080
2Rule deleted
3ufw status
ToActionFrom
20LIMITAnywhere
21LIMITAnywhere
22LIMITAnywhere
80ALLOWAnywhere
443ALLOWAnywhere

【APサーバ】JavaとTomcat導入

Raspberry Piでは性能的に重いと分かりつつも、
JavaとTomcatを導入してみます。

Raspberry PiではSwing、Appletを利用しないため、
Headful版ではなく、Headless版を選択しました。
SoftFP版とHardFP版の違いは調べてません。
TomcatはCoreの最新版を選択しました。

【Java】
Oracle Java SE Embedded version 7 Update 60
ARMv6/7 Linux - Headless - Client Compiler EABI, VFP, HardFP ABI, Little Endian1
ejre-7u60-fcs-b19-linux-arm-vfp-hflt-client_headless-07_may_2014.tar.gz

【Tomcat】
apache-tomcat-7.0.55.tar.gz

FTPで「/home/ユーザ名」にダウンロードしておいたファイルを配置しておきます。
Javaはファイル名長いのでjava.tar.gzに変えました。

  • Java導入

    1mkdir /java
    2cp -pi /home/ユーザ名/java.tar.gz /java
    3cd /java
    4tar xvzf java.tar.gz
    5chown root.root -R ejre1.7.0_60
    6rm -f /home/ユーザ名/java.tar.gz
    7rm -f java.tar.gz
  • Tomcat導入
    Tomcatはroot以外のユーザで実行できるようにしておくと、
    OS全体が乗っ取られる可能性があるということで、Tomcat専用ユーザを作成します。

    変更後のパスワード入力。
    変更後のパスワード再入力。
    残りの項目は空でエンターを押下すれば問題なし。
    最後に”Y”を入力。

    1mkdir /tomcat
    2cp -pi /home/ユーザ名/apache-tomcat-7.0.55.tar.gz /tomcat
    3cd /tomcat
    4tar xvzf apache-tomcat-7.0.55.tar.gz
    5chown Tomcat専用ユーザ名.Tomcat専用ユーザ名 -R apache-tomcat-7.0.55
    6rm -f /home/ユーザ名/apache-tomcat-7.0.55.tar.gz
    7rm -f apache-tomcat-7.0.55.tar.gz

    Tomcat用の起動スクリプトを作成します。

    2重起動防止のチェック処理等は実装していません。

    1#!/bin/sh
    2# 環境変数を設定する。
    3export JAVA_HOME=/java/ejre1.7.0_60
    4export PATH=$PATH:$JAVA_HOME/bin
    5export CLASSPATH=.:$JAVA_HOME/lib
    6export CATALINA_HOME=/tomcat/apache-tomcat-7.0.55
    7export CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib
    8 
    9# 第1引数の内容により条件分岐する。(start, stop, restart)
    10case "$1" in
    11    'start')
    12        if [ -f /tomcat/apache-tomcat-7.0.55/bin/startup.sh ]; then
    13        echo "Starting the tomcat service"
    14        "/tomcat/apache-tomcat-7.0.55/bin/startup.sh"
    15        fi
    16    ;;
    17    'stop')
    18        echo "Stopping the tomcat service."
    19        "/tomcat/apache-tomcat-7.0.55/bin/shutdown.sh"
    20    ;;
    21    'restart')
    22        $0 stop
    23        $0 start
    24    ;;
    25    *)
    26        echo "Usage: $0 {start|stop|restart}"
    27    ;;
    28esac
    29 
    30exit 0

    実行権限を付与し、シェルを起動する。

    1chmod +x /etc/init.d/tomcat.sh
    2/etc/init.d/tomcat.sh start

    下記URLにアクセスする。

    http://z-area.net:8080/examples/servlets/

    Servletのサンプル画面が出てくれば成功。
    現在はポート8080は閉じているため、外部からは開けません。

    次に自動起動できるように設定します。

    1insserv /etc/init.d/tomcat.sh
    2insserv: warning: script 'tomcat.sh' missing LSB tags and overrides

    タグがないと警告でていますが、気にしない方向で。
    参考までに自動起動を停止する場合、は下記の通り。

    以前までは「update-rc.d」で自動起動していたようですが、
    Debian6以降では「insserv」が推奨のようです。
    CentOSは「chkconfig」だったりとこの辺は勉強しないと分からない点が多いです。