ある日突然クライアント様からの連絡がありました
内容は「午後から突然エラーが発生しシステムが使えない」と言った内容でした。
午後から急にとは・・・あり得ないと思いつつアクセスしてみると・・・
確かに「Internal Server Error 500」で停止してしまいます。
CGIではこのような現象は良く出ますが、今回はPHPですのである意味初めてです。
PHPコードを変更したりしていませんので当然原因はほぼサーバ側だとは察しがつくのですが、サポートに電話したところ当然
「当社のサーバは特に変更を行っておりません、お客様のスクリプトに何らかの原因があるのでは」とのいつもの模範的な回答でした。
サーバのエラーログを診ても結局ヘッダーが出力する前に終了(Error 500)で終了してしまっているのでエラー情報が全く判りません。
何せ今回は開発用のLOCALサーバでは全く問題無く動作するためにサーバ側でしか動作テストが出来ないのが非常に手間取りました
それから様々な動作テストをした結果、次のような事が判明しました・・・
- データを入力してアップ(POST)した段階でエラーが発生
- POSTするデータ数(内容の有無に関わらず)がある一定数以上になるとエラーにな
恐らくPHP動作環境の何かが影響してると考え次のようなような内容をチェック(php.ini)
- upload_max_filesize
- memory_limit
- post_max_size
しかし、何れも計算上到底影響するようなサイズにはならないために上記の設定では無いこと断定
でもこれ以上POSTに関係する設定は無いはずと思いながらいろいろ調べてみたら関係するような設定を発見
それは「max_input_vars」を発見・・・
※上記3つ(upload_max_filesize、memory_limit、post_max_size)は全体的なサイズを制限するものに対してmax_input_varsはPOSTする数に対して制限するものです。
でもmax_input_varsはphp-5.3.9からの対応では?(今回はphp-5.2なので設定は出来ないはずでは?)
でも「ものは試し」と設定してみる・・・
max_input_varsの初期値は1000ですが、一気に5000程にしおてみるとエラーは発生しなくなりました。
エラーは回避出来ましたが次のような疑問点は残りました
- php-5.3.9以降の設定機能が何故php-5.2に影響を及ぼすのか
- 本来であれば「Input variables exceeded 1000」などと言うエラーになるはずだが何故Internal Server Error 500と言ったエラーで止まってしまうのか?
- 以前は無視?されていたmax_input_varsが何故突然有効になったのいか?
ここからは推測です・・・
そもそもmax_input_varsはhashdos 対策用の設定ですので、セキュリティー対策としてphp-5.2にもこの設定用のパッチを当てたのではないかと思われます。
確かに通常のスクリプトにおいてPOSTする変数の数が1000もあれば十分と考えるのは当然かと思いますが、今回のシステムはこの数値を遙かに越える情報のやり取りを行いますのでこのような結果になったものと思われます。
尚、通常のシステム(スクリプト)においてmax_input_vars=1000を越える事は無いと思いますのでデフォルトにて大丈夫かと思います。
レンタルサーバに於いてセキュリティー対策を行って頂けるのは大変助かりますが、せめてエラー情報を出して頂けると助かります。(Internal Server Error 500で止めてしまうのはいけませんネ)
一般的には一度に1000個以上のデータをアップ(POST)するシステムはシステム(スクリプト)が悪いと言う事になるのでしょうが(私も同意見です)、どうしようもないシステムもあるのですよ