新トップページへ | Tip

Apache + Tomcat + PostgreSQLでサーブレット実行環境構築(Linux)

LastUpdate : 08/09/14 

 CentOS5.1(64Bit版)に、サーブレットのWebアプリを実行する環境をApache+Tomcat+PostgreSQLで構築を行ってみます。

今回使用するソフトウェアのバージョンは以下のとおり。

JDK → Version 6 Update 7
Apache → 2.2.3
Tomcat → 6.0.18
PostgreSQL → 8.1.11

もくじ

必要なソフトウェアを揃える
とりあえずサーブレットが動くようにする
サーブレットからPostgreSQLにコネクションプールを使いアクセスできるようにする


必要なソフトウェアを揃える

JDK
Tomcatのリリースノートに「 Tomcat 6.0 requires JRE 5.0. 」と書かれています。動作をさせるだけならばJDKはいらないらしい・・・。しかし、今回、Tomcatをjsvcを使用し、起動させたいため、このjsvcをビルドする必要があります。そのためにJDKが必要です。
この辺から、ダウンロードできるはずです → http://www.java.com/ja/download/manual.jsp
Apache
あえてインストールをしたほうがいいのか迷いましたが、ディストリビューションインストール時点で、インストールされているものを使用することにしました。
というわけで、特にApacheに関してはそのまま使用します。
なおかつ、tomcatと連携する際必要なモジュールもデフォルトでインストールされているので、そのまま使用することとします。
Tomcat
yumで普通にインストールできるみたいですが、いろいろと自動的にシンボリックリンクが張られていたり、SUNのJDKを使うように設定しなおしたりするのが、面倒そうなので(といっても、なにをどーすればよい、というところまで調べてはいないです。なんとなく面倒そうなのでw)、別途ダウンロードして、インストールすることとします。以下のサイトよりDLします。
 → http://tomcat.apache.org/
PostgreSQL
これもyumでインストール可能です。PostgreSQLに関してはこちらにちらっと書いてあります。

というわけで、JDKとTomcatをダウンロードするだけでよいこととします。

とりあえずサーブレットが動くようにする

JDK
ダウンロードした、ファイル(私はjdk-6u7-linux-x64-rpm.binというファイルをDLしてきました)を、実行するだけでOKみたいです(しかし、アンインストール方法は分かりません^^;
[root@localhost ~]# chmod +x jdk-6u7-linux-x64-rpm.bin
[root@localhost ~]# ./jdk-6u7-linux-x64-rpm.bin
で、実行すると、ライセンス規約がいっぱい表示されます。とりあえず、エンターキーを使い、最後まで読み進めます進めます。
Do you agree to the above license terms? [yes or no]
というところまでくるので、yesと答えます。そして、しばらく待っていると、エンターキーを押してください・・・みたいなメッセージがでますので、エンターを押下し、ちょっと待つと、インストールが完了します。
JDKのインストール先ですが、デフォルト(?)だと、/usr/javaの中がインストール先になる様子です。
[root@localhost ~]# java -version
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
[root@localhost ~]# whereis java
java: /usr/bin/java
[root@localhost ~]# ls -al /usr/bin/java
lrwxrwxrwx 1 root root 26 Sep 22 18:00 /usr/bin/java -> /usr/java/default/bin/java
[root@localhost ~]# ls -al /usr/java
total 32
drwxr-xr-x  3 root root 4096 Sep 22 18:00 .
drwxr-xr-x 15 root root 4096 Sep 22 17:59 ..
lrwxrwxrwx  1 root root   16 Sep 22 18:00 default -> /usr/java/latest
drwxr-xr-x  9 root root 4096 Sep 22 18:00 jdk1.6.0_07
lrwxrwxrwx  1 root root   21 Sep 22 18:00 latest -> /usr/java/jdk1.6.0_07
[root@localhost ~]#
Tomcat
http://tomcat.apache.org/からDLしてきたファイル(apache-tomcat-6.0.18.tar.gz)を解凍します。
[root@localhost ~]# tar xvf apache-tomcat-6.0.18.tar.gz
その後、解凍したファイルを、インストール先のディレクトリ(ここでは/usr/local/tomcat6)に移動し、tomcatでアクセスできるようにシンボリックリンクを張ります。
[root@localhost ~]# mv apache-tomcat-6.0.18 /usr/local/tomcat6
[root@localhost ~]# ln -s /usr/local/tomcat6/ /usr/local/tomcat
[root@localhost ~]#
事前に、tomcatを動かす一般ユーザを作成しておきます(ログイン不可アカウント)。
ワーニングがでちゃいましたが、気にしない方向でw
[root@localhost ~]# adduser -s /sbin/nologin -d /usr/local/tomcat6 tomcat
adduser: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@localhost ~]#
commons-daemon プロジェクトの jsvc ツールを使うとDeamonとして実行できます。jsvcのソースがtomcatに付属でついていますので、それを解凍し、ビルドします。
[root@localhost bin]# pwd
/usr/local/tomcat6/bin
[root@localhost bin]# tar xvf jsvc.tar.gz
〜〜〜 長いので省略 〜〜〜
[root@localhost bin]# cd jsvc-src/
[root@localhost jsvc-src]# chmod +x configure
[root@localhost jsvc-src]# ./configure --with-java=/usr/java/latest
〜〜〜 長いので省略 〜〜〜
[root@localhost jsvc-src]# make
configureのオプション(--with-java)にて、どのjava環境を使用するのか指定します。今回は、さきほどインストールしたsunのJDKを使用するので、JDKがインストールされたパスを指定してやります。
ビルドが終わると、「 jsvc 」というファイルが出来るので、それをtomcatのbinディレクトリにコピーしておきます。
[root@localhost jsvc-src]# cp jsvc ..
そして、自動起動用のスクリプトの参考となるファイルがこのディレクトリ内にありますので、困ったときはこれを参考にして、自動起動用のスクリプトを/etc/rc.d/init.d内に作成し、実行権限を与えます(私は/etc/rc.d/init.d/tomcatを作成し、chmod +x /etc/rc.d/init.d/tomcat としました。)。起動スクリプトは、私はこんな感じで書きました

そして、実行させるため、tomcatのインストール先のディレクトリの所有者をtomcatにしてやります。
[root@localhost init.d]# chown -R tomcat /usr/local/tomcat6
サービスに登録します。これで、起動時に自動起動し、シャットダウン時に自動停止します。
[root@localhost init.d]# chkconfig --add tomcat
[root@localhost init.d]# chkconfig --list tomcat
tomcat          0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@localhost init.d]#

ちゃんとセットアップできかた確認のため、「 service tomcat start 」とやり、tomcatを起動し、「 http://<ホストのアドレス>:8080/ 」とアクセスしてみて、画面が表示されればOKです(外部アクセスの場合、ファイヤーオールの8080番は開いている必要があります。
Apache
ApacheとTomcatを連携させます。必要な部分だけTomcatに処理をさせ、それ以外(普通のHTMLや画像ファイルなど)についてはApacheが処理を受け持つ様にします。
CentOS5の場合デフォルトでインストールされているapacheにはすでに、proxy_ajpが組み込まれている様子です(インストールオプション次第??)。
なおかつ、デフォルトの設定で、proxy_ajpをロードしてApacheが動くようになっています。

CentOSの場合、Apacheのhttpd.confは、「 /etc/httpd/conf/httpd.conf 」にあります。この中で、「 /etc/httpd/conf.d/ 」内の.confと末尾に付くファイルすべてを読み込んでいる様です。

テストとして、tomcatのJSPとSERVLETのテスト用(サンプル用)のページ「 http://ホストアドレス:8080/examples/ 」にアクセスする際、ポート番号無し(80番ポート)で、アクセスできるように設定ファイルを書いてみます。

/etc/httpd/conf.d/proxy_ajp.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

#
# When loaded, the mod_proxy_ajp module adds support for
# proxying to an AJP/1.3 backend server (such as Tomcat).
# To proxy to an AJP backend, use the "ajp://" URI scheme;
# Tomcat is configured to listen on port 8009 for AJP requests
# by default.
#

#
# Uncomment the following lines to serve the ROOT webapp
# under the /tomcat/ location, and the jsp-examples webapp
# under the /examples/ location.
#
#ProxyPass /tomcat/ ajp://localhost:8009/
ProxyPass /examples/ ajp://localhost:8009/examples/
デフォルトの状態から、一番したの行を少し修正しただけです。
これで「 http://ホストアドレス/examples/ 」にアクセスします。すると、ページが表示されるはずです。
PostgreSQL
PostgreSQLのセットアップに関してはこちらを見てください。簡単な説明があります。

サーブレットからPostgreSQLにコネクションプールを使いアクセスできるようにする

これから、アプリケーションをデプロイし、実行をする環境構築を行っていきます。

アプリケーションの作成
・・・アプリケーションというほど、たいそーなものは作りません。ただのテスト用のアプリケーションです。
1つのサーブレットと1つのjspファイルを作成しました。主な処理を記述したサーブレットのソースコードはこちらです。
Eclipse上で、プログラムを作成しました。そのときのプロジェクトファイルはこれです。
コネクションプールの設定
今回はtomcat6ということで、context.xmlというファイルを作成し、設定を行います。
従来、server.xmlに記述していたコネクションプール設定を、個別のアプリごとに保持しているcontext.xmlに記述します(設定方法はいくつかあるかと思いますが、たぶんこれが一番やりやすいかと個人的に思います)。
context.xmlについて
WebContent/META-INFディレクトリ内に、context.xmlというファイルを作成します。雛形は、tomcatのconfディレクトリの中にcontent.xmlというファイルがあるので、それをコピペしてきます。
content.xmlの修正
context.xmlファイルは、新規作成し、META-INFディレクトリの中に保存しておきます。
context.xml
<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context path="/ServletDBAccess" docBase="ServletDBAccess" reloadable="false" crossContext="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

        <Resource
                name="jdbc/postgresql"
                type="javax.sql.DataSource"
                auth="Container"
                driverClassName="org.postgresql.Driver"
                url="jdbc:postgresql://localhost:5432/postgres"
                username="postgres"
                password="usagi"
                maxActive="20"
                maxIdel="5"
                maxWait="5000"
        />
</Context>
このような感じで修正しました。いじった場所は、Contextの部分の修正と、Resourceタグの追加ぐらいです。

内容について、なんとなくしか分かってませんので、詳しくはググってください(汗
なんとなく、名前から予測がつくと思いますが^^;
Resource->nameは、JNDI名なので、これがweb.xml内で定義しているものと同じくなるようにしないとダメです。その他設定項目は、各自環境により変わります。
(ServletDBAccessとは、今回作成したテスト用アプリケーションです)

このファイルが追加された状態でwarファイルを作成します。
web.xmlファイルの修正
続いてweb.xmlの修正を行います(当然ですが、web.xmlは作成するアプリ側のファイルを修正します)
web.xmlの修正箇所(resource-refを追加)
        <resource-ref>
                <description>PostgreSQL connection resource</description>
                <res-ref-name>jdbc/postgresql</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
        </resource-ref>
ライブラリの追加
tomcatのライブラリ用のディレクトリ(libディレクトリの中)に使用するDBのライブラリを追加します(私は、PostgreSQLを使うので、postgresql-8.3-603.jdbc4.jarをコピーしましたが、どのレベルのライブラリをいれればよいかは各種マニュアルを参照してください)。
DBの準備
準備は必要ありませんが、アプリケーションが読み出すテーブルとレコードを準備してあげないといけません。
CREATE TABLE Item( id TEXT PRIMARY KEY, name TEXT NOT NULL);で作成したテーブルに、てきとーにデータを挿入しておきます。

また、接続の設定がちゃんと接続できるようになっているか確認をします。

今回の構成ではtomcatもPostgreSQLも同じサーバ上で動作させるため、pg_hba.confは以下のよーな感じに設定しました。
(というか、ident sameuserにしておいて接続できなくてはまったw)
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               ident sameuser
# IPv4 local connections:
#host    all         all         127.0.0.1/32          ident sameuser
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
#host    all         all         ::1/128               ident sameuser
apache経由でアクセスできるようにする
/etc/httpd/conf.d/proxy_ajp.confを修正します。
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

#
# When loaded, the mod_proxy_ajp module adds support for
# proxying to an AJP/1.3 backend server (such as Tomcat).
# To proxy to an AJP backend, use the "ajp://" URI scheme;
# Tomcat is configured to listen on port 8009 for AJP requests
# by default.
#

#
# Uncomment the following lines to serve the ROOT webapp
# under the /tomcat/ location, and the jsp-examples webapp
# under the /examples/ location.
#
#ProxyPass /tomcat/ ajp://localhost:8009/
ProxyPass /examples/ ajp://localhost:8009/examples/
ProxyPass /ServletDBAccess/ ajp://localhost:8009/ServletDBAccess/
最後の1行を追加しました。

以上で、準備完了です。
準備したアプリケーションをwarファイルにして、デプロイし、実行すると、DBより読み出した情報が表示されると思います。

以下のような感じで動くかと思います。