Apache HTTP Server HowTo

はじめに

このドキュメントでは、Tomcat を広く普及しているオープンソースの Web サーバーである Apache HTTP Server に接続する方法について説明します。接続モジュール mod_jk は、サポートされている任意のバージョンの Apache およびサポートされている任意のバージョンの Tomcat で使用できます。

WebサーバーとTomcatエンジンの間の作業エンティティの設定方法を学ぶために、Workers HowToドキュメントも読むことをお勧めします。 詳細な構成情報については、workers.propertiesuriworkermap、およびApacheのリファレンスガイドを参照してください。

警告: Apache と Tomcat が同じファイルシステムの場所からコンテンツを提供するように設定されている場合、Apache が WEB-INF ディレクトリの内容や JSP ソースコードなど、不適切なコンテンツを提供できないように注意する必要があります。 これは、Apache の DocumentRoot が Tomcat Host の appBase または任意の Context の docBase と重複する場合に発生する可能性があります。 また、Apache の Alias ディレクティブを Tomcat Host の appBase または任意の Context の docBase とともに使用する場合にも発生する可能性があります。

このドキュメントは元々、Gal Shachor によって書かれた Tomcat: A Minimalistic User's Guide の一部でしたが、構成上の理由から分割されました。

ドキュメントの規約と前提

${tomcat_home} は Tomcat のルートディレクトリです。 Tomcat のインストールには、次のサブディレクトリが必要です。

  • ${tomcat_home}\conf - さまざまな構成ファイルを配置できる場所
  • ${tomcat_home}\webapps - サンプルアプリケーションを含む
  • ${tomcat_home}\bin - Webサーバープラグインを配置する場所

このドキュメントのすべての例では、${tomcat_home} は /var/tomcat3 になります。 ワーカーは、Apacheサーバーから作業を受け入れるTomcatプロセスとして定義されます。

サポートされている構成

mod_jk モジュールは以下でサポートされています。

  • 現在サポートされているすべてのバージョンの Apache Web Server (httpd)
  • Apache Web Server によってサポートされているすべてのオペレーティングシステム
  • 現在サポートされているすべてのバージョンの Tomcat

mod_jk モジュールは、古い、サポートされていないバージョンの Apache Web Server および/または Tomcat で動作する可能性がありますが、そのような構成はサポートされていません。

AJP プロトコル?

mod_jk モジュールは、AJP プロトコルを使用してリクエストを Tomcat コンテナに送信します。 使用される AJP バージョンは ajp13 です。 現在のすべてのバージョンの Tomcat は ajp13 プロトコルをサポートしています。 JettyJBoss などの他のサーブレットエンジンも ajp13 プロトコルをサポートしています。

ajp12 プロトコルは非推奨であり、使用すべきではありません。 ajp14 プロトコルは実験的と見なされています。

どのように動作しますか?

ごく簡単に言うと、Web サーバーはクライアント HTTP リクエストを待機しています。 これらのリクエストが到着すると、サーバーは必要なコンテンツを提供することでリクエストを処理するために必要なことを行います。

サーブレットコンテナを追加すると、この動作が多少変わる可能性があります。 現在、Web サーバーは次のことも行う必要があります。

  • サーブレットコンテナアダプターライブラリをロードして初期化します(リクエストを処理する前)。
  • リクエストが到着すると、特定のリクエストがサーブレットに属するかどうかを確認する必要があります。もしそうであれば、アダプターにリクエストを処理させる必要があります。

一方、アダプターは、どのリクエストを処理するか(通常はリクエスト URL のパターンに基づく)、およびこれらのリクエストをどこに送るかを知る必要があります。

ユーザーが仮想ホストを使用する構成を設定したい場合、または複数の開発者が同じ Web サーバーで異なるサーブレットコンテナ JVM で作業したい場合は、さらに複雑になります。 これらの2つのケースについては、高度なセクションで説明します。

mod_jk の取得

mod_jk は、バイナリとソースの2つの形式で取得できます。 Webサーバーを実行しているプラットフォームによっては、mod_jk のバイナリバージョンを入手できる場合があります。

バイナリバージョンが入手可能な場合は、それを使用することをお勧めします。 バイナリが入手できない場合は、下記の「mod_jk のビルド」セクションの手順に従って、ソースから mod_jk をビルドしてください。 mod_jk のソースは、こちらのミラーからダウンロードできます。

mod_jk のバイナリは、いくつかのプラットフォームで利用できるようになりました。 バイナリは、プラットフォームごとにサブディレクトリにあります。

Windows など、一部のプラットフォームでは、ほとんどの Windows システムに C コンパイラがないため、これが mod_jk を取得する一般的な方法です。

他のプラットフォームでは、mod_jk のバイナリディストリビューションにより、インストールが簡単になります。

たとえば、JK 1.2.x は、こちらのミラーからダウンロードできます(JK 1.2 Binary Releases を探してください)。 「JK 1.2 Binary Releases」リンクには、Apache 1.3 と Apache 2.x の両方に対応する、さまざまなオペレーティングシステムのバイナリバージョンが含まれています。

インストール

mod_jk には、次の2つのエンティティが必要です。

  • mod_jk.xxx - Apache HTTP Server モジュール。オペレーティングシステムに応じて、mod_jk.so、mod_jk.nlm、または MOD_JK.SRVPGM になります(ビルドセクションを参照)。
  • workers.properties - ワーカー(Tomcat プロセス)が使用するホストとポートを記述するファイル。 workers.properties のサンプルは、ソースダウンロードの conf ディレクトリにあります。

また、他の Apache モジュールと同様に、mod_jk は最初に Apache HTTP Server の modules ディレクトリ(例:/usr/lib/apache)にインストールする必要があり、httpd.conf ファイルを更新する必要があります。

古い mod_jserv の無効化

以前に mod_jserv を使用するように Apache を構成した場合は、httpd.conf から ApJServMount ディレクティブを削除してください。

tomcat-apache.conf または tomcat.conf を含んでいる場合は、それらも削除する必要があります。これらは mod_jserv に固有のものです。

mod_jserv 構成ディレクティブは mod_jk と互換性がありません!

Tomcat 自動構成の使用

Tomcat の自動構成は非推奨となり、Tomcat 7 以降では削除されました。

自動構成は、Apache HTTP Server が実行されている同じマシン上で実行されている単一の Tomcat に対してのみ機能します。 mod_jk を使用するように Apache HTTP Server を構成する最も簡単な方法は、Tomcat で Apache HTTP Server 自動構成設定をオンにし、次の include ディレクティブを Apache httpd.conf ファイルの末尾に配置することです($TOMCAT_HOME を Tomcat インストールの正しいパスに置き換えることを確認してください)。

# To be added at the end of your httpd.conf
Include $TOMCAT_HOME/conf/jk/mod_jk.conf-auto

注: このファイルは、$TOMCAT_HOME/conf/auto/mod_jk.conf として生成される場合もあります。

これにより、Apache HTTP Server は、Apache 構成の mod_jk.conf-auto ファイルのディレクティブを使用するように指示されます。 このファイルは、workers.properties ファイルを $TOMCAT_HOME/conf/jk/workers.properties に作成し、次の例に従って server.xml ファイルの Engine 要素にリスナーを追加することにより、Apache 自動構成を有効にすることで作成されます。 この例は Tomcat 5.x に固有であり、このドキュメントの他のセクションとは異なり、以前の Tomcat ブランチにも適用されることに注意してください。

...
<Engine ...>
  ...
    <Listener className="org.apache.jk.config.ApacheConfig" modJk="/path/to/mod_jk.so" />
  ...
</Engine>
...

次に、Tomcat を再起動すると、mod_jk.conf が生成されるはずです。 このトピックの詳細については、Tomcat ドキュメントWebサイトのAPIドキュメントを参照してください。

カスタム mod_jk 構成

次の場合には、カスタム構成を使用する必要があります。

  • Tomcat エンジンが Apache Web サーバーと同じマシン上にないため、mod_jk.conf-auto を使用できない場合、つまり、Tomcat ファームの前に Apache がある場合。
  • カスタム構成のもう1つのケースは、Apache が多くの異なる Tomcat エンジンの前にある場合です。それぞれが独自の構成を持っている場合、ISP ホスティングでは一般的なケースです。
  • また、ほとんどの Apache Web マスターは、設定を実際のニーズに合わせて調整できるように、カスタム構成を保持します。

簡単な構成例

簡単な構成を次に示します。

# Load mod_jk module
LoadModule    jk_module  modules/mod_jk.so
# Add the module (activate this lne for Apache 1.3)
# AddModule     mod_jk.c
# Where to find workers.properties
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
JkShmFile     /var/log/httpd/mod_jk.shm
# Where to put jk logs
JkLogFile     /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Send requests for context /examples to worker named worker1
JkMount  /examples/* worker1

mod_jk ディレクティブ

ここでは、mod_jk ディレクティブとその背後にある詳細について説明します。

ワーカーの定義

JkWorkersFile は、mod_jk がワーカーの定義を見つける場所を指定します。

JkWorkersFile     /etc/httpd/conf/workers.properties

ロギング

JkLogFile は、mod_jk がログファイルを配置する場所を指定します。

JkLogFile     /var/log/httpd/mod_jk.log

Apache 2.x の場合は JK 1.2.3 以降、Apache 1.3 の場合は JK 1.2.16 以降、これはパイプされたロギングにも使用できます。

JkLogFile     "|/usr/bin/rotatelogs /var/log/httpd/mod_jk.log 86400"

JkLogLevel は、次の間でログレベルを設定します。

  • info ログには、標準の mod_jk アクティビティが含まれます(デフォルト)。
  • error ログには、エラーレポートも含まれます。
  • debug ログには、mod_jk アクティビティに関するすべての情報が含まれます。
JkLogLevel    info

通常の操作では、info をデフォルトの選択にする必要があります。

JkLogStampFormat は、mod_jk ログファイルにある日付/時刻の形式を構成します。 詳細については、mod_jk Apache HTTP Server リファレンスを参照してください。

JkLogStampFormat "[%y-%m-%d %H:%M:%S.%Q] "

Apache 標準モジュール mod_log_config を使用して mod_jk 情報をログに記録できます。 モジュールは、Apache notes テーブルにいくつかの notes を設定します。 それらのほとんどは、ロードバランサーワーカーと組み合わせて使用する場合にのみ役立ちます。 詳細については、mod_jk Apache HTTP Server リファレンスを参照してください。

LogFormat     "%h %l %u %t \"%r\" %>s %b %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n \
              %{JK_LB_FIRST_BUSY}n %{JK_LB_LAST_NAME}n %{JK_LB_LAST_BUSY}n" mod_jk_log
CustomLog     logs/access_log     mod_jk_log

アクセスログの代わりに、mod_jk ログファイルにリクエストプロトコルを記録することもできます。 これは推奨されておらず、主に下位互換性のための機能です。 ディレクティブ JkRequestLogFormat は、このプロトコルの形式を構成します。 これは、仮想ホストごとに構成および有効化されます。 詳細については、mod_jk Apache HTTP Server リファレンスを参照してください。

JkRequestLogFormat     "%w %V %T"

転送

ディレクティブ JkOptions を使用すると、多くの転送オプションを設定できます。これにより、次のオプションが有効(+)または無効(-)になります。 先頭に記号がない場合、オプションは有効になります。

次の4つのオプション +ForwardURIxxx は相互に排他的です。 それらのうち正確に1つが必要です。負の記号プレフィックスは許可されていません。 バージョン 1.2.24 以降のデフォルト値は "ForwardURIProxy" です。 バージョン 1.2.23 では "ForwardURICompatUnparsed"、バージョン 1.2.22 までは "ForwardURICompat" でした。 他の2つのオプションのいずれかをオンにすると、デフォルトをオフにできます。 変更する正当な理由がない限り、デフォルト値のままにしておく必要があります。

すべてのオプションは、グローバルサーバーから仮想ホストに継承されます。 有効化(プラスオプション)と無効化(マイナスオプション)をサポートするオプションは、次の方法で継承されます。
options(vhost) = plus_options(global) - minus_options(global) + plus_options(vhost) - minus_options(vhost)

JkOptions ForwardURIProxy を使用すると、転送された URI は、Apache 内で処理された後、Tomcat に転送される前に部分的に再エンコードされます。 これは、mod_rewrite によるローカル URL 操作および URL エンコードされたセッションIDと互換性があります。

JkOptions     +ForwardURIProxy

JkOptions ForwardURICompatUnparsed を使用すると、転送された URI は解析されません。 仕様に準拠しており、安全です。 常に元のリクエスト URI を転送するため、mod_rewrite で URI を書き換えてから書き換えられた URI を転送することはできません。

JkOptions     +ForwardURICompatUnparsed

JkOptions の ForwardURICompat を使用すると、転送された URI は Apache によってデコードされます。エンコードされた文字はデコードされ、".." などの明示的なパスコンポーネントは既に解決されます。これは仕様への準拠度が低く、プレフィックス JkMount を使用している場合は安全ではありません。このオプションを使用すると、転送前に mod_rewrite で URI を書き換えることができます。

JkOptions     +ForwardURICompat

JkOptions の ForwardURIEscaped を使用すると、転送された URI は ForwardURICompat で使用される URI のエンコードされた形式になります。 ".." などの明示的なパスコンポーネントは既に解決されます。 これは URL エンコードされたセッション ID との組み合わせでは機能しませんが、転送前に mod_rewrite で URI を書き換えることができます。

JkOptions     +ForwardURIEscaped

JkOptions の RejectUnsafeURI は、デコード後にパーセント記号 '%' またはバックスラッシュ '\' を含むすべての URL をブロックします。

ほとんどの Web アプリケーションは、そのような URL を使用しません。 RejectUnsafeURI オプションを使用すると、いくつかの既知の URL エンコーディング攻撃をブロックできます。 デフォルトでは、このオプションは設定されていません。

mod_rewrite を使用して同様のチェックを実現することもできます。これはより強力ですが、少し複雑です。

JkOptions     +RejectUnsafeURI

JkOptions の CollapseSlashesAll は 1.2.44 以降では非推奨となり、使用しても無視されます。

JkOptions の CollapseSlashesUnmount は 1.2.44 以降では非推奨となり、使用しても無視されます。

JkOptions の CollapseSlashesNone は 1.2.44 以降では非推奨となり、使用しても無視されます。

JkOptions の ForwardDirectories は、Apache の DirectoryIndex ディレクティブと組み合わせて使用​​されます。 そのため、mod_dir は Apache で静的または動的 (DSO) に使用できる必要があります。

DirectoryIndex が構成されている場合、Apache はディレクティブで指定されたローカル URL ごとにサブ リクエストを作成し、一致するローカル ファイルがあるかどうかを判断します (これはファイルを stat することによって行われます)。

ForwardDirectories が false (デフォルト) に設定されており、Apache が一致するファイルを見つけられない場合、Apache はディレクトリのコンテンツを提供します (ディレクティブ Options がそのディレクトリの Indexes を指定している場合)、または 403 Forbidden レスポンスを提供します (ディレクティブ Options がそのディレクトリの Indexes を指定していない場合)。

ForwardDirectories が true に設定されており、Apache が一致するファイルを見つけられない場合、リクエストは解決のために Tomcat に転送されます。 これは、Apache がさまざまな理由でファイル システム上のインデックス ファイルを表示できない場合に使用されます。Tomcat が別のマシンで実行されている、JSP ファイルがプリコンパイルされているなどです。

ローカルで表示可能なファイルは、Tomcat でのみ表示可能なファイルよりも優先されることに注意してください (つまり、Apache がファイルを表示できる場合、それが提供されるファイルになります)。 これは、Tomcat が通常提供するファイルの種類が複数ある場合 (たとえば、Velocity ページと JSP ページ) に重要です。

JkOptions     +ForwardDirectories

JkOptions の ForwardLocalAddress を設定すると、mod_jk にリモート クライアント アドレスの代わりに Apache HTTP サーバーのローカル アドレスを送信するように指示します。 これは、Tomcat リモート アドレス バルブで、構成された Apache サーバーからの接続のみを許可するために使用できます。

JkOptions     +ForwardLocalAddress

JkOptions の ForwardPhysicalAddress を設定すると、mod_jk に物理ピア TCP IP アドレスをクライアント アドレスとして送信するように指示します。 デフォルトでは、mod_jk は Web サーバーから提供される論理アドレスを使用します。 たとえば、mod_remoteip モジュールは、X-Forwarded-For ヘッダーでプロキシによって転送されたクライアント IP に論理 IP アドレスを設定します。

JkOptions     +ForwardPhysicalAddress

JkOptions の FlushPackets を設定すると、Tomcat から受信した各 AJP パケット チャンクの後に Apache の接続バッファーをフラッシュするように mod_jk に指示します。 このオプションは、Apache と Tomcat に強いパフォーマンスのペナルティを与える可能性があります。これは、通常必要とされるよりも頻繁に書き込みが実行されるためです (つまり、各レスポンスの終わりに)。

JkOptions     +FlushPackets

JkOptions の FlushHeader を設定すると、Tomcat からレスポンス ヘッダーを受信した後、Apache の接続バッファーをフラッシュするように mod_jk に指示します。

JkOptions     +FlushHeader

JkOptions の DisableReuse を設定すると、接続が使用された直後に接続を閉じるように mod_jk に指示します。 通常、mod_jk は永続的な接続を使用し、アイドル状態の接続をプールして再利用します。新しいリクエストを Tomcat に送信する必要がある場合。

このオプションを使用すると、Apache と Tomcat に強いパフォーマンスのペナルティが発生します。 修正できないネットワークの問題が発生した場合にのみ、最後の手段としてこれを使用してください。 Apache と Tomcat の間のファイアウォールがアイドル状態の接続をサイレントに強制終了する場合は、ワーカー属性 socket_keepalive を OS の適切な TCP keepalive 値と組み合わせて使用​​してみてください。

JkOptions     +DisableReuse

JkOptions の ForwardKeySize を設定すると、ajp13 を使用している場合、Servlet API 2.3 で必要とされる SSL キー サイズも転送するように mod_jk に指示します。 このフラグは、サーブレット エンジンが Tomcat 3.2.x の場合は設定しないでください (デフォルトではオフ)。

JkOptions     +ForwardKeySize

JkOptions の ForwardSSLCertChain を設定すると、ajp13 を使用している場合、SSL 証明書チェーンを転送するように mod_jk に指示します (デフォルトではオフ)。 Mod_jk は SSL_CLIENT_CERT のみを AJP コネクターに渡します。 これは、自己署名証明書またはルート CA 証明書によって直接署名された証明書では問題ありません。 ただし、中間 CA 証明書によって署名された証明書が多数あり、これは重大な問題です。サーブレットはクライアント証明書を独自に検証することができません。 このバグは、SSL_CLIENT_CERT_CHAIN を AJP コネクターを介して Tomcat に渡すことで修正されます。
このディレクティブはバージョン 1.2.22 以降にのみ存在します。

JkOptions     +ForwardSSLCertChain

ディレクティブ JkEnvVar を使用すると、Apache サーバーから Tomcat エンジンに環境変数を転送できます。 ディレクティブの 2 番目のパラメーターとしてデフォルト値を追加できます。 デフォルト値が明示的に指定されていない場合、変数は実行時に設定されている場合にのみ送信されます。
変数は、request.getAttribute(attributeName) を介して Tomcat 側でリクエスト属性として取得できます。 JkEnvVar を介して送信された変数は、request.getAttributeNames() にリストされないことに注意してください。
変数は、グローバル サーバーから仮想ホストに継承されます。

JkEnvVar     SSL_CLIENT_V_START     undefined

Tomcat への URL の割り当て

上記のように、mod_jk.conf-local のカスタム バージョンまたはローカル バージョンを作成した場合は、ワーカーや URL プレフィックスなどの設定を変更できます。

JkMount ディレクティブは、特定の URL を Tomcat に割り当てます。 一般に、JkMount ディレクティブの構造は次のとおりです。

JkMount [URL prefix] [Worker name]
# send all requests ending in .jsp to worker1
JkMount /*.jsp worker1
# send all requests ending /servlet to worker1
JkMount /*/servlet/ worker1
# send all requests jsp requests to files located in /otherworker will go worker2
JkMount /otherworker/*.jsp worker2

httpd.conf ファイルの最上位レベルまたは <VirtualHost> セクション内で JkMount ディレクティブを使用できます。

静的な Web アプリケーション ファイルを提供するように Apache を構成する

Tomcat ホストの appBase (webapps) ディレクトリに Apache HTTP サーバーからアクセスできる場合、Apache は、リクエストを Tomcat に渡す代わりに、Web アプリケーション コンテキスト ディレクトリの静的ファイルを提供するように構成できます。

注意: セキュリティ上の理由から、JkMount を使用してすべてのリクエストをデフォルトで Tomcat に渡し、JkUnMount を使用して Apache によって提供される静的コンテンツを明示的に除外することを強くお勧めします。 Apache によって提供されるコンテンツは、アプリケーションの web.xml で定義されているセキュリティ制約をバイパスすることにも注意する必要があります。

Apache の Alias ディレクティブを使用して、単一の Web アプリケーション コンテキスト ディレクトリを VirtualHost の Apache ドキュメント スペースにマッピングします。

# Static files in the examples webapp are served by Apache
Alias /examples /vat/tomcat3/webapps/examples
# All requests go to worker1 by default
JkMount /* worker1
# Serve html, jpg and gif using Apache
JkUnMount /*.html worker1
JkUnMount /*.jpg  worker1
JkUnMount /*.gif  worker1

Apache 2.x の mod_jk 1.2.6 および Apache 1.3 の 1.2.19 以降では、たとえば SetEnvIf ディレクティブを使用して、env var no-jk を設定することにより、一部の URL/URI を jk 処理から除外できます。

jk と alias/userdir の URL が一致する場合、no-jk env var を使用して、mod_alias または mod_userdir ディレクティブの問題を修正できます。

# All URL goes to tomcat except the one containing /home
<VirtualHost *:80>
    ServerName testxxx.mysys
    DocumentRoot /www/testxxx/htdocs

# Use SetEnvIf to set no-jk when /home/ is encountered
    SetEnvIf Request_URI "/home/*" no-jk

# Now /home will goes to /home/dataxxx/
    Alias /home /home/dataxxx/

    <Directory "/home/dataxxx">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted
    </Directory>

    JkMount /* myssys-xxx

</VirtualHost>

mod_jk JkAutoAlias ディレクティブを使用して、すべての Web アプリケーション コンテキスト ディレクトリを Apache のドキュメント スペースにマッピングします。

Web アプリケーション コンテキストまたは Tomcat ホストの appBase (webapps) ディレクトリ内の Web アーカイブ *.war 内の WEB-INF または META-INF ディレクトリへのアクセス試行は、HTTP 403, Access Forbidden で失敗します。

# Static files in all Tomcat webapp context directories are served by Apache
JkAutoAlias /var/tomcat3/webapps

# All requests go to worker1 by default
JkMount /* ajp13
# Serve html, jpg and gif using Apache
JkUnMount /*.html ajp13
JkUnMount /*.jpg  ajp13
JkUnMount /*.gif  ajp13

セッション ID (;jsessionid=...) を含めるようにすべての URL をエンコードし、後でコンテンツの一部を Apache に移動することにした場合は、mod_jk を介して転送されないリクエストの URL からすべてのセッション ID を削除するように mod_jk に指示できます。

JkStripSession を On に設定すると、この機能が有効になります。 仮想サーバーごとに個別に有効にできます。 デフォルト値は Off です。

Unix での mod_jk の構築

mod_jk ビルドは、広く使用されている構成システムを使用します。

Subversion から mod_jk 構成を準備する

Subversion からソースを取得する場合 (つまり、既存の構成スクリプトがない場合)、構成とインストールには autoconf が必要です。

mod_jk autoconf スクリプトを作成するには、libtool 1.5.2、automake 1.10、autoconf 2.59 以降が必要です。 最新バージョンのオペレーティング システムの機能を確実に検出するために、より新しいバージョンを使用することをお勧めします。

これらのツールは、apache.org からダウンロードしたパッケージを使用しているだけの場合は必要ありません。開発者のみが必要です。

構成スクリプトを作成するには、次のように入力します。 ./buildconf.sh

構成を使用した mod_jk の構築

構成を使用して mod_jk を構築用に準備する方法を次に示します。次のように入力します。

./configure [autoconf arguments] [mod_jk arguments]

CFLAGSLDFLAGS を設定して、プラットフォーム固有のものを追加できます。

LDFLAGS=-lc ./configure -with-apxs=/home2/local/apache/bin/apxs

Apache HTTP サーバーの異なるバージョン (1.3 や 2.x など) 用に mod_jk を構築する場合は、それぞれの完全なビルド プロセスを実行する必要があります。 Apache 2.0、2.2、または 2.4 モジュールは、バイナリ互換性がないことに注意してください。 実行する予定の Apache バージョンを使用してモジュールをコンパイルする必要があります。 使用される mod_jk ビルド ディレクトリは、すべての 2.x ビルドで "apache-2.0" です。 ソース コードは、Apache HTTP Server 2.0、2.2、および 2.4 と互換性があります。

  • 構成を使用し、正しい Apache HTTP Server apxs の場所 (--with-apxs) を示します。
  • make を使用します。
  • 結果として得られた mod_jk.so バイナリを apache-1.3 または apache-2.0 サブディレクトリから Apache HTTP サーバーのモジュール フォルダーにコピーします。
  • make clean (以前にコンパイルされたすべてのオブジェクト ファイルを削除するため)
  • 次の Apache HTTP サーバー バージョンの apxs の場所からやり直してください。

構成引数

Apache 関連のパラメーター
--with-apxs[=FILE] FILE は apxs ツールの場所です。 デフォルトでは、PATH で apxs を検索します。 共有 Apache モジュールを構築します。 Apache のバージョンを自動的に検出します (2.x および 1.3)。
--with-apache=DIR DIR は Apache ソースが配置されているパスです。 Apache ソースは、mod_jk を構成する前に構成されている必要があります。 DIR は /home/apache/apache_1.3.19 のようになります。 静的な Apache モジュールを構築します。
--enable-EAPI このパラメーターは、Apache-1.3 と mod_ssl を使用する場合に必要です。そうしないと、Apache で mod_jk.so をロードするときに「このモジュールは EAPI でクラッシュする可能性があります!」というエラー メッセージが表示されます。 --with-apxs が使用されている場合は必要ありません。
--enable-prefork マルチスレッド Apache HTTP Server 2.x MPM (マルチプロセッシング モジュール) 用に mod_jk を構築する場合、mod_jk コードの一部の領域を同期させて、スレッドセーフにする必要があります。 構成でマルチスレッド MPM を使用しているかどうかを簡単に検出できないため、mod_jk はデフォルトで Apache HTTP Server 2.x 用に常にスレッドセーフに構築されます。 MPM がマルチスレッドではないことが確実な場合は、"--enable-prefork" を使用して同期コードの削除を強制できます (したがって、パフォーマンスが少し向上します)。 たとえば、prefork MPM はマルチスレッドではありません。 Apache HTTP Server 1.3 の場合、このフラグは自動的に設定されます。
--disable-trace ログ レベル "trace" を使用する場合、mod_jk は多数の関数呼び出しを "enter" および "exit" ログ メッセージでトレースします。 ログ レベルが "trace" でない場合でも、ログ レベルを比較してログ記録について決定すると、パフォーマンスに影響を与える可能性があります。
"--disable-trace" を使用すると、トレース ログ コードはモジュール バイナリにコンパイルされず、実行中に一部のサイクルを節約できる可能性があります。
"--disable-trace" を使用しても、デバッグ ログ レベルでデバッグ メッセージをログ記録することは可能です。
--enable-api-compatibility 選択したメジャー Apache リリース ブランチのすべての Apache 製品リリースで利用可能な Apache API 関数のみを使用します。 これにより、mod_jk が構築されたリリースよりも古い Apache リリースとのモジュール ビルドのバイナリ互換性が向上します (マイナー Apache バージョン間のみ)。
--enable-flock オペレーティング システムが flock システム コールをサポートしている場合は、このフラグを使用して、GNU C ライブラリによってエミュレートされる代わりにシステム コールとして実装される、より高速なロックを有効にします。
ただし、これらのロックは NFS マウントされたボリュームでは機能しないため、コンパイル時に "--enable-flock" を使用して flocks() 呼び出しを強制できます。

構成の使用例

Apache 1.3 および 2.x ビルド ./configure --with-apxs=/usr/sbin/apxs
make
cp ./apache-1.3/mod_jk.so /usr/lib/apache
make clean
./configure --with-apxs=/usr/sbin/apxs2
make
cp ./apache-2.0/mod_jk.so /usr/lib/apache2

Windows での Apache 用の mod_jk の構築

モジュールは Microsoft Visual C++ を使用して開発されたため、独自のビルドを実行する場合は、Visual Studio をインストールしておくことが前提条件となります。

IDE GUI を使用するか、nmake に基づく純粋なコマンドライン ビルドを使用してソースを構築できます。 IDE ビルドは現在、32 ビット バイナリの構築のみをサポートしています。 nmake ビルドは、32 ビット バイナリと 64 ビット バイナリで使用できます。

すべてのビルド手順の共通ステップは次のとおりです。

  • 32 ビットまたは 64 ビットのビルド環境を設定します。 IDE ビルドは 32 ビットのみをサポートします。
  • ソースを zip ファイルとしてダウンロードして解凍します。
  • ディレクトリを ISAPI リダイレクター ソース ディレクトリに変更します。
  • 環境内の Apache Web サーバー ディレクトリへのパスを設定します。
32 ビットまたは 64 ビットのビルド環境を設定する setenv /Release /X86 または (IDE ビルドでは使用できません) setenv /Release /X64 tomcat-connectors-xxx-src.zip を次からダウンロードします。 https://tomcat.dokyumento.jp/download-connectors.cgi 解凍します。 unzip tomcat-connectors-xxx-src.zip ディレクトリを mod_jk ソース ディレクトリに変更します。 Apache HTTP サーバー 2.0、2.2、または 2.4 用に mod_jk を構築するには、 古い Apache HTTP サーバー 1.3 の場合は、"apache-1.3" ディレクトリを使用します。 cd tomcat-connectors-xxx-src\native\apache-2.0 環境変数 "APACHE1_HOME" を設定します。 resp。 "APACHE2_HOME" resp. "APACHE22_HOME" resp. "APACHE24_HOME" Apache Web サーバーのインストール パスへ。 set APACHE24_HOME=D:\software\Apache\httpd-2.4.16

IDE ビルドのステップは次のとおりです。

  • "start mod_jk.dsp" を使用して Visual Studio を起動します。
  • IDE の起動中に、すべての変換ポップアップで "はい" を選択します。
  • 次に、ドロップダウンから構成を選択します。 デバッグ ビルドとリリース ビルド用に事前に定義された構成があり、"apache-2.0" ディレクトリでは、Web サーバー バージョン 2.0、2.2、および 2.4 に対してビルドするための構成としてそれぞれ使用できます。
  • 最後に、[ビルド] メニューで [ソリューションのビルド] を選択します。
結果として得られたファイル mod_jk.so (およびデバッグ シンボル ファイル mod_jk.pdb) は、選択したビルド構成に応じて、"Debug" resp. "Release" サブディレクトリにあります。 "apache-2.0" モジュールの場合、ディレクトリの名前は、選択したビルド構成に応じて "Debug_20"、"Release_20"、"Debug_22"、"Release_22"、"Debug_24"、および "Release_24" になります。

または、nmake コマンドライン ビルドのステップは次のとおりです。

  • ファイル Makefile.vc の "ARCH=" 行を編集して、ターゲット アーキテクチャを X86 または X64 に設定します。
  • "nmake -f Makefile.vc" を実行します。
結果として得られたファイル mod_jk.so (およびデバッグ シンボル ファイル mod_jk.pdb) は、選択したビルド構成に応じて、"Debug" resp. "Release" サブディレクトリにあります。 "apache-2.0" モジュールの場合、ディレクトリの名前は、選択したビルド構成に応じて "Debug_20"、"Release_20"、"Debug_22"、"Release_22"、"Debug_24"、および "Release_24" になります。

最後に、ファイル mod_jk.so を Apache HTTP サーバーの modules ディレクトリ (resp. 古い Apache 1.3 の libexec ディレクトリ) にコピーする必要があります。

Apache HTTP Server 1.3 の場合、mod_jk のリンクを成功させるには、ApacheCore.lib が存在することが前提となります。

System I - i5/OS (OS400) での Apache 用の mod_jk の構築

OS400 V4R5 以降、System I (AS/400) は、古い IBM Web サーバーに代わるプライマリ Web サーバーとして Apache 2.0 を使用してきました。 i5/OS への mod_jk の適応に関する情報とパッチを提供してくれた IBM Rochester Labs のおかげで、System I で mod_jk を構築できるようになりました。

少なくとも Apache 2.0.58 (製品 5722DG1)、C コンパイラー、および IFS が必要です。 Apache 2.0.58 は、iSeries Apache サーバーの最新の PTF セットで提供されています。これは http://www.ibm.com/servers/eserver/iseries/software/http/ にあります。

i5/OS V5R3 (または V5R4) の最新の Apache 2 は、現在 2.0.58 です (2007/04/17 現在)。 jk 1.2.15 以降を使用する場合は、最新の PTF がロードされていることを確認してください。 注: i5/OS V5R3 で動作することがわかっている最新の mod_jk は 1.2.19 でした。

i5/OS V5R4 の新機能である UTF は、Apache モジュールでも必要です。 Apache モジュールは EBCDIC との間で変換を必要としませんが、mod_jk 1.2.23 (以降) を V5R4 に移植するための作業が必要です。 V5R4 Infocenter から: i5/OS(tm) V5R4 以降、モジュールは UTF ロケールで再コンパイルする必要があります。 これにより、ロケールに依存する C ランタイム関数が、文字列データが UTF-8 でエンコードされていると想定する環境が作成されます。 モジュールに #pragma convert(1208) ステートメントを追加すると、ハードコードされた定数を UTF-8 でエンコードできます。 さらに、クライアントからの入力データは EBCDIC に変換されなくなり、そのまま渡されます。 モジュールから送信された出力データも変換されないため、必要に応じて ASCII または UTF8 でエンコードする必要があります。 V5R4 以降の APR および HTTP API は、UTF-8 でのデータを想定しています。 パラメーターのエンコードを示すために CCSID を設定できる追加の関数を持つ API がいくつかあることに注意してください。 UTF-8 と EBCDIC の間の変換関数が追加されました。 モジュールで使用される API を確認して、現在の変更を認識していることを確認してください。

System I で mod_jk を構成するには、mod_jk ソースで提供されている CL ソースを使用します。

  • 最新の mod_jk ソースを取得し、Windows または Unix ボックスで展開します。
  • IFS にディレクトリを作成します (つまり、/home/apache)
  • FTP 経由で jk ソース ディレクトリ全体を System I ディレクトリに送信します。
  • 次に、System I コマンドラインに移動します。
mod_jk ライブラリを作成します。 CRTLIB MOD_JK TEXT(‘Apache mod'jk tomcat コネクター モジュール') サービス プログラム ソース ファイルを作成します。 CRTSRCPF MOD_JK/QSRVSRC TEXT(‘サービス プログラム ソース ファイル’) CL ビルド プログラム ソース ファイルを作成します。 CRTSRCPF FILE(MOD_JK/QCLSRC) TEXT(‘ビルド プログラム ソース ファイル’) サービス プログラム ソース ファイルを編集します。 STRSEU MOD_JK/QSRVSRC MOD_JK

編集したファイルで、jk_module のみエクスポートされるように指定します。 Columns . . : 1 71 Edit MOD_JK/QSRVSRC SEU==> MOD_JK *************** Beginning of data ************************************* 0001.00 STRPGMEXP PGMLVL(*CURRENT) 0002.00 EXPORT SYMBOL("jk_module") 0003.00 ENDPGMEXP ****************** End of data ****************************************

mod_jk のすべてのモジュールの構築を開始できます (V5R4 または以前のリリースのケース)。

IFS から V5R4 より前の i5/OS 用の CL ビルド プログラム ソースをコピーします。 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK.MBR') MBROPT(*REPLACE) CL ビルド プログラムを構築します。 CRTCLPGM PGM(MOD_JK/BLDJK) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk ビルド プログラム') ビルドを起動します。 CALL MOD_JK/BLDJK
ビルドが成功した場合、新しい mod_jk モジュールをコピーします。 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)
IFS から i5/OS V5R4 用の CL ビルド プログラム ソースをコピーします。 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk54.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK54.MBR') MBROPT(*REPLACE) i5/OS V5R4 用の CL ビルド プログラムを構築します。 CRTCLPGM PGM(MOD_JK/BLDJK54) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk ビルド プログラム') TGTRLS(*CURRENT) i5/OS V5R4 のビルドを起動します。 CALL MOD_JK/BLDJK54
ビルドが成功した場合、新しい mod_jk モジュールをコピーします。 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)

次に、Apache 2.0 インスタンスを再起動して、System I でこの OpenSource をお楽しみください。

ENDTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER) STRTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER)

MacOS/X での Apache 用の mod_jk の構築

Mac OS X (10.2.x) ビルド ノート

root であることを前提とします。

Apache 1.3 の場合 ./configure --with-apxs=/usr/sbin/apxs cd apache-1.3 make -f Makefile.apxs cp mod_jk.so /etc/libexec/httpd Apache 2.x の場合 ./configure --with-apxs=/usr/local/apache2/bin/apxs (Apache 2.x をインストールしたディレクトリを指す必要があります) cd apache-2.0 make -f Makefile.apxs install

mod_jk を Apache に静的にリンクする

mod_jk を Apache ソース ツリーにインストールして、静的にリンクされた mod_jk を取得できます。 mod_jk を Apache 実行可能ファイルに含めると、パフォーマンスがわずかに向上します。 構成オプション --with-apache は、Apache ソース ツリーにインストールするために mod_jk を準備します。 オプション --with-apache は、Apache 1.3 と Apache 2.x の両方で機能します。 以下の例は、mod_jk を Apache プロセスに含める方法を示しています。

Apache-2.x のインストール

/home/apache24/httpd-2.4.12 は、Apache HTTP サーバー ソースが配置されているディレクトリです。 ./configure --with-apache=/home/apache24/httpd-2.4.12
make
/home/apache24/httpd-2.4.12/modules に mod_jk ライブラリとその他のファイルをインストールします。 make install
mod_jk の config.m4 を httpd-2.x の構成に追加する必要があるため、Apache を直接構成することはできません。 cd /home/apache24/httpd-2.4.12 sh buildconf configure ... --with-mod_jk make make install

enable-jk=share と enable-jk=static はサポートされていません。 --with-mod_jk では、mod_jk の静的リンクのみが許可されます。

Apache-1.3 のインストール

/home/apache/apache_1.3.27 は、apache-1.3 ソースが配置されているディレクトリです。 ./configure --with-apache=/home/apache/apache_1.3.27
make
/home/apache/apache_1.3.27/src/modules/jk に libjk ライブラリ、mod_jk.c、インクルード、およびその他のファイルをインストールします。 make install
Apache ソースで構成します。 cd /home/apache/apache_1.3.27 configure ... --enable-module=dir --disable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --disable-shared=jk make make install

--enable-shared=jk も動作し、dsoファイルを作成します。

Apacheのソースのconfigureを変更するだけです configure ... --enable-module=dir --enable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --enable-shared=jk