Tomcat8のインストールが終わったので、今度は、ApacheとTomcatの連携です。
ApacheとTomcatを連携する理由はグーグル先生に聞けば色々と出てきますが、アクセスしたときにポート番号(8080とか)見えるのはなんだかダサいですよね。
今回はこれを無くします。
前回は、編集をviでやりましたが、今回は編集するファイルが少し長いのでWinSCPを使ってやっています。WinSCPの使い方が分からない人はグーグル先生に聞いてください。
viでもできるので、お好きな方を。要するに、ファイルを編集するだけなので。
以下、ディレクトリは、適宜、ご自分がApacheやTomcatをインストールしたディレクトリに置き換えて読んでください。
また、localhostのところは、ご自身が使用されているサーバのIPアドレスなりFQDNなりに変えてください。localでやっている方は、localhostのままで構いません。
ajpモジュールによる連携
今回、ApacheとTomcatを連動させるには、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_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というのが入っているわけですね。
そして、今、ApacheとTomcatが起動している人は、この設定を有効にするため、ApacheとTomcatを再起動してください。
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のページが表示されました。
Apache2.4とTomcat8を連携させてWebSocket接続をする
で、ここまでは、他のサイトにも書いてありますし、そんなに問題なくできます。(最初はそれなりに苦労しますが)
次のWebSocketが問題です。先ほど表示したTomcatのExamplesのページにWebSocket Examplesがあります。それをこのまま使ってみます。
http://localhost/examples/の画面でWebSocket Examplesをクリックします。
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に、
があるかどうか確認してください。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の順番は変えないでください)
この設定をしたのち、ApacheとTomcatを再起動します。コマンドは覚えていますか?上で、ajpの設定をした時に書いてあるので、参考にしてください。
そして、再度、
にアクセスしてください。たとえば、Echo exampleだと、次のような応答になるかと思われます。
Multiplayer snake exampleとMultiplayer drawboard exampleも遊んでみてください。動くと思います。(操作の説明は英語で書いてあったりするので、分かりにくいかも)
なんですが、なぜか、私の環境では、Chat Sampleは上手く動きませんでした。一旦、WebSocket connection opend.になりますが、テキストボックスに文字を入れてえんたーを推すと、WebSocketがcloseされてしまいます。
なんでだろう。。自分が作った別のWebSocketのプログラムは動いていたので、このサンプルが良くないのかもしれません。
以上、Apache2.4とTomcat8を連携させるでした!
お疲れ様でした。(書くのも結構疲れる)