まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:tomcat

以前にこの記事を書きました:
CentOS に Apache Tomcat を導入する


上記ページの下の方で、Apache Tomcat を(一般的な HTTP のポートである)80 番ポートで実行するための指定方法も書き加えています。簡単に言うと、Apache Tomcat 自体は 8080 番ポートで動かしながら 80 番ポートへのリクエストを 8080 番に転送することで、外部からは 80 番ポートで動いているように見せる、というものでした。

もちろんこの方法は今でも有効で、比較的簡単に Apache Tomcat を 80 番ポートで動かすことができるようになります。ただ1つ、「事実上 80 番ポートを専有してしまう」という難点もあります。つまり実際には 8080 番ポートでしか動いていないのに、80 番ポートも含めて専有してしまうということです。

この結果、どんな不都合があるでしょう? 例えば Apache Tomcat が 8080 番ポートのままであれば、同じシステムに Apache HTTPD を導入して 80 番ポートで平行して動かすことができます。例えば PHP と MySQL と WordPress まで導入した上で、80 番ポートでは Apache HTTPD で WordPress を動かし、8080 番ポートでは Apache Tomcat で Java アプリケーションサーバーを同時に動かす、ということが可能でした。 上記の 80 番ポートを 8080 番ポートに転送するという方法を取ってしまうと、80 番ポートで Apache HTTPD を動かすことができなくなってしまいます。つまり2つの HTTP サーバーを同時に動かすことはできなくなってしまいます。

とはいえ、Apache Tomcat が 8080 番ポートのままですと、Java アプリケーションサーバーにアクセスさせるには
  http://xxx.xxx.xxx:8080/hello
という、一般的とは言えないちょっと冗長な URL をユーザーに指定させる必要が出てきます。普通の HTTP(80番)リクエストが許可されていない環境は珍しいかもしれませんが、8080 番ポートとなると会社レベルのファイアウォールが許可していない可能性も出てきます。


これを解決する方法もあります。例えば WordPress が
 http://xxx.xxx.xxx/wordpress
という URL で動いていて、同時に Java アプリケーションが
 http://xxx.xxx.xxx:8080/hello
という URL で動いている場合であれば、以下の様なルールを作ります:

・原則的には、全てのリクエストを Apache HTTPD (80番ポート)で処理する
・但し /hello という URL パターンだった場合のみ、Apache Tomcat に渡して処理してもらう

これにより、http://xxx.xxx.xxx/hello というリクエストがあった場合には内部的に http://xxx.xxx.xxx:8080/hello に転送※して Apache Tomcat 側で処理をする、という作業分担が可能になります。 また同時に全てのリクエストをパフォーマンスのいい Apache HTTPD がいったん処理した上で分担処理することになるとか、サーバーのファイアウォールは 80 番ポートのみ開けておけばよくなる(Apache Tomcat の 8080 番ポートと停止することもできる)、という副次的なメリットも生まれます。

※実際には 8080 番ではなく、内部的な処理をするために 8009 番ポートを使います


この作業分担を実現するのが Apache Tomcat に付属している AJP(Apache Java Protocol) です。AJP は 8009 番ポートを使います。

具体的な作業の前に Apache Tomcat の設定を元に戻しておきます。つまり上記リンク先のような 80 番ポートへのリクエストを 8080 番ポートに転送するような指定がされている場合は無効にして、普通に Apache Tomcat が 8080 番ポートで動いているような状態にします。

続いて /etc/httpd/conf.d/proxy_ajp.conf というファイルを、以下の内容で作成します:
ProxyPass /hello/ ajp://localhost:8009/hello/

これで Apache HTTPD を再起動(# /etc/init.d/httpd restart)します。すると 80 番ポートへのリクエストは Apache HTTPD が受けるのですが、この AJP の設定により /hello/ というパスへのリクエストに関しては 8009 番ポートへの /hello/ に変換されます。そして内部的な 8009 番ポートで待ち構えている Apache Tomcat の AJP によって処理されるようになります。

結果的に、ユーザーからは WordPress へは
  http://xxx.xxx.xxx/wordpress/
Java アプリケーションへは
  http://xxx.xxx.xxx/hello/
それぞれの URL で利用できるようになる、ということです。

なお、この記述をすることで Apache Tomcat を 8080 番ポートで動かす必要はなくなります。消してしまうのであれば Apache Tomcat の server.xml から該当箇所を削除してください。


注意点としては、Java アプリケーションへの転送を proxy_ajp.conf で記述することになるため、複数の Java アプリケーションがあって、その全てを転送したいのであれば、全てを proxy_ajp.conf に(複数行で)記述する必要が出てきます。

もう1点、実は私自身はこの AJP をあまり信用していないというか、AJP コンテナ自身がそれほどでもない負荷を捌ききれなかった経験をしています。原因調査についてはこちらの記事を参考にしていますが、AJP を使う前提での根本解決はできていないので、ちとヤな感じではあります:
http://m97087yh.seesaa.net/article/212767022.html









 

CentOS に Java アプリケーションサーバーである Apache Tomcat を導入します。
2014062601



手順としては、まず Java(JDK) をインストールし、その後で Tomcat を導入します。


Java(JDK) のインストール

Oracle Java でも Open Java でもいいのですが、ここでは簡単な後者の手順を紹介します。Java 7 であればこのコマンドで JDK が導入できます:
# yum install java-1.7.0-openjdk-devel

あるいは Java 実行環境だけでもよければこちら:
# yum install java-1.7.0-openjdk

これだけ。


Apache Tomcat のインストール

Apache Tomcat も yum で導入できます。インストールと、起動と、自動起動設定までを行っています:
# yum install tomcat6 tomcat6-webapps tomcat6-admin-webapps
# /etc/init.d/tomcat6 start
# chkconfig tomcat6 on

ちなみにこの方法で導入すると Apache Tomcat 6 が /var/lib/tomcat6/ 以下にインストールされます。

起動後(/etc/init.d/tomcat6 start 実行後)にブラウザで http://(サーバーアドレス):8080/ にアクセスすると Tomcat のデフォルトトップ画面が表示され、正しく導入・動作できていることが確認できます:
2014062701



Apache Tomcat の設定

設定ファイルを書き換えて管理用画面にもアクセスできるようにします:
# vi /etc/tomcat6/tomcat-users.xml

(以下を </tomcat-users> の直前に追加)
  <role rolename="manager"/>
  <user name="admin" password="(管理者用パスワード)" roles="manager"/> 

そして Tomcat サーバーを再起動します:
# /etc/init.d/tomcat6 restart

これで管理用画面のURL である http://(サーバーアドレス):8080/manager/html にもアクセスできるようになりました。ログイン時の ID とパスワードは上記 tomcat-users.xml で指定したものです:
2014062702




(おまけ)Apache Tomcat を 80 番ポートで起動する

まず設定ファイルを書き換えます。server.xml に proxyPort の部分を追加します:
# vi /etc/tomcat6/server.xml

    :
  <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443"
        proxyPort="80" />
:

そして iptable で 80 番ポートへのリクエストを 8080 番に転送し、この設定ルールを iptables に保存します:
# iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# /sbin/service iptables save



これで Tomcat を再起動すると、Tomcat に 8080 番ポートではなく、 80 番ポートでアクセスできるようになります。
 

このページのトップヘ