Aipoを、IIS連携からApache連携(mod_proxy_ajpやmod_proxy_http)へと切り替える

以前、AipoとIISを連携させました。
AipoのTomcatとIISがARRで連携する環境へ、Aipoを移行する - メモ的な思考的な

今回は、IIS連携からApache連携へ切り替えた時のメモを残します。

 
目次です。

 

環境

前回構築済の環境は以下の通りです。

  • Windows Server 2008 x64
  • Aipo 7.0.2.0
    • ポート 81 で起動
  • IIS 7.0
    • Default Web Siteがポート80で動作
  • ARR 3.0
    • URL書き換えを使い、ポート80をポート81へ書き換え

 
今回、Apache連携に切り替えるため、

  • Aipo
    • ポート81で動作
      • 一応、ポート81接続も残す
  • IIS 7.0
    • ポート80で動作しているサイトを、ポート8081へと移動
  • ARR 3.0
    • URL書き換えにおいて、Aipo向けのものは無効化
  • Apache 2.4.20 32bit
    • 展開先: C直下: C:\Apache24
    • VirtualHostは未使用

と変更になります。

なお、IISApacheとAipoは、Windows Server 1台にすべて同居しているものとし、コマンドライン入力にはPowerShellを使います。

 
また、ApacheTomcatの連携方法については、

  • mod_jk
  • mod_jk2
  • mod_proxy_ajp
  • mod_proxy_http

などがあり、mod_proxy_httpが勧められていました。
mod_proxy_httpとmod_proxy_ajpとmod_jk — ありえるえりあ

 
Aipoでも上記の方法による事例がありました。

 
そこで今回は、mod_proxy_ajpmod_proxy_httpの両方の連携方法を試してみました。

 

Apacheのインストール

前回と同じ方法で、ダウンロード・展開・サービス登録を行います。
IISが稼働中の環境にApache2.4を入れ、ポート80をIISからApacheへと切り替える - メモ的な思考的な

 

IISのポート変更

IISがポート80で動作していると良くないため、前回の記事同様、ポートを変更します。

# 変更
PS C:\Apache24\bin> Set-WebBinding -Name 'Default Web Site' -BindingInformation "*:80:" -PropertyName "Port" -Value "8081"

# 確認
PS C:\Apache24\bin> Get-WebBinding

protocol bindingInformation
-------- ------------------
http     *:8081:

 

ARRにて、書き換えルールを無効化

以前の記事で作成した書き換えルールを無効化しておきます*1

 

mod_proxy_ajpを使う場合の設定

以下を参考に、ApacheとAipoのTomcatを、mod_proxy_ajpを使って連携します。
Apache側の設定 - Tomcatとの連携(mod_proxy_ajp) - Apache入門

 

httpd.confの編集

httpd.confにて、Proxy用のモジュールmod_proxy.so、およびProxyのプロトコルとして使うモジュールmod_proxy_ajp.soを有効化するとともに、mod_proxy_ajp用の設定ファイルをincludeします。

C:\Apache24\conf\httpd.conf

# 140行目あたり、`#`を削除して設定を有効化
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

# ファイルの最後
# `httpd-proxy-ajp`用の設定ファイルを指定
# 今回は`httpd-proxy-ajp.conf`というファイル名にする
Include conf/extra/httpd-proxy-ajp.conf

 

mod_proxy_ajp用設定ファイル作成

mod_proxy_ajpの設定として、

の2点を追加します。

 
AipoのTomcatでのAJP設定を確認すると、以下のファイルに記載がありました(98行目あたり)。

C:\aipo\dpl7020\tomcat\conf\server.xml

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

Tomcat8009ポートへ繋げば良さそうです。

 
続いて設定を行います。

ProxyRequestsについては、デフォルトでOffですが、念のため、明示的にOffとしておきます。
mod_proxy - Apache HTTP Server Version 2.4

 
ProxyPassReverseのについては、以下を読む限り、今回は不要かなと思って書きませんでした。

 
ProxyPassについては、Locationディレクティブを使うのが一般的なのかどうか分かりませんでしたが、今回は

  • mod_proxy_ajpはProxyPassだけなので使わない
  • mod_proxy_httpはProxyPassの他にProxyPassReverseもあるので、Locationディレクティブを使う

としました。

また、今回の1台構成では意味ないかもしれませんが、以下の記事を参考にretryを設定しておきます。Apache2.4系でも同じでした。
ProxyPass には retry=?? を指定しておく - daily dayflower

 
ProxyPassやProxyPassReverseの挙動については、以下が参考になりました。
mod_proxy再入門 – ProxyPassとProxyPassReverse | Developers.IO

   
C:\Apache24\conf\extra\httpd-proxy-ajp.conf

# ProxyRequestsをOffにすることで、Apacheはリバースプロキシとして動作
ProxyRequests Off

# Aipo
ProxyPass /aipo/ ajp://localhost:8009/aipo/ retry=5

# Aipo Gadgets
ProxyPass / ajp://localhost:8009/ retry=5

 

動作確認

設定ファイルの更新が終わったら、設定内容が問題ないかを確認します。

# シンタックスエラーがないかを確認
PS C:\Apache24\bin> .\httpd -t
Syntax OK

# モジュールが読み込まれているかを確認
PS C:\Apache24\bin> .\httpd -M
Loaded Modules:
...
 proxy_module (shared)
 proxy_ajp_module (shared)
...

 
問題無さそうでしたので、

  1. Aipo(Tomcat)の再起動
  2. Apacheの再起動

を行います。

なお、再起動順についてはTomcat3時代はTomcatを先に、という記載がありました。
Tomcat-Apache HOWTO

ただ、Aipo7で使っているTomcat6では

The order of starting up Tomcat and Apache is NOT important. Either apache or tomcat can be restarted at any time.

How to configure Apache 2 with Tomcat 6

と書かれており、Tomcat Wikiにも

At boot, is order of start up (Apache vs Tomcat) important?

No. This way - either apache or tomcat can be restarted at any time independent of one another.

FAQ/Connectors - Tomcat Wiki

とあったことから、現在はそこまで気にする必要はないのかなと考えました。

 
あとは、ブラウザでhttp://localhost/aipo/へアクセスし、Aipoが表示できればOKです。

 

mod_proxy_httpを使う場合の設定

Aipoがhttpのポート81で起動しているので大丈夫かと思いますが、念のため、AipoのTomcatでのhttpポート設定を確認します。

AJP同様以下のファイルに記載がありました(78行目あたり)。

C:\aipo\dpl7020\tomcat\conf\server.xml

<Connector
        connectionTimeout="20000" port="81" protocol="HTTP/1.1"
        redirectPort="8443"/>

 
そのため、httpd.confとmod_proxy_http用の設定ファイル作成を行います。

 

httpd.confの編集

mod_proxy.somod_proxy_http.soをロードし、ファイルを詠みこみます。

# モジュールのロード
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_http_module modules/mod_proxy_http.so

# 設定ファイルの読込
Include conf/extra/httpd-proxy-http.conf

 

mod_proxy_http用設定ファイル作成

C:\Apache24\conf\extra\httpd-proxy-http.conf

ProxyRequests Off

ProxyPreserveHost On

<Location "/aipo/">
    ProxyPass http://localhost:81/aipo/ retry=5
    ProxyPassReverse http://localhost:81/aipo/
</Location>

<Location "/">
    ProxyPass http://localhost:81/ retry=5
    ProxyPassReverse http://localhost:81/
</Location>

 

動作確認
# モジュールのロード確認
PS C:\Apache24\bin> .\httpd -M
...
 proxy_module (shared)
 proxy_http_module (shared)
...

# シンタックスエラーの確認
PS C:\Apache24\bin> .\httpd -t
Syntax OK

 
あとはApacheのサービスを再起動後、ブラウザでhttp://localhost/aipo/へアクセスし、Aipoが表示できればOKです。

参考:Apache2.4 Windows Server 32bit - kunikuの日記

 

ファイアウォールのポートOpen

上記までで設定は完了です。ただ、

  • ローカルからは接続できる
  • 他の端末からhttp://<Aipoのホスト名>/aipoにアクセスできない

という場合、Windowsファイアウォールでポートが閉じている可能性があります。

そのため、ファイアウォールのポートを開けて動作を確認します*2

 
なお、Windows7ではPowerShellのコマンドレットがないため、ファイアウォール設定ができません。
リモート デスクトップ接続をPowerShellから一括設定する~netsh advfirewallも - 元「なんでもエンジニ屋」のダメ日記

# Windows7のコマンドレットの確認
PS C:\Windows\system32> Get-Command *-*firewall*
# 結果が表示されない = 存在しない
PS C:\Windows\system32>

# Windows10のコマンドレット確認
PS C:\Windows\system32> Get-Command *-*firewall*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Copy-NetFirewallRule                               2.0.0.0    NetSecurity
Function        Disable-NetFirewallRule                            2.0.0.0    NetSecurity
Function        Enable-NetFirewallRule                             2.0.0.0    NetSecurity
...

 

その他

mod_proxy_ajpとmod_proxy_httpについては、以下の記事などを読んだものの、現時点ではどちらの方がいいのか判断できませんでした。そのため、今回両方を試しています。

*1:本当にいらない場合は削除でも良いかと思います

*2:netstatからはポートが開いているように見えたので、今回ハマった