2020/11/09
というわけで、今回はPHPとIISに関するお話です。
自分の場合、PHPはApache上で動かすことが圧倒的に多い…というかそれ以外で動かしたことがありませんでした。
そんな中、仕事の関係でちょっとしたサンプルプログラムをIIS上で動かすことになりましたが、その際にあれこれハマってしまったので、備忘録を兼ねて書いておきます。
目次
環境
・Windows Server 2016
・IIS 10
・PHP 7.0.20 (NTS)
ハマったこと
php.iniが読み込まれない
PHPのトラブルの中では最早様式美というくらい報告されている話です。
Windowsの場合は「Configuration File (php.ini) Path」がC:\Windows
になっているので真に受けてしまいましたが、実際は「環境変数(Path)で指定したPHPディレクトリ直下」に配置すれば読み込まれるようです。
また、「php.ini自体の構文エラー」にも注意しましょう。コマンドプロンプトからphp -c (php.iniのパス)
で構文チェックができます。
php.iniを変更しても設定が反映されない
IISマネージャでいうところの「サイト」ではなく「アプリケーションプール」を選択し、「リサイクル」を実行します。
ついサイト自体を再起動してしまいがちですが、それでは反映されないようです。
「コンピューターにVCRUNTIME140.dll がないため、プログラムを開始できません。」と言われる
「Visual C++」のランタイムをインストールしましょう。PHPのバージョンによって変わりますが、7.0の場合は2015が必要でした。
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145
インストール自体はすぐ終わるはずです。
詳しい話はstackoverflowに載っています。
https://stackoverflow.com/questions/45163588/mysql-5-7-installer-fails-to-detect-vs-2013-redistributable
アクセス時に「502 Bad Gateway」が返ってくる
php.iniのcgi.force_redirect
を0に変更します。
どんな設定か分からず変えるのは技術者としてよろしくないので調べてみると、公式マニュアルにそれっぽい説明がありました。
http://php.net/manual/ja/security.cgi-bin.force-redirect.php
「force_redirect」なだけあって、リダイレクト時にしかPHPが実行できなくなる…という感じでしょうか。
MVCなフレームワークを使っていれば問題なさそうですが、今回は生PHPのざっくりしたサンプルなので無効化してしまいます。セキュリティ的によろしくないようですが、イントラ内のテスト環境なので問題ありません。
【2017/11/14 追記】
PHP公式マニュアルに書かれているのを見逃していました。IISは0に設定すべきだそうです。
http://php.net/manual/ja/ini.core.php#ini.cgi.force-redirect
header() が上手く動作しない
原因は以下の2つでした。
・ファイルの文字コードが「UTF-8のBOM付き」になっていた
・Location
の指定が相対パスだった
BOM付きについては「サクラエディタ」とか入っていればサーバ上から直せるのですが、そんないいものは入っていなかったので再コピーする羽目に。
後者はApacheなら動作しますが、IISではスキーム名 (http
) まで含めたURLでないと動きませんでした。絶対URLで書くのが正しいそうなので、今後は注意します。
特に最近はフレームワークに任せきりだったのでなおさらです。
BASIC認証のユーザー名・パスワードの指定
Apacheでは.htpasswd
で指定するのが一般的かと思いますが、IISではWindowsユーザーのユーザー名・パスワードを使用するそうです。
OS側でユーザーを追加しなければならないのは面倒に感じます。
あとがき
そんなわけで、IIS上でPHPを動かした際に詰まった点を書き連ねてみました。
Apacheとは勝手が違う部分が多くてビックリです。
これで大手Webサーバの中では「Nginx」だけ触ったことがないことになります。最近まで読み方も知らなかったりしましたが、Apacheよりいいウワサも耳にするので、ちょっと気になるところです。