"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Windowsに「nginx」と「PHP8」をダウンロードし、PHPをCGI経由で動かす

目次

Windowsに「nginx」と「PHP8」をダウンロードし、PHPCGI経由で動かす

PHP8の動作検証のため、Windows上に取り急ぎPHPプログラムの検証環境をつくることにしたので、その時の手順を記録しておきます。

なお、VSCode等でPHPを開発・デバッグ環境はすでにできている前提で、純粋にnginxとPHPをダウンロードして、Windowsのサービス化するだけの手順です。

とりあえず「c:\web2」フォルダに環境を作るていでいきます。

 

nginxのダウンロードとインストール

nginxのダウンロードは以下から行います。

nginx.org

最新版の「nginx/Windows-1.21.6 」をダウンロードします。

nginx-1.21.6.zipファイルなので、解凍して、「nginx」に名前を変更して、「c:\web2」フォルダに移動します。

なお、解凍すると同じ名前のフォルダが2層できますが、上記に移動するのは一つ下のサブフォルダのほうです。

 

PHP8のダウンロードとインストール

PHPのダウンロードは以下から行います。

windows.php.net

これも最新版を選んでダウンロードします。

ZIPファイルを選んで、時点の最新「php-8.1.5-Win32-vs16-x64.zip」をダウンロードし、解凍後、フォルダ名を「php」に変更し、「c:\web2」フォルダに移動します。

こんな感じになっているはずです。

解凍してできた同じ名前のフォルダが2層のうち一つ下のサブフォルダのほうを移動するのは同じです。

 

nginxの設定

nginxを動かすために、最低限の設定をします。

 

nginxフォルダの下にconfフォルダがあり、そこの「nginx.conf」を編集します。

まず36行目あたりの

 listen       8090;
 server_name  localhost;

でポートを指定します。

デフォルトは「80」です。

それでもいいのですが、開発環境なのでバッティングしないようにいったん今回は「8090」に変更しました。

http://localhost:8090/

とアクセスするイメージです。

 

次にドキュメントルートを書きます。

これは、HTMLの置き場所で「http://localhost:8090/」でソースを探すフォルダです。

デフォルトは「html」・・つまり「nginx\html」フォルダですが、今回はソースは共通で別の環境と切り替えながら動かすので、ソースを置いているフォルダに変更jしるていで書き直した例です。

location / {
     root   C:/src/htdocs;
     index  index.html index.htm;

 }

 

次にPHPを使えるように、以下の「location ~ \.php$」の部分のコメントアウト「#」を消して有効にして、rootだけ、上記のドキュメントルートと同じフォルダ名に書き換えて、PHPソースを探しにいく場所をnginxに教えます。

location ~ \.php$ {
     root           C:/src/htdocs;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  C:/src/htdocs$fastcgi_script_name;
   include        fastcgi_params;
 }

とりあえず、最低限ならこれだけです。

注意が必要なのは、パス区切りの書き方です。

「C:/src/htdocs」のように「/」区切りでも、「C:\src\htdocs」のように「\(¥)」区切りのどちらでも使えます。

でも、「C:\src\nhtdocs」みたいに、[\」の後ろに「n」が来たりすると、改行コードと認識されてエラーになったりする(サービスの起動に失敗します)ので、「/」にしておくのが安全ですね。

 

PHPの設定

ダウンロードしただけだと、php.iniはありません。

動いている別の環境があるなら、そこからphp.iniをコピーしてきてもいいですし、そうでなくて一からの場合は、サンプルについている「php.ini-development」を、「php.ini」にリネームしておきます。

php.iniの中身うんぬんは、今回の主題でないので、これだけです。

とりあえず、php.iniがあってPHPが読み込める環境に最低限しときます。

あと、WindowsPHPはVCのランタイムが必要です。

docs.microsoft.com

たいていの環境では既にはいっているとは思いますが、もし、PHPをサービス化して起動するときPHP.iniがおかしくないのに強制終了してしまうような場合は、疑ってみる価値はあります。

 

nginxからphpを動かす仕組みの補足

PHPをWEBサーバーから動かす方法には2種類あります。

モジュール版と、CGI版です。

モジュール版はApacheのRootユーザーがPHPを探しにいって動かすイメージです。

nginxではできません。

CGI版はRootではない任意のユーザがPHPを動かすイメージです。

php-cgi.exeというプログラムが、PHPに同梱されていて、これを経由してPHPの本体を動かすような動きになります。

nginxでは必ずCGI版になるので、続く、サービス化では「nginx」と「php-cgi」をサービス化で常駐させて、連携させることでnginx経由でPHPを動かすことになります。

 

サービス化のためのプログラムのダウンロードとコピー

nginxとPHPを、Windowsではそのままサービス化して動かすことはできません。

winswというフリーで提供されているExeを使います。

下記から、最新版をダウンロードします。

repo.jenkins-ci.org

今回は、2.9.0が最新版だったので「winsw-2.9.0-bin.exe」をダウンロードしました。

ほかにもいくつかファイルがありますが、これだけでいいです。

これを、先にコピーした「nginx」と「php」の各フォルダの直下・・「nginx.exeのあるフォルダ」と「php.exeのあるフォルダ」にコピーして、適当にリネームします。

今回はとりあえず、以下のようにしました。

  • winsw-2.9.0-nginx-bin.exe
  • winsw-2.9.0-php-bin.exe

 

nginxをサービス化する

EXEと同じ名前でXMLファイルを作ります。

<service>
    <id>nginx</id>
    <name>nginx</name>
    <description>「nginx」で起動する。「nginx -s stop」で停止する。</description>
    <logpath>C:\web2\nginx\logs</logpath>
    <logmode>roll</logmode>
    <depend></depend>
    <executable>C:\web2\nginx\nginx.exe</executable>
    <startarguments></startarguments>
    <stoparguments>-s stop</stoparguments>
</service>

 

winsw-2.9.0-nginx-bin.exeにしたので「winsw-2.9.0-nginx-bin.xml」で保存します。

基本的にはログフォルダとnginx.exeのパスを環境にあわせて書き換えるだけです。

準備ができたら、コマンドプロンプトを管理者で開いて以下を実行します。

winsw-2.9.0-nginx-bin.exe install

成功すると「INFO  - Installing the service with id 'nginx'」とメッセージがでます。

 

php-cgiをサービス化する

EXEと同じ名前でXMLファイルを作ります。

winsw-2.9.0-php-bin.exeにしたので「winsw-2.9.0-php-bin.xml」で保存します。

<service>
    <id>php-cgi</id>
    <name>php-cgi</name>
    <description>「php-cgi -b 127.0.0.1:9000 -q」を実行する</description>
    <logpath>C:\web2\php\logs</logpath>
    <logmode>roll</logmode>
    <depend></depend>
    <executable>C:\web2\php\php-cgi.exe</executable>
    <startarguments>-b 127.0.0.1:9000 -q</startarguments>
</service>

 

PHPのデフォルトに「logs」フォルダはないので、「logs」フォルダを作っておく前提で上記のxmlは書いています。

準備ができたら、コマンドプロンプトを管理者で開いて以下を実行します。

winsw-2.9.0-php-bin.exe install

成功すると「INFO  - Installing the service with id 'php-cgi'」とメッセージがでます。

 

動作確認

すでにソースがある場合はそれを使います。

ない場合は、ドキュメントルートに指定したフォルダに、以下の内容をコピーして「index.php」の名前で保存します。

<?php
    print("Hello World!!");
 ?>

そのうえで、サービスを起動します。

「コントロール パネル\システムとセキュリティ\管理ツール\サービス」で、さきほど登録した「nginx」と「php-cgi」を開始して以下のステータスにします。

そのうえで、ブラウザで以下のURLをたたきます。

http://localhost:8090/index.php

これで、以下のように表示されればOKです。

そうでなくて「No input file specified.」みたいに表示された場合は、nginx.confの設定が間違っているので見直しまs。

だいたい。

 fastcgi_param  SCRIPT_FILENAME  C:/src/htdocs$fastcgi_script_name; 

の「C:/src/htdocs」の部分が、正しくPHPのソースファイルの置き場所のパスになっていないのが原因なので正しく修正したらなおります。

こんな感じですかね。

ではでは。