AJP(ApacheとTomcatの接続)でTomcat側でのTransfer-Encoding: chunked

先日、Content-LengthとTransfer-Encoding: chunkedなんていう、
なんとも不親切なエントリを書きましたが、
その続編といいますか。IOExceptionでBad Chunk Sizeって言われて、
ちょっと困った事があったので、その備忘録的な。
  
■ 環境構築(今回はMacで)
– Tomcat

MacBookPro% sudo /opt/local/bin/port install tomcat6
Warning: port definitions are more than two weeks old, consider using selfupdate
--->  Computing dependencies for tomcat6
〜略〜
# Configuration files in /opt/local/share/java/tomcat6/conf have been
# installed with a .sample extension so that they won't be replaced by a
# port update. Each will be copied to its proper location during the
〜略〜
# The script /opt/local/share/java/tomcat6/bin/tomcatctl has been installed to
# facilitate start and stop of tomcat using the jsvc utility, which allows you to
# start tomcat as a true daemon process. Once tomcat has acquired its TCP socket,
〜略〜
--->  Activating tomcat6 @6.0.30_0
--->  Cleaning tomcat6

とりあえず起動させてみます

% sudo /opt/local/share/java/tomcat6/bin/tomcatctl start
Password:
conf_setup.sh: file conf/catalina.policy is missing; copying conf/catalina.policy.sample to its place.
conf_setup.sh: file conf/catalina.properties is missing; copying conf/catalina.properties.sample to its place.
〜略〜
conf_setup.sh: file conf/setenv.local is missing; copying conf/setenv.local.sample to its place.
Starting Tomcat.... started. (pid 4640)

AJPは↓こんな感じ。

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

– Apache
httpd.confをみたところソレっぽいのは既に入ってそう。

 90 LoadModule proxy_module libexec/apache2/mod_proxy.so
 91 LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
 92 LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
 93 LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
 94 LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so
 95 LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so

/etc/apache2/extraというところに追加のconfを書くしきたりに
なっているようなので、tomcat_ajp.confとかいう名前で以下のように設定。

<Location /ajp/>
    ProxyPass ajp://localhost:8009/
</Location>

extraの下のconfをインクルードするようにしてあげて

Include /private/etc/apache2/extra/*.conf

再起動〜

# Include /private/etc/apache2/extra/tomcat_ajp.conf

↓のように http://localhost/ajp/index.jsp でTomcatまで疎通しました。

 
■ HttpClientからアクセス
ソースはhttp://shinodogg.com/?p=3527のクライアント(Apache commons HTTPClient)を参照

2011/07/19 22:44:07:482 JST [DEBUG] header - ->> "GET /ajp/index.jsp HTTP/1.1[r][n]"
2011/07/19 22:44:07:483 JST [DEBUG] HttpMethodBase - -Adding Host request header
2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "User-Agent: Jakarta Commons-HttpClient/3.0.1[r][n]"
2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "Host: localhost[r][n]"
2011/07/19 22:44:07:492 JST [DEBUG] header - ->> "[r][n]"
2011/07/19 22:44:07:495 JST [DEBUG] header - -<< "HTTP/1.1 200 OK[r][n]"
2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Date: Tue, 19 Jul 2011 13:44:07 GMT[r][n]"
2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Content-Type: text/html[r][n]"
2011/07/19 22:44:07:497 JST [DEBUG] header - -<< "Transfer-Encoding: chunked[r][n]"

 
■ JSPでTransfer-Encoding
index.jspの先頭に以下のコードを入れてみます。

  1 <%$
  2 response.addHeader("Transfer-Encoding", "chunked");$
  3 %>$

もっかい実行すると、、

2011/07/19 23:03:22:310 JST [DEBUG] header - ->> "GET /ajp/index.jsp HTTP/1.1[r][n]"
2011/07/19 23:03:22:311 JST [DEBUG] HttpMethodBase - -Adding Host request header
2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "User-Agent: Jakarta Commons-HttpClient/3.0.1[r][n]"
2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "Host: localhost[r][n]"
2011/07/19 23:03:22:320 JST [DEBUG] header - ->> "[r][n]"
2011/07/19 23:03:22:489 JST [DEBUG] header - -<< "HTTP/1.1 200 OK[r][n]"
2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Date: Tue, 19 Jul 2011 14:03:22 GMT[r][n]"
2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Transfer-Encoding: chunked[r][n]"
2011/07/19 23:03:22:492 JST [DEBUG] header - -<< "Content-Type: text/html[r][n]"
status:200
Exception in thread "main" java.io.IOException: chunked stream ended unexpectedly
	at org.apache.commons.httpclient.ChunkedInputStream.getChunkSizeFromInputStream(ChunkedInputStream.java:251)

出ました。IOException。Bad Chunk Sizeじゃないけど、そんなような内容ですね。
 
■ ネットみてくと…
外国人のみなさんたちもソレ系の議論してたり、
https://issues.apache.org/bugzilla/show_bug.cgi?id=50275
mod_proxy_ajpのソースも↓こんな感じだったり
http://apache.wirebrain.de/lxr/source/modules/proxy/mod_proxy_ajp.c?v=2.2.8

179     /* read the first bloc of data */
180     input_brigade = apr_brigade_create(p, r->connection->bucket_alloc);
181     tenc = apr_table_get(r->headers_in, "Transfer-Encoding");
182     if (tenc && (strcasecmp(tenc, "chunked") == 0)) {
183         /* The AJP protocol does not want body data yet */
184         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
185                      "proxy: request is chunked");

 
■ まぁ、なんつーか
このヘッダだけでもないですが、AJPで繋いだ場合は、
Cookieとか以外のレスポンスヘッダはApacheにお任せするのがイイんすかね、と。
 

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集
Ken Coar Rich Bowen
オライリージャパン
売り上げランキング: 64251

コメント

タイトルとURLをコピーしました