Apache2.4のProxyワーカ文字数制限
先月コンパイルしたApache2.4。どうも設定ファイル周りわりと変更があったようで、2.2でつかっていた設定ファイルがそのまま使えないみたい。
別ディレクトリへインストールして、別ポートで動作させてみて実験。
2.2の設定ファイルにいろいろと手を加えないないといけないようです。
LoadModuleをたくさん
Apache2.4を新規にインストールすると、サンプルのhttpd.confがconf以下に入ってきます。このサンプルを参照してLoadModuleの行をたくさん追加。
もちろん使っているモジュールについてはコメントアウトを外します。
Proxyのワーカに文字数制限
上記のLoadModuleとここで書かれているアクセス制限のディテクティブを解決して残ったのがこの問題。いままで使っていた設定ファイルをテストすると、こんなエラーがでます。
# /usr/local/apache24/bin/apachectl -t AH00548: NameVirtualHost has no effect and will be removed in the next release /usr/local/apache24/conf/httpd.conf:101 AH00526: Syntax error on line 615 of /usr/local/apache24/conf/httpd.conf: ProxyPass worker name (http://localhost:3128/VirtualHostBase/http/www.hogefuga.com:80/fugafugafile/VirtualHostRoot/++resource++Products.HOGEHOGE.public.stylesheets) too long
Proxyのワーカが長すぎると。上記の例はちょっと改変していますが実際にエラーがでた設定では177文字ありました。
エラーを出しているところは modules/proxy/proxy_util.c の1584行目あたり。
memset(wshared, 0, sizeof(proxy_worker_shared)); ptr = apr_uri_unparse(p, &uri, APR_URI_UNP_REVEALPASSWORD); if (PROXY_STRNCPY(wshared->name, ptr) != APR_SUCCESS) { return apr_psprintf(p, "worker name (%s) too long", ptr); }
多分ptrが設定ファイル中のワーカ。上記で長すぎると指摘された文字列。これをwshared->nameへコピーしようとしてエラーになっている。
コピーするときに使っているPROXY_STRNCPY()はap_proxy_strncpy()の別名で定義はこんなかんじ。
#define PROXY_STRNCPY(dst,src) ap_proxy_strncpy((dst),(src),(sizeof(dst))
つまり、sizeof(dst)よりもsizeof(src)が大きくなったってことですね。
では上記の wshared->nameのサイズはいくつなんだと。
wshared変数はこの関数中で
proxy_worker_shared *wshared ;
と定義されていて、このproxy_worker_sharedはmod_proxy.hの333行目に定義がありました。
typedef struct { char name[PROXY_WORKER_MAX_NAME_SIZE]; 以下略
このPROXY_WORKER_MAX_NAME_SIZEは、これもmod_proxy.hの305行目あたりに。
#define PROXY_WORKER_MAX_NAME_SIZE 96
前述のとおり、設定ファイルで指定したワーカは177文字なので、余裕で越していますね。倍の192にして再コンパイル。とりあえずエラーはでなくなりました。
なんでこんな制限を設けたのか理解に苦しむ。