Windowsのnginxでphpを使えるようにする

Windows 10でnginx+phpの環境を整えよう!というお話です。

この記事で使われているソフトのバージョン情報

  • Windows 10 Pro (Version 1803)
  • nginx 1.14.0
  • PHP 7.2.11
phpはc:\phpに、nginxはc:\nginxにインストール済みであることを前提として話しを進めます。

nginx.confを書き換える

c:\nginx\conf\nginx.confがnginxの設定ファイルなのですが、ご丁寧にもPHPに関する設定は既に記述されています。

#でコメントアウトされているため、下記のように行頭の # を取り除くだけで済むというありがたさ。

nginxでphpを使えるようにするSTEP1

ただ、デフォルトだとPHPスクリプトの置き場所が /script 以下になっているため、ドキュメントルートの下に変更しておくと便利かも。

nginxでphpを使えるようにするSTEP2

コピペしやすいようにテキストでも書いておきます。

        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
  1. nginxを起動
  2. 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でphpを使えるようにするSTEP3

もし何らかのエラーが出る場合はこのへんの理由を探ってみると良いかも知れません。

  • 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
  1. nginxに終了シグナルを送信
  2. php-cgi.exeのタスクを終了させる

まとめ

  1. nginx.confのPHP設定の部分を有効にする
  2. nginxとphp-cgiを起動する

Apacheのmod_phpに慣れている人にはちょっと不思議な感じがするかも知れませんが、WebサーバーとPHPサーバーの両方をメモリに常駐させる、と考えると仕組みはすごく単純ですよね。MySQLやPostgreSQLのデータベースだって指定したアドレスとポート番号で待ち受けして、PHPからの要求を処理しているだけですしね。

ともあれ、Webサーバーのプロセス内でPHPが動作するのは共有サーバーではいろいろと問題が多かったので、FastCGIの仕組みが確立し、広く普及したのはありがたいことです。

adsbygoogle

フォロー