読者です 読者をやめる 読者になる 読者になる

雑草SEの備忘録

[旧:東大卒SEの備忘録]東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

Apache2.4とTomcat8を連携させる

【CeontOSにApacheTomcatシリーズ】 第1回 CentOS6.6にApache2.4をインストールする
第2回 CentOS6.6にJava8, Tomcat8をインストール
第3回 Apache2.4とTomcat8を連携させる

 

Tomcat8のインストールが終わったので、今度は、ApacheTomcatの連携です。

ApacheTomcatを連携する理由はグーグル先生に聞けば色々と出てきますが、アクセスしたときにポート番号(8080とか)見えるのはなんだかダサいですよね。

今回はこれを無くします。

 

前回は、編集をviでやりましたが、今回は編集するファイルが少し長いのでWinSCPを使ってやっています。WinSCPの使い方が分からない人はグーグル先生に聞いてください。

viでもできるので、お好きな方を。要するに、ファイルを編集するだけなので。

 

以下、ディレクトリは、適宜、ご自分がApacheTomcatをインストールしたディレクトリに置き換えて読んでください。

また、localhostのところは、ご自身が使用されているサーバのIPアドレスなりFQDNなりに変えてください。localでやっている方は、localhostのままで構いません。

 

ajpモジュールによる連携

今回、ApacheTomcatを連動させるには、ajpモジュールを使います。

/opt/tomcat/apache-tomcat-8.0.20/conf/server.xml

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

という記述があるか確認してください。(たぶんあると思います。なければ追加。)

次に、/opt/httpd/httpd-2.4.12/modulesに

mod_proxy.so
mod_proxy_ajp.so

があるかを確認してください。(たぶんあると思います。)

次に、/opt/httpd/httpd-2.4.12/conf/httpd.confを編集します。

このファイルのどこかに、以下のような記述があると思います。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

もし、この行の先頭に#がついているのでしたら、削除してください。#はコメントアウトを意味するので、#があると、この二つのモジュールを使うことができません。

 

次にajpを使ってApacheからTomcatに飛ばすための設定をします。

この設定は、httpd.confに記述すればいいのですが、httpd.confには直接記述せず、外部に記述することが推奨されているようですし、多くの解説サイトでもそう解説しています。

まず、/opt/httpd/httpd-2.4.12/conf/の中に、extraディレクトリはあるでしょうか。なければ作成してください。extraディレクトリの中に、httpd-proxy.confというファイルを作ります。このhttpd-proxy.confというファイルにajpの設定を記述しますが、まだ中身は何もなくて構いません。ここで一旦、/opt/httpd/httpd-2.4.12/conf/httpd.confの編集に戻りましょう。

/opt/httpd/httpd-2.4.12/conf/httpd.confの最下部に、以下の1行を追加してください。

Include /opt/httpd/httpd-2.4.12/conf/extra/httpd-proxy.conf

これは、先ほど作った/opt/httpd/httpd-2.4.12/conf/extra/httpd-proxy.confファイルを読み込みますよということを意味します。これで、httpd-proxy.confに書かれた内容が、httpd.confに書かれたかのように振舞います。

そして、ajpの設定をhttpd-proxy.confに記述します。httpd-proxy.confに以下の1行を書き加えてください。

ProxyPass /examples/ ajp://localhost:8009/examples/

これは、http://localhost/examples/で呼び出されたときは、ajp://localhost:8009/examples/に移しますという意味です。それで、ajpモジュールが8009ポートでTomcatを呼び出します。最初に確認したserver.xmlの設定ですね。それで/examples/ですが、これは、Tomcatのwebappsの中(私の例では、/opt/tomcat/apache-tomcat-8.0.20/webapps)に入っていて、Tomcatで使われるWebアプリは、この中に格納していくわけですが、サンプルとして、あらかじめ、examplesというのが入っているわけですね。

そして、今、ApacheTomcatが起動している人は、この設定を有効にするため、ApacheTomcatを再起動してください。

Tomcatの終了は、

/opt/tomcat/apache-tomcat-8.0.20/bin/shutdown.sh

Apacheの終了は、

/opt/httpd/httpd-2.4.12/bin/apachectl stop

Tomcatの起動は、

/opt/tomcat/apache-tomcat-8.0.20/bin/startup.sh

Apacheの起動は、

/opt/httpd/httpd-2.4.12/bin/apachectl start

になります。(パスは各自の環境に合わせてくださいね)

 

http://localhost/examples/にアクセスすると次のような画面が出れば、ここまでは正しく設定できています。(localhostの所は、適宜ご自身のIPアドレスなどに変えてください)

ポート番号8080つけずとも、Tomcatのページが表示されました。

f:id:smartenergy:20150313190839p:plain

 

Apache2.4とTomcat8を連携させてWebSocket接続をする

で、ここまでは、他のサイトにも書いてありますし、そんなに問題なくできます。(最初はそれなりに苦労しますが)

次のWebSocketが問題です。先ほど表示したTomcatのExamplesのページにWebSocket Examplesがあります。それをこのまま使ってみます。

http://localhost/examples/の画面でWebSocket Examplesをクリックします。

 

f:id:smartenergy:20150313200654p:plain

4つのサンプルが出てきました。適当にどれかクリックして遊んでみてください。

WebSocket connection closedなどという文字が出て、WebSocket接続ができていないことが確認できます。

http://localhost:8080/examples/websocket/

のように8080ポートを明示的につけて、同様に4つのサンプルのうちのどれかで遊んでみてください。こんどはWebSocket connection openedなどというのがでて、正しく動くと思います。

つまり、ajpモジュールでは、WebSocketが動作しないわけです。

そして、いよいよ、Apache経由でもWebSocket接続が出来るようにします。

まずは、/opt/httpd/httpd-2.4.12/modulesに、

mod_proxy_wstunnel.so

があるかどうか確認してください。WebSocket接続をするには、このモジュールが必要です。wstunnelとはWebSocketTunnelを意味すると思われます。

そして、このモジュールを使うために、/opt/httpd/httpd-2.4.12/conf/httpd.confを編集します。httpd.confを開いて、

LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

と書かれているところを探してください。おそらく、この文字列が書かれている先頭には#がついていると思います。この#を外して、モジュールを使うように設定を変えます。

次に、wstunnelを使うための設定を、/opt/httpd/httpd-2.4.12/conf/extra/httpd-proxy.confに記述します。現在、httpd-proxy.confには次の1行のみが書かれていると思います。

ProxyPass /examples/ ajp://localhost:8009/examples/

この行のに、

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

を付け加えてください。/examples/websocket/で呼ばれたものは、ws://localhost:8080/examples/websocket/に渡しますよということを意味しています。これをwstunnelモジュールがやってくれます。

また、ProxyPassは、条件の厳しいものから書く必要があるので、

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

の順番になります。(ProxyPassReverseは最後でも良いですが、ProxyPassの順番は変えないでください)

この設定をしたのち、ApacheTomcatを再起動します。コマンドは覚えていますか?上で、ajpの設定をした時に書いてあるので、参考にしてください。

そして、再度、

にアクセスしてください。たとえば、Echo exampleだと、次のような応答になるかと思われます。

f:id:smartenergy:20150313200734p:plain

Multiplayer snake exampleとMultiplayer drawboard exampleも遊んでみてください。動くと思います。(操作の説明は英語で書いてあったりするので、分かりにくいかも)

なんですが、なぜか、私の環境では、Chat Sampleは上手く動きませんでした。一旦、WebSocket connection opend.になりますが、テキストボックスに文字を入れてえんたーを推すと、WebSocketがcloseされてしまいます。

なんでだろう。。自分が作った別のWebSocketのプログラムは動いていたので、このサンプルが良くないのかもしれません。

f:id:smartenergy:20150313200058p:plain

 

以上、Apache2.4とTomcat8を連携させるでした!

お疲れ様でした。(書くのも結構疲れる)

 

【CeontOSにApacheTomcatシリーズ】 第1回 CentOS6.6にApache2.4をインストールする
第2回 CentOS6.6にJava8, Tomcat8をインストール
第3回 Apache2.4とTomcat8を連携させる