12時10分13秒 [Web関連]
さくらインターネットのカスタマーセンターから、サーバが高負荷になっているとの警告が届きました。
サーバの過負荷解消のために、当該ファイルのパーミッションを000に変更して実行を一時的に制限したとのこと。
当該ファイルというのは、プログラムではなく単なるSHTMLファイルです。ただのHTMLですが、SSIを使って他のファイルを合成しています。
サーバのコントロールパネルからリソース情報のグラフを見てみると、確かにCPU使用時間がどかんと増えていました。
また、サーバのエラーログを確認すると、以下のようなエラーが1秒間に686回も発生していました。
そりゃ高負荷になりますよね……。
Request exceeded the limit of 10 subrequest nesting levels due to probable confguration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
unable to get information about "products.shtml" in parsed file /home/***/www/products.shtml(24)Too many open files: file permissions deny server access: /home/***/www/products.shtml
unable to include "./common/ssi/submenubar-products.html" in parsed file /home/***/www/products.shtml
上記で問題になっている products.shtml は最終更新が2015年のファイルだったので、もう2年以上そのままです。その間、少なくとも高負荷で警告されるほどのエラーはありませんでした。
実は、この手のエラーが発生して負荷が高まったのは今回が初めてではありません。
ただ、ファイルの読み込みが無限ループになっちゃっているらしいということは分かるものの、なんで「ただ外部ファイルを合成しているだけのSSIで発生するのか?」が分からなかったので根本的な解決ができていなかったのですが。
今回のカスタマーセンターからの警告文には、対処方法も書いてあったので、ようやく分かりました。
どうやらSSIでinclude virtualを使う際には、合成ファイルを絶対パスで指定しなければならないようです。
私は、一部のページではinclude virtualの値を相対パスで記述していました。これが原因だったようです。
早速、include virtualの記述を以下の通り絶対パスに書き換えました。
危 <!--#include virtual="./path/to/include.txt" -->
↓
正 <!--#include virtual="/path/to/include.txt" -->
この場合は単に「.」記号1つを消しただけですが。
相対パスではなく「/」で始まる絶対パスになっています。
ただ、なぜ相対パスでファイルを合成すると無限ループのエラーが発生するのかが分かんなかったのですが。
ググってみると理由を解明した方がいらっしゃいました。
→「さくらインターネットに怒られた件」(@ClockRoom)
どうやら、SSIのinclude virtualで相対パスを使って合成しているウェブページに、PATH_INFO付きでアクセスされたときに、なぜか自分自身がインクルードされることによって無限ループが発生するようだとのこと。
なんでそうなるのかは分かりませんが……。
とりあえず、SSIでファイルを合成するときには、絶対パスで書かないと無限ループが起きてしまう可能性がある、ということは分かりました。^^;
たいてい合成したいファイルは「離れた場所にある合成ファイル用のディレクトリ」にまとめてあるので、絶対パスを使っています。
ただ、最上階層に置いてあるファイルでは、何故か(自身のディレクトリより下位にあるだけなので)相対パスを使っていたのでした。
うーむ。まさかこんなことが原因だったとは。
しかし原因が分かってスッキリしました。
今後も気をつけよう。(^_^;)
この日記へのコメントはお気軽に! コメント数:0件
(前の記事) « ローマ字で使う横棒(長音記号マクロン)を加えた英字を表示する方法
前後のエントリ
< 旧 / 新 >
コメント数: 0件