Windows Server上のIISでPHPアプリケーションを動作させる際の落とし穴と対策

普段はインフラ構築系の業務がメインですが、ここ数日、珍しくフロントエンド系の開発(Web アプリケーションの開発)の仕事をしています。業務で使用するミドルウェアの制約上、Windows Server 上の IIS(Internet Information Service)で動作させる(厳密には、ミドルウェアが動作する Windows Server と、フロント周りの Web サーバは分割可能なのですが、とりあえずリソースを分割して使用するほどの金銭面の余裕や、性能は求められないので、今回は単純にすべて同一の IIS 上に構築します)、言語は PHP(厳密には…割愛)である必要があるのですが、しばらくそういった業務から離れていた事もあり、また Windows Server というよりも、IIS に想像以上に触れていなかった事もあり、ありとあらゆる場面でハマったため、環境構築のメモを残しておきます。

今回の目標は、IIS+PHP+Laravel(PHP フレームワーク)のデフォルト画面が表示されることです。なお、環境は Windows Server 2012 R2(IIS 8.5)、PHP は 7.2.x、Laravel は 5.5 です。バージョンによって差異がある可能性があります。

IIS で PHP アプリケーションが動作するようになるまで

役割と機能の追加

まずは、サーバーマネージャーから、IIS をインストールします。その際に、PHP を CGI として動作させるためのモジュールである CGI を忘れないようにインストールしましょう。CGI は、「アプリケーションと開発」の中にあります。ここで、CGI をインストールし忘れると、IIS のハンドラーマッピングの際に、「FastCGIModule」が選択できません。なお、役割と機能の追加のみであれば、インストールディスクや ISO ファイルは不要です。

IIS Rewrite Module 2.0 のインストール

WordPress でも使用されている URL 書き換え機能。Apache の「mod_rewrite」モジュールが該当します。たとえば、WordPress では、URL の末尾に記事の ID のパラメーターを付与することで記事を単独表示させる事ができます。

変更前:https://localhost/wordpress/?p=1
変更後:https://localhost/wordpress/1/

Apache の場合、インストール時に設定を変更する事で、自動的にセットアップされますが、IIS 単独では動作しません(Windows Server 2012 R2 に付属する IIS 8.5 の場合)。別途、IIS Rewrite Module 2.0 をインストールする必要があります。ダウンロードは、Download Microsoft URL Rewrite Module 2.0 for IIS 7 (x64) from Official Microsoft Download Centerから行います。「for IIS 7」とありますが、IIS 7 以降であれば動作します。URL の置き換えを行いたい場合は、事前にモジュールをインストールしておく必要がありますのでご注意ください。インストール自体は、ダウンロードしたインストーラーを起動するだけです。

PHP のインストール

Mac の場合、デフォルトで PHP がインストールされていますが、インストールされていない場合においても、Homebrew さえ用意されれば、下記のコマンド一発でインストール可能ですが、Windows の場合、そうはいきません。別途、PHP For Windows: Binaries and sources Releasesからダウンロードする必要があります。

brew install php

Windows Server 2012 R2 は、64bit 版ですので、「x64 Non Thread Safe」の ZIP ファイルをダウンロードします。Windows の IIS で PHP をどう察させたい場合は、IIS の制約上、Non Thread Safe 版を選択するようにしてください。(Thread Safe 版もありますが、Windows 上の Apache など他の Web サーバで動作させたい場合にダウンロードします)

ダウンロードした ZIP ファイルはそのまま展開し、C:¥phpに移動しておきます。展開先はどこでも構いませんが、慣例的にシステムドライブ直下のphpフォルダーに配置することが多いようです。また、「スタート」を「右クリック」→「システム」→「システムの詳細設定」からシステム環境変数の「PATH」の末尾に上記のディレクトリを追加しておきます。システム環境変数に追加後、コマンドプロンプトを開き、以下のコマンドを実行し、エラーが表示されないことを確認します。

php -v

なお、開発端末である Windows 10 クライアント等で「コンピューターに VCRUNTIME140.dll がないため、プログラムを開始できません」というエラーが表示される場合は、Visual Studio 2015 再頒布パッケージのダウンロードが必要です。Download Visual Studio 2015 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Centerからダウンロードしてインストールしておきましょう。

IIS 上で PHP(CGI)を動作させる為のハンドラーマッピング

続いて、IIS から PHP ファイルを、ダウンロードした「php-cgi.exe」で動作させるための設定を行います。

インターネットインフォメーションサービスマネージャーを開き、Web サイト(デフォルトでは「Default Web Site」を選択し、「ハンドラーマッピング」を選択します。

右側のペインから「モジュール追加」をクリックし、以下のように入力します。

項目 内容
要求パス *.php
モジュール FastCgiModule
実行可能ファイル C:¥php¥php-cgi.exe
名前 任意(例:PHP)

PHP 構成ファイル(php.ini)の編集

PHP の構成ファイルである「php.ini」ファイルを編集します。IIS で最低限動作させる為に、デフォルトで用意されているphp.ini-developmentファイルを使用します。その他、PHP で必要な「openssl」や「mbstring」などのモジュールは必要に応じて追加しますが、今回はひとまず動作させる事が目的であるため割愛します。

コピー前:C:¥php¥php.ini-development
コピー後:C:¥php¥php.ini

PHP フレームワーク「Laravel」のインストール

Laravel のインストールは、PHP のパッケージマネージャーである Composer から行います。Composer は、インストーラーを使用すれば自動的に必要な環境変数まで設定してくれますので、Windows の場合はインストーラーを使用しましょう。Introduction - Composer

Composer のインストールが完了したら、コマンドプロンプトを開き以下のコマンドを実行します。

cd C:¥inetpub¥wwwroot
composer global require "laravel/installer"
laravel new sample

「sample」はプロジェクト名になります。また、「sample」というディレクトリが作成されます。なお、composer による初期インストールにはかなり時間がかかりますので気長に待ちましょう。

Node.js のインストール

Laravel のビルドには、Node.js を使用する為、事前に Node.js の Windows 版をインストールしましょう。Windows 版は、ダウンロード | Node.jsの Windows Installer (.msi)版をダウンロードしてインストールしてください。

仮想ディレクトリの作成

インターネットインフォメーションサービスマネージャーを開き、「Default Web Site」を右クリックして、「仮想ディレクトリの追加」をクリックします。

「エイリアス」に「sample」、「物理パス」に「C:¥inetpub¥wwwroot¥sample¥public」を設定します。これで、http://localhost/sample/で、「物理パス」配下にアクセスできるようにできます。「sample」を変更したい場合は、エイリアス名を変更してください。

「index.php」を既定のファイルに追加する

続いて、インターネットインフォーメーションサービスマネージャーの「Default Web Site」を選択し、「既定のドキュメント」を追加します。

デフォルトでは、「index.php」をルートドキュメントとして認識してくれないため、追加しておきます。

phpinfo()による動作確認

C:¥inetpub¥wwwroot配下にindex.phpを新規作成し、下記のように書き換えます。

<?php
  phpinfo();

続いて、ブラウザからhttp://localhost/にアクセスし、phpinfo();の結果が表示されることを確認してください。http://localhost/index.phpと「index.php」を入力しなくても、ページが表示されることを確認しておきます。

Web.config に URL 置き換え(Rewrite)のルールを追加する

たとえば、http://localhost/sample/hoge/にアクセスした際に、http://localhost/sample/index.phpに対してhogeというパラメーターが渡されるように、URL 置き換えを行います。

先ほど作成した仮想ディレクトリを選択し、「URL 置き換え」をクリックします。

「規則の追加」→「空の規則」を選択します。規則名は任意、パターンに^(.*)$、「条件」グループに{REQUEST_FILENAME}に対して、「ファイルではない」と「ディレクトリではない」の 2 パターンを作成しておきます。

また、「アクション」の「URL の置き換え」にindex.php/{R:1}、一番下のチェックボックスである「後続の処理を停止する」をチェックしておきます。これで、publicフォルダー配下にWeb.config(Apache の.htaccessに該当)が作成されます。デフォルトでは.htaccessは用意されているところを見ると、そもそも Windows で動かす人はあまりいないのでしょう..

「storages」フォルダーにアクセス権限を追加する

最後に、IIS 実行ユーザーが、Laravel のログファイル等を保存するために読み取り、書き込みが実行できるように権限を追加します。エクスプローラーで、C:¥inetpub¥wwwroot¥sample¥storagesフォルダーを右クリックし、プロパティを開きます。

続いて、「セキュリティ」タブを開き、「編集」をクリックします。

「Everyone」(誰でも)に「フルコントロール」権限を与えておきましょう。(実際の環境では、IIS の実行ユーザーのみに権限を割り当てることをオススメします)

Node.js のパッケージをインストールする

最後に、Laravel のビルドに必要な Node.js のパッケージをインストールします。すでに、パッケージのインストールに必要な情報であるpackage.jsonは用意されているため、コマンドプロンプトで以下のコマンドを実行するだけです。

cd C:¥inetpub¥wwwroot¥sample
npm install

パッケージのインストールが完了すると、同フォルダー内に「node_modules」というフォルダーが作成され、その中に必要なモジュールがインストールされます。

npm run dev

このコマンドを実行し、ビルドが正常に完了することを確認します。

Laravel のサンプルテスト

ブラウザから、http://localhost/sample/にアクセスし、Laravel のトップ画面が表示されれば完成です!

comments powered by Disqus