AJPコネクタ

  • Tomcat Version:8.5.23

AJPコネクタ要素は、AJPプロトコルを介してウェブコネクタと通信するコネクタコンポーネントを意味します。
AJP1.3プロトコルとは、ApacheHttpServerとServletコンテナとの通信をHTTP通信プロトコルより効率化を目指した ApacheHttpServer及びServletコンテナ(Tomcat)接続のためのプロトコルです。

ajp13プロトコルは、パケット指向です。 より読みやすいプレーンテキスト形式ではなく、たぶん性能向上のためにバイナリ形式を選択しています。
Webサーバは、ServletコンテナとTCPコネクション上で通信します。
ソケット作成の無駄な過程を削減するために、WebサーバはServletコンテナに対して永続的なTCPコネクションを保持して、
複数のリクエスト/レスポンスサイクルの間コネクションを再利用しようとします。

http://www.jajakarta.org/tomcat/tomcat3.2-4.0/tomcat-3.2.3/doc-ja/AJPv13.htmlより

(筆者記)ApacheHttpServer2.4系とTomcat8.5系の連結方法に関する考察は、別頁にて説明したいと思います。
ここでは、純粋に「Apache Tomcat 8 Configuration Reference」の「Connectors」-「AJP」の日本語訳として、
AJPを利用した場合設定できる属性とその説明に集約したいと思います。

このコネクターは、EngineタグのjvmRoute属性と組み合わせて使用すると、ロード・バランシングをサポートします。

このTomcatリリースでサポートされているネイティブコネクタは次のとおりです。

  • JK1.2.xと互換性があります。詳細については、JKドキュメントを参照してください。
  • Apache HTTP Server 2.xのmod_proxy(Apache HTTP Server 2.2にデフォルトで含まれています)、AJPを有効にしました。
    詳細については、httpdのドキュメントを参照してください。

AJPをサポートする他のネイティブコネクタも動作しますが、サポートされなくなりました。

デフォルトのAJP設定

Tomcat - server.xml - Connectorタグ(Http)頁内のprotocol属性記述されているように
AJPの利用は、「Connector」タグの「protocol」属性に「AJP/1.3」を指定する事です。
指定することで、以下の何れかのコンポーネントがAJPプロトコル接続を実行します。

  • 「AJP/1.3」かつAPR利用時・・org.apache.coyote.ajp.AjpAprProtocol
  • 「AJP/1.3」かつAPR未利用時・org.apache.coyote.ajp.AjpNioProtocol
server.xmlのAJP設定箇所 L.111
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
					

AJPコネクタ共通属性

Connectorのすべての実装では、次の属性がサポートされています。

(筆者記入)使うべき属性はConnectorタグ共通属性に記載された属性の
適用範囲が絞りこまれているだけで、説明の本文、デフォルト値は「protocol」属性以外は全て同一です。

属性 デフォルト値 説明
ajpFlush true 明示的なフラッシュが発生するたびに、AJPのフラッシュメッセージをフロントプロキシに送信するかどうかを設定するために使用できるブール値。
AJPフラッシュメッセージは、ボディコンテンツのないSEND_BODY_CHUNKパケットです。
mod_jkやmod_proxy_ajpのようなプロキシの実装は、そのようなパケットを受け取ったときに、
Webサーバーにバッファされたデータをクライアントにフラッシュします。
これをfalseに設定すると、AJPパケットのトラフィックは減少しますが、
クライアントへのパケットの送信が遅れる可能性があります。
応答の最後に、AJPは常にクライアントにフラッシュされます。
allowTrace false TRACE HTTPメソッドを有効または無効にするために使用できるブール値。
asyncTimeout 30000 非同期要求のデフォルトのタイムアウト(ミリ秒単位)。
enableLookups false リモートクライアントの実際のホスト名を返すために
request.getRemoteHost()への呼び出しでDNSルックアップを実行する場合は、trueに設定します。
falseに設定すると、DNSルックアップをスキップし、代わりにString形式のIPアドレスを返します
(これによりパフォーマンスが向上します)。デフォルトでは、DNSルックアップは無効になっています。
maxHeaderCount 100 コンテナによって許可される要求内のヘッダーの最大数。
指定された制限より多くのヘッダーを含む要求は拒否されます。
0より小さい値は無制限を意味します。指定しない場合は、デフォルトの100が使用されます。
maxParameterCount 10000 コンテナによって解析されたGETとPOST合算のリクエストパラメータ(パラメータ名と値の組み合わせ)数の最大値。
この上限値を超えたパラメータは無視されます。
0より小さい値は、無制限を意味します。
org.apache.catalina.filters.FailedRequestFilterを使用して、上限に達したリクエストを拒否できます。
maxPostSize 2097152(2MB) コンテナのFORM URLパラメータの解析によって処理されたPOSTの最大サイズ(単位:バイト)。
0より小さい値は、無制限を意味します。
org.apache.catalina.filters.FailedRequestFilterを使用して、上限に達したリクエストを拒否できます。
maxSavePostSize 4096(4KB) FORMまたはCLIENT-CERT認証時にコンテナによって保存/バッファされるPOSTの最大サイズ(バイト単位)。
・両方のタイプの認証では、POSTはユーザが認証される前に保存/バッファされます。
・CLIENT-CERT認証の場合、POSTはSSLハンドシェイクの間バッファリングされ、
リクエストが処理されるとバッファは空になります。
・FORM認証では、POSTは保存され、ユーザーはログインフォームにリダイレクトされます。
ユーザーが正常に認証されるか、認証要求に関連付けられたセッションが期限切れになるまで保持されます。
・制限を無効にするには、この属性を-1に設定します。
・属性をゼロに設定すると、認証時にPOSTデータの保存が無効になります。
parseBodyMethods POST リクエストボディがPOSTと同じようにリクエストパラメーター用に解析されるHTTPメソッドのコンマ区切りのリスト。
これは、PUT要求に対してPOSTスタイルのセマンティクスをサポートしたいRESTfulアプリケーションで便利です。
POST以外の設定では、Tomcatはサーブレット仕様の意図に反して動作することに注意してください。
HTTPメソッドTRACEは、HTTP仕様に従って特にここでは禁止されています。
port -1 このコネクタがサーバソケットを作成し、着信接続を待つTCPポート番号。
OSでは特定のIPアドレス上の特定のポート番号を1つのサーバーアプリケーションだけがリッスンできます。
特別な値0を使用すると、Tomcatは無作為に空きポートを選択してこのコネクタに使用します。
これは通常、組み込みアプリケーションおよびテストアプリケーションでのみ有効です。
※.(筆者追記)下線部分の内容は、ソース上ではデフォルト値は-1であり、分岐条件は「0より大きい場合」に指定したポートを利用しています。 ・AJP1.3のデフォルト設定は、8009が設定されています。
protocol -1 着信トラフィックを処理するようにプロトコルを設定します。
AJPを利用するには、値に「AJP/1.3」を指定します。 (筆者追記)この属性はコンテナへの接続処理を行うProtocolHandlerClassを指定するための属性です。
文字列「HTTP/1.1」,「未指定(null)」,「AJP/1.3」だけは自動で内部でProtocolHandlerClassNameを確定しています。
以下の何れかProtocolHandlerClassがConnectorとしてロードされます。
・null値(未指定)の場合には、「HTTP/1.1」と同値。
・「HTTP/1.1」かつAPR(Apache Portable Runtime)利用時・・org.apache.coyote.http11.Http11AprProtocol
・「HTTP/1.1」かつAPR未使用時・・org.apache.coyote.http11.Http11NioProtocol
・「AJP/1.3」かつAPR利用時・・org.apache.coyote.ajp.AjpAprProtocol
・「AJP/1.3」かつAPR未利用時・org.apache.coyote.ajp.AjpNioProtocol
・上記以外は、指定されたJavaの完全修飾子のクラス名をロードします。
PATH(Windows)またはLD_LIBRARY_PATH(ほとんどのUNIXシステムで)環境変数に
Tomcatネイティブライブラリが含まれている場合、 APRを初期化するために使用されるAprLifecycleListenerにuseAprConnector属性がtrueに設定されている場合、
APR /ネイティブコネクタが使用されます。ネイティブライブラリが見つからないか、属性が設定されていない場合は、Java NIOベースのコネクタが使用されます。
APR /ネイティブコネクタには、Javaコネクタとは異なるHTTPS設定があります。
上記の自動切り替えメカニズムに依存するのではなく、明示的なプロトコルを使用するには、次の値を使用できます。
・org.apache.coyote.ajp.AjpNioProtocol - non blocking Java NIO connector.
・org.apache.coyote.ajp.AjpNio2Protocol - non blocking Java NIO2 connector.
・org.apache.coyote.ajp.AjpAprProtocol - the APR/native connector.
proxyName null このコネクターがプロキシー構成で使用されている場合は、この属性を構成して、
request.getServerName()への呼び出しで戻されるサーバー名を指定します。
詳細については、プロキシサポートを参照してください。
proxyPort 0 このコネクターがプロキシー構成で使用されている場合は、この属性を構成して、
request.getServerPort()への呼び出しで戻されるサーバー・ポートを指定します。
詳細については、プロキシサポートを参照してください。
redirectPort 443 このコネクタが非SSL要求をサポートしていて、一致する<security-constraint>にSSL転送が必要な要求が受信された場合、
Catalinaはリクエストをここで指定されたポート番号に自動的にリダイレクトします。
scheme http この属性には、request.getScheme()の呼び出しによって返されるプロトコルの名前を設定します。
たとえば、SSLコネクタの場合、この属性を「https」に設定します。
secure false このコネクタで受信したリクエストに対してrequest.isSecure()がtrueを返すようにするには、この属性をtrueに設定します。
これは、暗号化カード、SSLアプライアンス、WebサーバーなどのSSLアクセラレータからデータを受信するSSLコネクタまたは非SSLコネクタで必要になります。
sendReasonPhrase false レスポンスに理由フレーズを使用する場合は、この属性をtrueに設定します。
注:このオプションは廃止され、Tomcat 9で削除されます。理由フレーズは送信されません。
URIEncoding UTF-8 %xxがURLをデコードした後、URIバイトのデコードに使用される文字エンコードを指定します。
指定されていない場合は、org.apache.catalina.STRICT_SERVLET_COMPLIANCEシステム・プロパティーが
trueに設定されている場合は、「ISO-8859-1」が使用されそれ以外の場合には、「UTF-8」が使用されます。
useIPVHosts false この属性をtrueに設定すると、Tomcatは要求を受け取ったIPアドレスを使用して要求を送信するホストを決定します。
xpoweredBy false この属性をtrueに設定すると、Tomcatは仕様で推奨されているヘッダーを使用してサーブレット仕様のサポートを宣伝します。

Connectorタグ標準実装(AJP)

AJPを使用するには、プロトコル属性を指定する必要があります(上記参照)。
標準のAJPコネクタ(NIO、NIO2、APR /ネイティブ)は、上記の共通属性に加えて、次の属性をすべてサポートしています。

Connectorタグ標準実装

(筆者記)Connectorタグの設定により、スレッドプール機能を利用してリクエストが処理されることをExecutorタグでふれました。
本節では、Tomcatのチューニングに重要な属性が多く存在しますので、Tomcatサーバの管理者の方は是非その内容に関してご確認下さい。

標準のHTTPコネクタ(NIO、NIO2、APR /ネイティブ)は、上記の共通Connector属性に加えて、次の属性をすべてサポートしています。

属性 未指定時の
デフォルト値
説明
acceptCount 100 可能なすべてのリクエスト処理スレッドが使用されているときに着信接続要求の最大キュー長。
キューが満杯になったときに受信された要求は拒否されます。
acceptorThreadCount 1 接続を受け入れるために使用されるスレッドの数。
マルチCPUマシンではこの値を大きくしてください。
実際には2を超える値は必要ありません。
また、キープアライブのない接続が多い場合は、この値を大きくすることもできます。
acceptorThreadPriority 5 アクセプタスレッドの優先順位。新しい接続を受け入れるために使用されるスレッド。
デフォルト値は5(java.lang.Thread.NORM_PRIORITY定数の値)です。
この優先順位の意味の詳細については、JavaDocのjava.lang.Threadクラスを参照してください。
address null 複数のIPアドレスを持つサーバーの場合、この属性は指定されたポートでリッスンするために使用されるアドレスを指定します。
デフォルトでは、このポートはサーバーに関連付けられたすべてのIPアドレスで使用されます。
127.0.0.1の値は、コネクターがループバック・インターフェースでのみリッスンすることを示します。
bindOnInit true コネクタで使用されるソケットがバインドされているときの制御を行います。
デフォルトでは、コネクターが開始されたときにバインドされ、
コネクターが破棄されたときにアンバインドされます。
falseに設定すると、コネクターは開始時にバインドされ、停止時にはアンバインドされます。
clientCertProvider null (String)クライアント証明書情報がjava.security.cert.X509Certificateのインスタンス以外の形式で提示される場合、
その証明書は使用する前に変換する必要があり、このプロパティは変換を実行するために使用されるJSSEプロバイダを制御します。
たとえば、AJPコネクタ、HTTP APRコネクタ、org.apache.catalina.valves.SSLValveで使用されます。
指定しない場合は、デフォルトのプロバイダが使用されます。
connectionLinger -1(無効) このコネクタで使用されているソケットが閉じられたときに待機する秒数。
デフォルト値は-1で、socket lingerを無効にします。
connectionTimeout -1 Request-Line(要求行)が表示されるために、このコネクタが接続を受け入れた後に待機するミリ秒数。
AJPプロトコルコネクタのデフォルト値は-1(無制限)です。 (筆者記)ConnectorのHTTPプロトコルを指定した場合のデフォルト値は「60」秒です。
AJPプロトコルでは、デフォルト値が「-1(無制限)」であることからTomcatサーバーの設計及び設定値に変更する可能性が高い項目です。
executor null リクエストを処理させるスレッドプールをExecutorで定義して利用する場合に、そのExecutorのname属性を指定します。
この属性が設定され、名前付きExecutorが存在する場合、コネクターはExecutorを使用し、他のすべてのスレッド属性は無視されます。
コネクターにExecutorが指定されていない場合、コネクターは専用の内部実行プログラムを使用して
スレッド・プールを提供することに注意してください。
executor
TerminationTimeoutMillis
5000(5秒) 内部実行プログラムが、リクエスト処理スレッドが終了するのを待ってから、
コネクターを停止するプロセスを続行する時間。
keepAliveTimeout 20000(20秒) このコネクターが接続を閉じる前に別のAJP要求を待機するミリ秒数。
(筆者記)原文のニュアンスとソース、server.xmlの値から判断すると
connectionTimeoutの属性値とkeepAliveTimeout属性値を揃えて欲しい事が読み取れます。
maxConnections NIO・・10000
NIO2・・10000
APR/Native・・8192
任意の時点でサーバーが受け入れて処理する接続の最大数。
この数に達すると、サーバーは1つの接続を受け付けますが、処理しません。
この追加の接続は、処理される接続の数がmaxConnectionsを下回るまでブロックされ、
サーバーは新しい接続の受け入れと処理を再び開始します。
制限に達すると、OSは引き続きacceptCount設定に基づいて接続を受け付ける可能性があることに注意してください。
既定値はコネクタの種類によって異なります。

注)WindowsのAPR /ネイティブの場合、設定された値はmaxConnections以下の1024
の最高倍数に減少することに注意してください。これはパフォーマンスの理由から行われます。
値を-1に設定すると、maxConnections機能は無効になり、接続数はカウントされません。
maxCookieCount 200 リクエストに対して許可されるクッキーの最大数。
0より小さい値は無制限を意味します。
maxThreads 200 このコネクタがリクエスト処理対して作成するスレツドの最大数(最大同時実行数)。
Executor属性を指定しないConnector属性はスレッドプールを構成します。
そのスレッドプールが処理待ちキューから実際にリクエスト処理をするスレッドの最大数です。
Executor属性を指定されている場合には、Executor側でスレッドプールを構成するため、Connector要素の本属性は無視されます。
minSpareThreads 10 スレッドプールで管理されるタスク待ちのスレッドの最小数。
Executor属性を指定されている場合には、Executor側でスレッドプールを構成するため、Connector要素の本属性は無視されます。
packetSize 8192 この属性は、最大AJPパケットサイズをバイト単位で設定します。最大値は65536です。
mod_jk用に構成されたmax_packet_size指示値と同じにする必要があります。
通常、最大パケットサイズを変更する必要はありません。
証明書または証明書チェーンを送信するときに、デフォルト値の問題が報告されています。
デフォルト値は8192です。8192未満に設定すると、設定は無視され、デフォルト値の8192が使用されます。
processorCache 200 プロトコルハンドラはパフォーマンスを向上させるためにProcessorオブジェクトをキャッシュします。
この設定によって、これらのオブジェクトのうちキャッシュされるオブジェクトの数が決まります。
-1は無制限を意味し、デフォルトは200です。
Servlet 3.0の非同期処理を使用しない場合は、maxThreads設定と同じものを使用することをお勧めします。
Servlet 3.0の非同期処理を使用する場合は、maxThreadsのうち大きい方と予想される同時要求数(同期および非同期)を使用することをお勧めします。
requiredSecret null このキーワードを持つタスク待ちキュー内のリクエストのみが受け入れられます。
tcpNoDelay true trueに設定すると、TCP_NO_DELAYオプションがサーバーソケットに設定され、
ほとんどの状況でパフォーマンスが向上します。
threadPriority 5 JVM内の要求処理スレッドの優先順位。
デフォルト値は、5(Thread.NORM_PRIORITY)です。
優先順位の意味の詳細については、JavaDocのjava.lang.Threadクラスを参照してください。
Executor属性を指定されている場合には、Executor側でスレッドプールを構成するため、Connector要素の本属性は無視されます。
tomcatAuthentication true trueに設定すると、認証はTomcatで行われます。
それ以外の場合は、認証されたプリンシパルがネイティブWebサーバーから伝播され、Tomcatの認証に使用されます。
このプリンシパルには関連付けられたロールはありません。
デフォルト値はtrueです。 tomcatAuthorizationがtrueに設定されている場合、この属性は無効です。
tomcatAuthorization false trueに設定すると、認証されたプリンシパルがネイティブWebサーバーから伝播され、Tomcatですでに認証されているとみなされます。
Webアプリケーションに1つ以上のセキュリティ制約がある場合、
認証されたプリンシパルに割り当てられたTomcatとロールによって承認が実行されます。
要求の適切なTomcatレルムが提供されたユーザー名を認識しない場合でも、プリンシパルは作成されますが、役割はありません。
デフォルト値はfalseです

Java TCP socket属性

HTTPプロトコルと同様の属性が指定可能です。server.xml-Connectorタグ-socketオプション頁の「JavaTCPソケット属性」欄をご確認下さい。

NIO固有属性

HTTPプロトコルと同様の属性が使えますが以下の属性がAJPでは利用できません。

  • pollerThreadCount
  • pollerThreadPriority
  • selectorTimeout
  • useSendfile
  • socket.directSslBuffer

他のNIO固有属性はHTTPプロトコルと同様の属性が指定可能です。server.xml-Connectorタグ-socketオプション頁の「NIO固有属性」欄をご確認下さい。

NIO2固有属性

HTTPプロトコルと同様の属性が使えますが以下の属性がAJPでは利用できません。

  • useSendfile
  • socket.directSslBuffer

(筆者記)AJPコネクタのNIO2固有属性が、「useCaches」がTomcat8系のドキュメントで定義されています。
しかしながら、Connector属性としては利用できないはずです。
ソースによるチェックとconfigtest.batによる検証で指定できない主旨の警告がでます。

他のNIO固有属性はHTTPプロトコルと同様の属性が指定可能です。server.xml-Connectorタグ-socketオプション頁の「NIO2固有属性」欄をご確認下さい。

APR/native固有属性

APR/native実装では、上記の共通のConnectorおよびAJP属性に加えて、次の属性もサポートされています。

属性 未指定時の
デフォルト値
説明
pollTime 2000(ミリ秒) ミリ秒単位のポーリングコールの期間。
この値を小さくすると、接続のレイテンシが若干低下することがありますが、
ポーリングコールが増えるほどCPUが多く使用されます。

AJPに対する筆者の見解

ApacheHttpServerとTomcatの接続に関しては、別頁にて記述する予定です。
但し、私の見解としては、WebサーバーがApacheからNginxが増えている2017年以降に例えApacheを利用していても、AJP1.3を利用する必要性は無いかと思います。
なぜならばAJP及びmod_jk系自体が過去バージョン時の資産であり、AJPのモジュールの作者、コミュニティ、継続性などが不安定で今後発展する可能性が少ないからです。

ApacheHttpSereverとの連携であればmod_proxy_httpモジュールと連携したhttpプロトコルの連携(コネクタタグ属性のprotocol値がhttp系)の設定属性の理解とノウハウを増やした方が、
他のWebサーバとの連携にも汎用的にそのノウハウが活かしやすいからです。