人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Apache2.2とPHP5.2で質問です、Apacheのhttpd.confにおけるKeepAlive等の設定をPHPの特定領域だけ有効にする方法はありますか?PHPの記述でも構いません。OSはWindows Server 2008 R2です。

Apacheではホームページ用WebサーバとAndroidバイナリアプリにHTTPSでデータを送るためのWebサーバを兼ねています。
最近Apacheのserver-statusいわく、独自Androidバイナリアプリからの一部アクセスが増えてきてサーバ負荷が上がっていることがわかりました。
Androidバイナリアプリに送っているのは、HTMLではなくアプリの動作に関する独自記述で一回通信したら終わりです。
そこで該当通信箇所のKeepAliveはOffにして、PHPからの結果出力後、直ぐにApacheプロセスを閉じるようにすれば、AndroidバイナリアプリによるApacheリソースが低下し、サーバ負荷が下がるのではないか?と考えています。

方法についてご存じの方よろしくお願いします。

●質問者: くじぇ
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● パパトモ
●167ポイント

できないと思います。

根拠は、keepalive ディレクティブのコンテキストが「サーバ設定ファイル, バーチャルホスト」となっているからです。

http://www.apache.jp/manual/mod/core.html#keepalive

keepalive関連のコンテキストは全て「サーバ設定ファイル, バーチャルホスト」となっています。

ということは、バーチャルホストなら他のホストと異なる設定ができるということです。なので、問題のPHPをまるごと別のバーチャルホストに移設してサービスしたら良いと思います。

たとえば・・・

通常:www.exsample.com
PHP用:cgi.exsample.com

として、同じサーバで、ホストを分ければできるということになります。


くじぇさんのコメント
パパトモさん、PHP用:cgi.exsample.comを作るという案についてありがとうございます。 残念ながら、当初気が回らずAndroidバイナリアプリについて接続先のURLを変更する方法を用意していなかったため、後から対応するように変更しました。 ただ問題は、事情があってGoogle Playでアプリを配布していないため、自動でアプリをアップデートすることが出来ないのです。 「アップデートしろというならお前が直接来て入れてくれ!」と言われそうなので、何とかサーバの一工夫で解決できないかと考えているところです。 よろしくお願いいたします。

パパトモさんのコメント
KeepAliveのためにサーバ側のリソースが食われているということであれば、KeepAliveTimeoutかMaxKeepAliveRequests を調整するしか無いと思います。クライアント側なら、HTTP1.0で返せば済むのですが、サーバ側のリソースは減らせないと思います。

パパトモさんのコメント
こうしたら上手くいくかもしれません。 まずApacheにバーチャルドメインを作り、そこに問題のPHPだけを移し、そこにプロキシするようにmod_rewiteの設定をします。 >> RewriteEngine on RewriteRule ^/php/(.*)$ http://cgi.exsample.com/$1 [P,L] << これで、www.exsample.com/php/xxxxx.php にアクセスすると内部的にcgi.exsample.com/xxxxx.php にアクセスしたようになります。cgi.exsample.com側は設定でKeepAlive offにしておけば良いと思います。

くじぇさんのコメント
パパトモさんありがとうございます。参考にさせて頂きます。

2 ● sasasasaisai
●167ポイント

前の方も答えているように、
KeepAliveなどはサーバ全体の設定になるためできないようです。

MaxKeepAliveRequestsで頑張っても、
AndroidからのリクエストでWebサーバ側の接続が切れても駄目ですよね。。
windowsでなければapache_child_terminate()が使えそうですが。。

ソフト側で処理をできるだけ軽くし、
MaxClientなどでできるだけ処理する設定をするのがよいのではと思います。


くじぇさんのコメント
sasasasaisai さんありがとうございます。 PHPソースを調べていたところSQLのSELECT *を使っているところを見つけましたので、こういったところが他にないか調べて、軽くしてみたいと思います。 apache_child_terminate()も今回は使えないですが、参考にさせて頂きます。

3 ● oil999
●166ポイント ベストアンサー

HTTPヘッダに下記を送信することでKeep-Aliveは打ち消せます。

header("Connection: close");

http://www.cresc.co.jp/tech/java/Servlet_Tutorial/Lesson_36.htm


くじぇさんのコメント
oil999さんありがとうございます headerはlocationしか使ったこと無いので、興味深いです。試してみます。

4 ● pigmon88
●0ポイント

keepaliveのチューニング
http://www.atmarkit.co.jp/flinux/rensai/apache16/apache16b.html
http://tech.bayashi.net/svr/doc/apache/tune.html


くじぇさんのコメント
pigmon88さん、返答有難う御座います。 しかしながら質問文読みましたか?
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ