頑張らない!でも諦めない!必死にならずにええかげん

ローカル環境のPHPをCGI実行させる方法をwindowsで試す

      2014/11/22

wordpressをローカル環境にインストールし、
レンタルサーバでよく採用されているCGIモードで
実行させるように設定を行う方法をご紹介します。
環境はwindows環境で行います。

はじめに

wordpressをローカル環境(windows)にインストールし、
PHPが実行できる環境を構築した際に、
phpがApacheモジュールで実行されCGIモードにできない場合はないでしょうか。

私もこれまで、どうしても「Internal Server Error」が解決できず諦めてきました。

結構この問題。
検索してみると、いろいろな情報が玉石混淆となっていて、
どうも明快な答えが得られず、苦労しました。

一言でいえば、私がApacheを理解していないことが原因なのですが、
おそらく同じような境遇に直面している人もおられることと思います。

環境

  • OS windows7 x64
  • Apache 2.2.17(httpd-2.2.17-win32-x86-openssl-0.9.8o.msi)
  • PHP 5.2.17(php-5.2.17-Win32-VC6-x86.msi)

ApacheとPHPの構成

ApacheとPHPのインストール構成を以下の構成としてご説明をしていきます。
ディレクトリ構成については、各自の環境に読み替えてください。

01_最終目標・ディレクトリ構成

最終目標・ディレクトリ構成

段階的な説明はいらないから、どうやったのかだけ知りたいという方は、
以下の投稿で結論のみ記述しています。
PHPを1行目の[#!php-cgi]を省いて(書かずに)CGI実行する方法

PHPファイルをモジュール実行で動作させる

まず、ApacheとPHPをインストールし、phpファイルを実行する方法として、
一番簡単な方法としてApacheモジュールとして実行する方法があります。

まずはこの環境が整っていることを確認することで、
ApacheおよびPHPが正しく動作していることを確認します。

httpd.confを開き、phpモジュールの読み込みを記述します。
記述する位置は#LoadModule ・・・の記述がずらっと書かれている辺りの、
直後辺りがいいと思います。

LoadModule php5_module "C:/PHP/php5apache2_2.dll"

2013/11/08追記訂正
その後、新しく別環境を構築し再検証をおこないましたが、
httpd.confに対する設定が不足しておりました。

以下の記述も必要になります。お詫びして訂正いたします。
php.iniファイルのディレクトリ指定
PHPIniDir "C:/PHP/"
拡張子phpおよびphpsに対するMIMEタイプ指定
<IfModule mime_module>
AddType text/html .php .phps
</IfModule>

拡張子phpに対するハンドラ指定
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>

拡張子phpsに対するハンドラ指定
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>

またC:\Apache\htdocsに対してアクセス可能なように、
Directoryディレクティブの設定がされていることを確認します。(元からあるはず)

<Directory "C:/Apache/htdocs">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>

まず、公開ディレクトリ内に対して以下のソースを記述したphpinfo_module.phpファイルを作成します。
<?php phpinfo(); ?>

phpinfo_module.phpを配置したイメージは以下のような状態です。

02_モジュール実行・ディレクトリ構成

モジュール実行・ディレクトリ構成

httpd.confの編集とphpinfo_module.phpの作成が完了したら、
Apacheを再起動し、ブラウザからアクセスします。
以下のようなページが表示されれば、まずはモジュール実行が可能な状態になっています。

03_モジュール実行・phpinfo確認

モジュール実行・phpinfo確認

ここで正しく実行ができなかった場合には以下を参考に設定を行ってください。
ローカル環境へのApache設置
ローカル環境へのPHP設置

CGIプログラムを実行

httpd.confを開き、C:\Apache\htdocsに対して、
対象ディレクトリでcgiプログラムを実行するように記述します。

<Directory "C:/Apache/htdocs">
Options ExecCGI
AddHandler cgi-script cgi
AllowOverride None
Order allow,deny
Allow from all
</Directory>

また、公開ディレクトリ内に対して以下のソースを記述したphpinfo_cgi.cgiファイルを作成します。
1行目の[#!C:/PHP/php-cgi.exe]は、このcgiプログラムは、
C:/PHP/php-cgi.exeを利用して実行せよとの命令です。

#!C:/PHP/php-cgi.exe
<?php phpinfo(); ?>

この1行目の表記ですが、PHPをインストーラでインストールした場合には、
[#!php-cgi]でも動作するはずです。
これは環境変数(PATH)に対して[C:\PHP]が設定されていて、パスが通っている場合には利用可能です。

この設定は以下のような意味を持ちます。

  • Options ExecCGI
    htdocsディレクトリは、CGI実行を許可するディレクトリとする
  • AddHandler cgi-script cgi
    .cgi拡張子のファイルがhtdocsに存在する場合には、
    cgi-scriptハンドラにて処理を行う。(cgiプログラムとして処理をする)

phpinfo_cgi.cgiを配置したイメージは以下のような状態です。

04_CGIプログラム(php)docroot・ディレクトリ構成

CGIプログラム(php)docroot・ディレクトリ構成

これをブラウザから表示すると、以下のようになります。

05_CGIプログラム(php)docroot・phpinfo確認

CGIプログラム(php)docroot・phpinfo確認

CGIプログラムは別のディレクトリで実行するように設定

通常、CGIプログラムとして実行する場合には、
公開ディレクトリ以外にプログラムを配置しておく場合が多いでしょう。

こうした場合には、以下のように設定を変更します。

httpd.confを開き、C:\Apache\cgi-binに対して、
cgiプログラムを実行するディレクトリとしてマッピングを行います。

C:\Apache\cgi-binに対してアクセス権を付与し、
スクリプト実行を行うエイリアスを指定します。

<Directory "C:/Apache/htdocs">
Options ExecCGI
AddHandler cgi-script .cgi
AllowOverride None
Order allow,deny
Allow from all
</Directory>

<Directory "C:/Apache/cgi-bin">
Options None
AllowOverride None

Order allow,deny
Allow from all
</Directory>

ScriptAlias /cgi-dir/ "C:/Apache/cgi-bin/"

ここで[Options None]としているのは、
ScriptAlias指定を行った場合には、スクリプト実行を行うディレクトリとして認識されます。
別途Directoryディレクティブにてスクリプトの実行権限を明記する必要はありません。

また、公開ディレクトリ外のC:\Apache\cgi-binに対して、
以下のソースを記述したphpinfo_cgi.cgiファイルを作成します。
※2行目は表示確認用です。

#!C:/PHP/php-cgi.exe
<p>C:\Apache\cgi-binで実行しています</p>
<?php phpinfo(); ?>

これで、URLに/cgi-dir/でアクセスがあった場合には、
C:\Apache\cgi-binディレクトリのプログラムを実行するように動作します。

phpinfo_cgi.cgiを配置したイメージは以下のような状態です。

06_CGIプログラム(php)cgi-bin・ディレクトリ構成

CGIプログラム(php)cgi-bin・ディレクトリ構成

実際にブラウザから表示を行うと以下のようになります。

07_CGIプログラム(php)cgi-bin・phpinfo確認

CGIプログラム(php)cgi-bin・phpinfo確認

CGIプログラムの1行目から[#!C:/PHP/php-cgi.exe]の削除

通常、wordpressなどを利用していて、
phpのプログラム(Webページ)の最初の1行目に対して、
[#!C:/PHP/php-cgi.exe]のような記述はされていないでしょう。

phpのプログラムをCGI実行をする為の1行ではありますが、
このphp-cgi.exeの位置はそう変更になるものではありませんし、
すべてのプログラム(phpファイル)に対して、記述するのは決して効率的ではありません。

この記述を行わずにphpをCGI実行するように、httpd.confの記述を変更します。
Action cgi-script-handler /cgi-bin/php-cgi.exeを記述します。

<Directory "C:/Apache/htdocs">
Options ExecCGI
AddHandler cgi-script .cgi
AllowOverride None
Order allow,deny
Allow from all
</Directory>


# PHP5/CGI
<Directory "C:/PHP/">
Options ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin/ "C:/PHP/"
# PHP5/CGI

<Directory "C:/Apache/cgi-bin/">
#Options ExecCGI
AddHandler cgi-script-handler cgi
Action cgi-script-handler /cgi-bin/php-cgi.exe
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-dir/ "C:/Apache/cgi-bin/"

またC:\Apache\cgi-binに配置した、phpinfo_cgi.cgiをコピーして、
phpinfo_cgi2.cgiとでも名前を変更し確認します。
また#!C:/PHP/php-cgi.exeの行を削除します。

#!C:/PHP/php-cgi.exe
<p>C:\Apache\cgi-binで実行しています</p>
<?php phpinfo(); ?>

若干、わかりにくいので捕捉しますと、

  • ScriptAlias /cgi-dir/ “C:/Apache/cgi-bin/”
    ここでまずブラウザからのURL要求で[/cgi-dir/]を含むURL要求があった場合に、
    [C:/Apache/cgi-bin/]への要求であると読み替えます。
    よって実行ファイルはC:/Apache/cgi-bin/phpinfo_cgi.cgiを指し示します。
  • AddHandler cgi-script-handler cgi
    次に要求されたファイルが拡張子[cgi]であった場合には、
    [cgi-script-handler](カスタムハンドラ)として処理を行います。
  • Action cgi-script-handler /cgi-bin/php-cgi.exe
    [cgi-script-handler]として処理を行う際には、
    /cgi-bin/php-cgi.exeに対して、処理を渡します。
  • ScriptAlias /cgi-bin/ “C:/PHP/”
    [/cgi-bin/]に対して要求があった場合には、
    [C:/PHP/]に対する要求として処理を行います。
    よって[/cgi-bin/php-cgi.exe]は[C:/PHP/php-cgi.exe]を指し示します。

これによって、cgi-binに配置されたcgiファイルは、
C:/PHP/php-cgi.exeに渡されて実行されます。

これによって、1行目のCGI実行命令に関して記述がなくとも、
C:/PHP/php-cgi.exeにてcgiプログラムが実行されるようになります。

phpinfo_cgi2.cgiを配置したイメージは以下のような状態です。

08_CGIプログラム(php)cgi-binの#!php-cgiなし・ディレクトリ構成

CGIプログラム(php)cgi-binの#!php-cgiなし・ディレクトリ構成

実際にブラウザから表示を行うと以下のようになります。

09_CGIプログラム(php)cgi-binの#!php-cgiなし・phpinfo確認

CGIプログラム(php)cgi-binの#!php-cgiなし・phpinfo確認

wordpressをインストールした公開ディレクトリに対する指定

ここまでの設定によって、cgi拡張子を持つプログラムをブラウザが要求した際に、
C:/Apache/cgi-bin/ディレクトリに存在するcgiプログラムを、
C:/PHP/php-cgi.exe(PHPのCGIアプリケーション)で実行することができました。

それでは、wordpressのようにインストールしたディレクトリ全体で、
phpプログラムをCGI実行するようにhttpd.confの変更を行います。

これまでは拡張子cgiのファイルをCGIプログラムとして実行するように、
拡張子phpとの差別化を行ってきました。
本来の目的は、拡張子phpをCGI実行することなので、
htdocsディレクトリでphpファイルをCGIプログラムとして認識させ、
C:/PHP/php-cgi.exe(PHPのCGIアプリケーション)で実行するように変更します。
※C:\Apache\cgi-binディレクトリに対する設定はもう利用しませんので削除して構いません。

<Directory "C:/Apache/htdocs">
#Options ExecCGI
AddHandler cgi-script-handler php
Action cgi-script-handler /cgi-bin/php-cgi.exe
AllowOverride None
Order allow,deny
Allow from all
</Directory>


# PHP5/CGI
<Directory "C:/PHP/">
Options ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin/ "C:/PHP/"
# PHP5/CGI


<Directory "C:/Apache/cgi-bin/">
#Options ExecCGI
AddHandler cgi-script-handler cgi
Action cgi-script-handler /cgi-bin/php-cgi.exe
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-dir/ "C:/Apache/cgi-bin/"

次に最初に利用したphpinfo_module.phpファイルをブラウザから確認します。

<?php phpinfo(); ?>

ここも若干、わかりにくいので捕捉しますと、
docrootで同様の設定を行う場合には/cgi-dir/のScriptAlias設定は不要となり、
直接、cgiファイルの実行のみを記述します。

  • AddHandler cgi-script-handler php
    次に要求されたファイルが拡張子[php]であった場合には、
    [cgi-script-handler](カスタムハンドラ)として処理を行います。
  • Action cgi-script-handler /cgi-bin/php-cgi.exe
    [cgi-script-handler]として処理を行う際には、
    /cgi-bin/php-cgi.exeに対して、処理を渡します。
  • ScriptAlias /cgi-bin/ “C:/PHP/”
    [/cgi-bin/]に対して要求があった場合には、
    [C:/PHP/]に対する要求として処理を行います。
    よって[/cgi-bin/php-cgi.exe]は[C:/PHP/php-cgi.exe]を指し示します。

これによって、cgiファイルが要求された場合には、
一律でC:/PHP/php-cgi.exeに渡されて実行されます。

phpinfo_module.phpを配置したイメージは以下のような状態です。

10_CGIプログラム(php)docrootの#!php-cgiなし・ディレクトリ構成

CGIプログラム(php)docrootの#!php-cgiなし・ディレクトリ構成

実際にブラウザから表示を行うと以下のようになります。

仮に、 htdocsのサブディレクトリwp(wordpressなどを展開するディレクトリ)に対して、
phpinfo_module.phpを配置して実行しても親ディレクトリ設定で動作します。

11_CGIプログラム(php)docrootの#!php-cgiなし・phpinfo確認

CGIプログラム(php)docrootの#!php-cgiなし・phpinfo確認

wordpressのセットアップを確認

あとは通常通りwordpressをローカル環境にセットアップすれば、
CGI実行されたwordpress環境の構築は終了です。

方法については以下の投稿を参考にしてください。
ローカル環境へのwordpress設置

12_CGIプログラム(php)サブディレクトリの#!php-cgiなし・phpinfo確

CGIプログラム(php)サブディレクトリの#!php-cgiなし・phpinfo確

以上で、ローカル環境でPHPをCGI実行する方法のご紹介です。

このCGI実行に関する話ですが、
検索しても結構、htdocs/cgi-bin/でCGI実行を行う方法の記述までが多く、
htdocs(公開ディレクトリ)全体でphpをCGI実行する方法が、あまり見かけませんでした。

正直、あまり見かけないだけに、苦労した部分はあったのですが、
最終的に答えをまとめてしまえば簡単なことなのがわかると思います。

Windows は米国 Microsoft Corporation の米国およびその他の国における登録商標です。

PHPはPHP License (原文)に基づいて、
Open Source Initiativeに承認されライセンスされています。

Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。

*本ページ内に記載されされた各社ブランド、サービス名、商標、登録商標については、
各社ブランドのロゴや商標等に関する帰属についてをご確認ください


最後までお読みいただきありがとうございました。

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。

AdMax Promotion

ブログ記事のご紹介
すべて展開 | すべて省略

Rakuten Promotion

ページ
すべて展開 | すべて省略

プロモーション(btm)

Google or AdMax Promotion (it)

 - Apache, PHP, WordPress , , ,

  関連記事

eye_wordpress
WordPressサイトへの動画埋め込みをプラグインレスで行う方法

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPress標準機能を利用してメール投稿する方法と設定

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_jetpack
JetPackのサイト統計が初期化(0pv)になったらサポートに頼ろう

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPressのfunctions.php編集には子テーマを利用

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
headタグ挿入にWP Headmaster_v0.1-wordpressプラグインを利用

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_reddit
Reddit™への共有をJetpack by WordPress.comで行う動作

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_apache_fcgi
(mod_fcgid on 2.0.x)windowsでCGIをFastCGIで実行するように設定したかった

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
19_05.Flickr Videoプレーヤー表示には、JetpackのFlickr動画ショートコード埋め込み

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPress4.0が公開されインストール(日本語化は画面選択のみ)

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_google_anl
GoogleAnalyticsのユニバーサルアナリティクスコードを取得する(追加)

Google or AdMax Promotion(it) 禁断の機能がau公式 …