サーバー関連 Apacheアップデート、CGIからFastCGI「.htaccess」とかの変更例
☆サーバー関連 Apacheアップデート、CGIからFastCGI「.htaccess」とかの変更例
2018年のゴールデンウィーク前。
当サイトのページの大部分が、インターネットから表示されない状態になりました。
1日程、ページが見られない状況が続き、
結果的には、原因は、レンタルサーバーの「Apache」のバージョンアップからの「.htaccess」の記述変更と、
「PHP」のバージョンアップからの、関数廃止からでした。
バージョンアップをするらしい事は、メールの通知で知っていたのですが、
「メンテナンスに伴うお客様側の作業はございません」とあったので、油断してたら、気が付かなくて、
メンテナンス後、表示されていなかったようで、
結局は、調査と対応で、表示再開までに1日程掛かってしまったことになります。
私は、サーバー系は詳しくなく、レンタルサーバーを借りている面もあるので、
そこから調査が大変でした。
この際、対応を忘れないようにまとめておきます。
(私が借りているレンタルサーバーは、「エックスサーバー」さんですので、
他のサーバーさんで同じ対応ではダメかも知れません。)
ホームページなどの内部ファイルを保存しているのをWebサーバーといいますが、
それに、「Apache」というWebサーバーソフトウェアを使用している場合に、
「.htaccess」という下層のディレクトリ内に対して適用される設定や制御をするファイルがある。
apache2.2。
サーバーのバージョンアップまで正常に動いていた.htaccessの一部。
わかりやすいようにコメント入れます。
・AddType x-httpd-php .html
サーバは、ファイル名を見ただけで、それが何のファイルなのかを判断することが出来ないそうで、
多くは、サーバのデフォルト設定として登録されているようですが、
特殊な事をしたい場合、ある「拡張子」を持つものを、
「MIMEタイプ」という文書の性質や形式を示す指定で、どういう動作すると指定してやらないといけないから書いている。
その場合、「AddType」という文法で、
AddType MIMEタイプ .拡張子
という風に指定する模様。
AddType x-httpd-php .html
と書くと、
「html」の拡張子を、「x-httpd-php」というMIMEタイプで表す動作で動かすことを指定している模様。
要は、.htmlの中にPHPの構文があってもPHPで動くようにしている。
ただ、この「x-httpd-php」というMIMEタイプを調べてもよくわからない。
(追記)Apacheのデフォルトなのか不明で、
「x」と付くので、エックスサーバーさん特有のものかも知れないと思ったので質問すると、
一般的に使用されているMIMEタイプとの事。
・FilesMatch "^abc$" 辺り
「FilesMatch」は、特定のファイルに制限する。
ここでは、正規表現込みで、要は、abcというファイルは、何々という指定にしている。
・ForceType x-httpd-php
これは、ちょっと理解が乏しいが、
ForceType で、
特定のディレクトリ下のすべてのコンテンツに対して使用するMIMEタイプを指定するそう。
ここにMIMEタイプの「x-httpd-php」を指定して、
PHPとして動かす事にしている。
また、ForceTypeで指定されたファイルには、拡張子をつけなくても認識される模様。
要は、abcという拡張子なしのファイルは、PHPで動きます。
と、書いていると思っている。
さて、これで、サーバーのapache2.2の時は、正常に動いていた。
サーバーのapacheのバージョンアップがあって、
apache2.2からapache2.4にバージョンが上がった。
色々書き替えて調べていくうちに、
AddType x-httpd-php
と
ForceType
が動作していない事に気がついた。
ゆえに、主に、abcという拡張子なしのファイルがPHPで動作せず、ページのほとんどが見られなくなっていた模様だった。
更に、PHPの動作は、これまで「CGI」というWebサーバ上でユーザプログラムを動作させるためのインタフェース仕様の1つで動いていたようで、
これが「FastCGI」といものに代わっている模様。
「FastCGI」というのは、プロセスの起動と終了を省略したりして、何やら早い模様。
そもそも「CGI」と聞くと、CGI言語(?)だったか? 忘れましたが、昔、アクセスカウンタを作ったりした言語の事だと思っていたのですが、
どうも違うようで、ここでいう「CGI」サーバー上で動くアプリケーションの事らしい。
よくわからないが、PHPの構文のPHPプログラムをCGIサーバーアプリケーションで動かしていたのが、
FastCGIサーバーアプリケーションで動かす事になるような感じという理解で多分良いのだろう。
.htaccessの内容は、PHPでもなんでもないかと思うが、
それも変更されていて、今までのでは動かない。
とにかく以前の.htaccessの、AddType x-httpd-phpとForceType
と同等の機能を持つ、新しい命令文に変えていかないとページが表示されないので、変えていかないといけない。
そこで、調べたり、試行錯誤して、
見つけたのが、
AddHandler fcgid-scriptや
SetHandler fcgid-scriptや
FCGIWrapper
という指定。
apache2.4。FastCGI。
わかりやすいようにコメント入れます。
・AddHandler fcgid-script .php .phps .html
Apacheモジュールmod_mimeの設定の1つ。
このモジュールは拡張子を使って色々な「メタ情報」をファイルに関連付けるために使用する模様。
前の「AddType x-httpd-php .html」の代わり。
「.php .phps」は、別にいらないと思われるが、一応、追加しておいた。
「ハンドラ」とは、ファイルが呼ばれたときに実行される動作のApacheにおける内部表現らしく、
ファイルはファイルタイプに基づいた暗黙のハンドラがあるとのこと。
よくわからないが、そのハンドラに「追加」するととって良いだろうと思う。
(追記)「fcgid-script」というのは、「x-httpd-php」と同じように、MIMEタイプかと思ったのですが、
サーバーさんに質問すると、FastCGIでプログラムを実行する場合に必要な記述との事。
これもエックスサーバーさん独自のものではなく一般的に使用されるものとの事。
「.html」内にPHP構文があっても動作することで確認した。
AddTypeと同じような動作をしたことになる。
・Files "abc"辺り
は、の代わり、
ただ、今回は、正規表現をなくして、「このファイル」にしているが、ここは、バージョンアップによる変更ではないはず。
ファイルを指定して、次に続ける。
・SetHandler fcgid-script
前の「AddHandler fcgid-script .php .phps .html」で、
「fcgid-script」というのがPHPで動作させるというMIMEタイプであるだろうことはわかった。
「SetHandler」というのは、マッチするファイルがハンドラで処理されるようにするそうで、
まず、これをセット。
・FCGIWrapper
ルートディレクトリの.htaccessにいつの間にか勝手に追加されていた
「FCGIWrapper "/home/サーバーID/初期ドメイン/xserver_php/php-cgi」。
「サーバーID」「初期ドメイン」は、契約者個々に違います。
「FCGIWrapper」がいまだ何かわからないが、
名前からFastCGIのラッパーであるよう。
続けると、要は、
abcという拡張子なしのファイルを、
SetHandlerでPHPで動作するようにして、
それをFastCGIで動かすというような命令と思われる。
(追記)質問すると、最新のサーバー環境では「.htaccess」への記述は不要と聞いたんですが、
コメントアウトするとやはり動かず、
Files "abc"
で指定して、拡張子なしで動かす場合には、必要な模様。
試行錯誤の末、拡張子なしのファイル内のPHPの動作を確認。
あとは、追加で、PHPのバージョンアップによる廃止関数の数個を、同じような関数に修正。
やっと、サーバーバージョンアップ前と同じ動作になり、ページが表示されました。
あとは、心配だったので、エックスサーバーさんに問題ないか確認。
問題ないとの事で、一応の解決。
しかし、これらの説明が、サーバーページのヘルプのどこにも見当たらないように思えるんですが、
そんなもののようで、「.htaccess」への記述はサポート対象外との事。
そう回答ありましたが、色々教えては頂けました。
上記方法以外に、拡張子なしのPHPと同じような事が出来ることを教えて頂きました。
基本コードだけ教えて貰ったので、後は調べました。
ファイル名は、「abc」から「abc.php」に変更する必要がありますが、
URL自体の変更は不要なので、実質、同じような動きになります。
mod_rewriteという機能で、ファイルの場所(URLの位置?)をリダイレクト可能のようです。
流れとしては、
①mod_rewriteの機能を有効化
Apacheで利用されているモジュールで、URLの書き換えやリダイレクト処理が出来る。
②ファイルの存在確認
ファイルがないというのを確認させる。
③ディレクトリの存在確認
ディレクトリがないというのを確認させる。
④ ②と③の場合に、URLの文字列を内部的に(?)書き換えて、別のファイルを動かす
だけど、URLはそのまま。
.htaccessは、こういう流れのコードになります。以下。
①RewriteEngine On
mod_rewriteの機能を有効化
②RewriteCond %{REQUEST_FILENAME} !-f
ファイルがないというのを確認させる。
!は、if分で言う否定ならば条件。
③RewriteCond %{REQUEST_FILENAME} !-d
ディレクトリがないというのを確認させる。
「!」は、if分で言う否定ならば条件。
④RewriteRule ^そこまでのパス/abc そこまでのパス/abc.php [L,QSA]
上の①②(if分みたいなの)を満たしたらここの処理。
「^」は、正規表現で文字の先頭の意味。
「L」は、これ以降は、(この括りの処理で)他の命令をしないという意味。
同じようなRewriteRuleを次の行に書くには多分不要と思われる。
「QSA」は、ちょっとよくわかりませんが、文字列を内部的に(?)書き換えと思われます。
「そこまでのパス」は、おそらく.htaccess以下の初めの「/」を含まないパス名。
これで同じような動作になりました。
今回は、ページがほとんど表示されないという、最悪の部類のトラブルが発生して、
対処に苦労はしたんですが、
結果的に、1日程度で直せたし、レンタルサーバーのエックスサーバーさんから色々教えて貰えて、
改良も出来たし、勉強になって、良かったと思います。
記述:2018年05月頃
追記:2018年06月頃
リンク削除:2023年09月頃
2018年のゴールデンウィーク前。
当サイトのページの大部分が、インターネットから表示されない状態になりました。
1日程、ページが見られない状況が続き、
結果的には、原因は、レンタルサーバーの「Apache」のバージョンアップからの「.htaccess」の記述変更と、
「PHP」のバージョンアップからの、関数廃止からでした。
バージョンアップをするらしい事は、メールの通知で知っていたのですが、
「メンテナンスに伴うお客様側の作業はございません」とあったので、油断してたら、気が付かなくて、
メンテナンス後、表示されていなかったようで、
結局は、調査と対応で、表示再開までに1日程掛かってしまったことになります。
私は、サーバー系は詳しくなく、レンタルサーバーを借りている面もあるので、
そこから調査が大変でした。
この際、対応を忘れないようにまとめておきます。
(私が借りているレンタルサーバーは、「エックスサーバー」さんですので、
他のサーバーさんで同じ対応ではダメかも知れません。)
・あらためて基礎
ホームページなどの内部ファイルを保存しているのをWebサーバーといいますが、
それに、「Apache」というWebサーバーソフトウェアを使用している場合に、
「.htaccess」という下層のディレクトリ内に対して適用される設定や制御をするファイルがある。
・旧.htaccessの一部
apache2.2。
サーバーのバージョンアップまで正常に動いていた.htaccessの一部。
AddType x-httpd-php .html
<FilesMatch "^abc$">
  ForceType x-httpd-php
</FilesMatch>
わかりやすいようにコメント入れます。
・AddType x-httpd-php .html
サーバは、ファイル名を見ただけで、それが何のファイルなのかを判断することが出来ないそうで、
多くは、サーバのデフォルト設定として登録されているようですが、
特殊な事をしたい場合、ある「拡張子」を持つものを、
「MIMEタイプ」という文書の性質や形式を示す指定で、どういう動作すると指定してやらないといけないから書いている。
その場合、「AddType」という文法で、
AddType MIMEタイプ .拡張子
という風に指定する模様。
AddType x-httpd-php .html
と書くと、
「html」の拡張子を、「x-httpd-php」というMIMEタイプで表す動作で動かすことを指定している模様。
要は、.htmlの中にPHPの構文があってもPHPで動くようにしている。
ただ、この「x-httpd-php」というMIMEタイプを調べてもよくわからない。
(追記)Apacheのデフォルトなのか不明で、
「x」と付くので、エックスサーバーさん特有のものかも知れないと思ったので質問すると、
一般的に使用されているMIMEタイプとの事。
・FilesMatch "^abc$" 辺り
「FilesMatch」は、特定のファイルに制限する。
ここでは、正規表現込みで、要は、abcというファイルは、何々という指定にしている。
・ForceType x-httpd-php
これは、ちょっと理解が乏しいが、
ForceType で、
特定のディレクトリ下のすべてのコンテンツに対して使用するMIMEタイプを指定するそう。
ここにMIMEタイプの「x-httpd-php」を指定して、
PHPとして動かす事にしている。
また、ForceTypeで指定されたファイルには、拡張子をつけなくても認識される模様。
要は、abcという拡張子なしのファイルは、PHPで動きます。
と、書いていると思っている。
さて、これで、サーバーのapache2.2の時は、正常に動いていた。
・ここでバージョンアップし、問題発生
サーバーのapacheのバージョンアップがあって、
apache2.2からapache2.4にバージョンが上がった。
色々書き替えて調べていくうちに、
AddType x-httpd-php
と
ForceType
が動作していない事に気がついた。
ゆえに、主に、abcという拡張子なしのファイルがPHPで動作せず、ページのほとんどが見られなくなっていた模様だった。
更に、PHPの動作は、これまで「CGI」というWebサーバ上でユーザプログラムを動作させるためのインタフェース仕様の1つで動いていたようで、
これが「FastCGI」といものに代わっている模様。
「FastCGI」というのは、プロセスの起動と終了を省略したりして、何やら早い模様。
そもそも「CGI」と聞くと、CGI言語(?)だったか? 忘れましたが、昔、アクセスカウンタを作ったりした言語の事だと思っていたのですが、
どうも違うようで、ここでいう「CGI」サーバー上で動くアプリケーションの事らしい。
よくわからないが、PHPの構文のPHPプログラムをCGIサーバーアプリケーションで動かしていたのが、
FastCGIサーバーアプリケーションで動かす事になるような感じという理解で多分良いのだろう。
.htaccessの内容は、PHPでもなんでもないかと思うが、
それも変更されていて、今までのでは動かない。
とにかく以前の.htaccessの、AddType x-httpd-phpとForceType
と同等の機能を持つ、新しい命令文に変えていかないとページが表示されないので、変えていかないといけない。
そこで、調べたり、試行錯誤して、
見つけたのが、
AddHandler fcgid-scriptや
SetHandler fcgid-scriptや
FCGIWrapper
という指定。
・新.htaccessの一部
apache2.4。FastCGI。
AddHandler fcgid-script .php .phps .html
<Files "abc">
  SetHandler fcgid-script
  FCGIWrapper "/home/サーバーID/初期ドメイン/xserver_php/php-cgi"
</Files> 
わかりやすいようにコメント入れます。
・AddHandler fcgid-script .php .phps .html
Apacheモジュールmod_mimeの設定の1つ。
このモジュールは拡張子を使って色々な「メタ情報」をファイルに関連付けるために使用する模様。
前の「AddType x-httpd-php .html」の代わり。
「.php .phps」は、別にいらないと思われるが、一応、追加しておいた。
「ハンドラ」とは、ファイルが呼ばれたときに実行される動作のApacheにおける内部表現らしく、
ファイルはファイルタイプに基づいた暗黙のハンドラがあるとのこと。
よくわからないが、そのハンドラに「追加」するととって良いだろうと思う。
(追記)「fcgid-script」というのは、「x-httpd-php」と同じように、MIMEタイプかと思ったのですが、
サーバーさんに質問すると、FastCGIでプログラムを実行する場合に必要な記述との事。
これもエックスサーバーさん独自のものではなく一般的に使用されるものとの事。
「.html」内にPHP構文があっても動作することで確認した。
AddTypeと同じような動作をしたことになる。
・Files "abc"辺り
ただ、今回は、正規表現をなくして、「このファイル」にしているが、ここは、バージョンアップによる変更ではないはず。
ファイルを指定して、次に続ける。
・SetHandler fcgid-script
前の「AddHandler fcgid-script .php .phps .html」で、
「fcgid-script」というのがPHPで動作させるというMIMEタイプであるだろうことはわかった。
「SetHandler」というのは、マッチするファイルがハンドラで処理されるようにするそうで、
まず、これをセット。
・FCGIWrapper
ルートディレクトリの.htaccessにいつの間にか勝手に追加されていた
「FCGIWrapper "/home/サーバーID/初期ドメイン/xserver_php/php-cgi」。
「サーバーID」「初期ドメイン」は、契約者個々に違います。
「FCGIWrapper」がいまだ何かわからないが、
名前からFastCGIのラッパーであるよう。
続けると、要は、
abcという拡張子なしのファイルを、
SetHandlerでPHPで動作するようにして、
それをFastCGIで動かすというような命令と思われる。
(追記)質問すると、最新のサーバー環境では「.htaccess」への記述は不要と聞いたんですが、
コメントアウトするとやはり動かず、
Files "abc"
で指定して、拡張子なしで動かす場合には、必要な模様。
試行錯誤の末、拡張子なしのファイル内のPHPの動作を確認。
あとは、追加で、PHPのバージョンアップによる廃止関数の数個を、同じような関数に修正。
やっと、サーバーバージョンアップ前と同じ動作になり、ページが表示されました。
・感想など
あとは、心配だったので、エックスサーバーさんに問題ないか確認。
問題ないとの事で、一応の解決。
しかし、これらの説明が、サーバーページのヘルプのどこにも見当たらないように思えるんですが、
そんなもののようで、「.htaccess」への記述はサポート対象外との事。
そう回答ありましたが、色々教えては頂けました。
・追記:1か月程後
上記方法以外に、拡張子なしのPHPと同じような事が出来ることを教えて頂きました。
基本コードだけ教えて貰ったので、後は調べました。
ファイル名は、「abc」から「abc.php」に変更する必要がありますが、
URL自体の変更は不要なので、実質、同じような動きになります。
mod_rewriteという機能で、ファイルの場所(URLの位置?)をリダイレクト可能のようです。
流れとしては、
①mod_rewriteの機能を有効化
Apacheで利用されているモジュールで、URLの書き換えやリダイレクト処理が出来る。
②ファイルの存在確認
ファイルがないというのを確認させる。
③ディレクトリの存在確認
ディレクトリがないというのを確認させる。
④ ②と③の場合に、URLの文字列を内部的に(?)書き換えて、別のファイルを動かす
だけど、URLはそのまま。
.htaccessは、こういう流れのコードになります。以下。
①RewriteEngine On
mod_rewriteの機能を有効化
②RewriteCond %{REQUEST_FILENAME} !-f
ファイルがないというのを確認させる。
!は、if分で言う否定ならば条件。
③RewriteCond %{REQUEST_FILENAME} !-d
ディレクトリがないというのを確認させる。
「!」は、if分で言う否定ならば条件。
④RewriteRule ^そこまでのパス/abc そこまでのパス/abc.php [L,QSA]
上の①②(if分みたいなの)を満たしたらここの処理。
「^」は、正規表現で文字の先頭の意味。
「L」は、これ以降は、(この括りの処理で)他の命令をしないという意味。
同じようなRewriteRuleを次の行に書くには多分不要と思われる。
「QSA」は、ちょっとよくわかりませんが、文字列を内部的に(?)書き換えと思われます。
「そこまでのパス」は、おそらく.htaccess以下の初めの「/」を含まないパス名。
これで同じような動作になりました。
・感想など2
今回は、ページがほとんど表示されないという、最悪の部類のトラブルが発生して、
対処に苦労はしたんですが、
結果的に、1日程度で直せたし、レンタルサーバーのエックスサーバーさんから色々教えて貰えて、
改良も出来たし、勉強になって、良かったと思います。
記述:2018年05月頃
追記:2018年06月頃
リンク削除:2023年09月頃
Twitter Facebook Google+ はてな Pocket LINE
管理人による書き込みの確認後、荒らし書き込みでない場合に表示させていただきます。
悪意ある書き込みや挑発的な書き込みと思われる内容は、表示させません。
その為、ちょっと書き込みから表示までに時間がかかってしまいます。ご了承下さい。
暑さの一番の原因はなんだと思いますか?
あなたの支持する政党はどの党ですか?
今のページの関連ページのリストへ
ザ・覚書のトップページに戻る
全ページのリストへ