Windowsのnginxでphpを使えるようにする
Windows 10でnginx+phpの環境を整えよう!というお話です。
この記事で使われているソフトのバージョン情報
- Windows 10 Pro (Version 1803)
- nginx 1.14.0
- PHP 7.2.11
nginx.confを書き換える
c:\nginx\conf\nginx.confがnginxの設定ファイルなのですが、ご丁寧にもPHPに関する設定は既に記述されています。
#でコメントアウトされているため、下記のように行頭の # を取り除くだけで済むというありがたさ。
ただ、デフォルトだとPHPスクリプトの置き場所が /script 以下になっているため、ドキュメントルートの下に変更しておくと便利かも。
コピペしやすいようにテキストでも書いておきます。
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
変更した箇所は
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
の1行のみ。
インデックスの省略でindex.phpを使う場合
http://localhost/ でアクセスしたときに、http://localhost/index.php が開かれるようにしたい場合はnginx.confの下記の部分にindex.phpを追記します。
location / {
root html;
index index.html index.htm index.php;
}
indexとなるファイル名を列挙するだけですが、優先順位があるので、上記の場合は index.php よりも index.html が優先されます。URLのファイル名が省略されたとき、両方のファイルがあった場合は index.html のほうが表示されるというわけですね。
起動用のバッチファイルを作る
作らなくても良いのですが、nginxとphpの両方を起動するバッチファイルを作っておくと何かと便利なので一応。
■nginxとphp-cgiを起動するバッチファイル例
start c:\nginx\nginx.exe start c:\php\php-cgi.exe -b 127.0.0.1:9000
- nginxを起動
- php-cgi.exeを起動し、127.0.0.1:9000のアドレスでPHPの要求を受け付ける
このバッチファイルを実行すると、php-cgi.exe用のコマンド プロンプトが表示されっぱなしになります。
そのコマンド プロンプトを閉じればphp-cgi.exeも終了するので、気にしないならそのままでも別に構いません。
どうしてもコマンド プロンプトが表示しっぱなしなのが気になる場合は、RunHiddenConsole.exeという、コマンド プロンプトを非表示にしてくれるツールが公開されているので、それを使うと良いかも。
http://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip
■RunHiddenConsole.exeを使うバッチファイル例
start c:\nginx\nginx.exe RunHiddenConsole.exe c:\php\php-cgi.exe -b 127.0.0.1:9000
このバッチファイルなら実行後にコマンドプロンプトも消えてすっきりです。
起動したらphpinfoで動作確認
デフォルトだとc:\nginx\htmlがドキュメントルートのため、そこにphpinfo.phpというテキストファイルを作り、中にphpinfo();関数を呼び出す記述をします。
■phpinfo.phpの例
<?php
phpinfo();
?>
そしたら、適当なブラウザで http://localhost/phpinfo.php を開き、下記のような表示がされればOK。
もし何らかのエラーが出る場合はこのへんの理由を探ってみると良いかも知れません。
- nginx.confの記述が間違っている
- php-cgi.exeが起動していない
- nginx.confに書いた待ち受けアドレス127.0.0.1:9000とphp-cgi.exeに指定したアドレス/ポートに違いがある
また、エラーが出ずに真っ白な画面が出たら、とりあえずブラウザでソースの表示をしてみると良いかも。
例えば、ブラウザのソース表示で下記のようにPHPソースそのまんまが表示されていたり。
<?
phpinfo();
?>
これはぼくがよくやるミスなのですが、<?php ~ ?>で囲わずに省略形の <? ~ ?>で囲ってしまっているパターンですね(;´∀`)
PHP5以降だったかな?
php.iniのshort_open_tagの設定がデフォルトだとoffになったので、iniを書き換えていない限り <? ~ ?>の省略形は使えないのです。
これPHPのバージョンによってころころ仕様が変わってややこしいのですが、
PHP 4.0以前ではshort_open_tag=Onがデフォルト
PHP 5.0~5.3まではshort_open_tag=Offがデフォルト
PHP 5.4以降はshort_open_tag=Offだけど、<?=$text;?>的な書き方は有効、とかそんな感じだったと思います。
いちいち覚えるのもややこしいので、PHPスクリプト書くときは常に <?php ~ ?>の表記にしておけば良いかなぁと思います。
終了用のバッチファイルを作る
そのままだとnginxとphp-cgiがメモリに常駐しっぱなしになるので終了用のバッチファイルも用意します。
■nginxとphp-cgiを終了するバッチファイル例
c:\nginx\nginx.exe -s quit taskkill /f /IM php-cgi.exe
- nginxに終了シグナルを送信
- php-cgi.exeのタスクを終了させる
まとめ
- nginx.confのPHP設定の部分を有効にする
- nginxとphp-cgiを起動する
Apacheのmod_phpに慣れている人にはちょっと不思議な感じがするかも知れませんが、WebサーバーとPHPサーバーの両方をメモリに常駐させる、と考えると仕組みはすごく単純ですよね。MySQLやPostgreSQLのデータベースだって指定したアドレスとポート番号で待ち受けして、PHPからの要求を処理しているだけですしね。
ともあれ、Webサーバーのプロセス内でPHPが動作するのは共有サーバーではいろいろと問題が多かったので、FastCGIの仕組みが確立し、広く普及したのはありがたいことです。