Windows Server に PHP を導入する (随時加筆)

Web Service//
  1. ホーム
  2. Web Service
  3. Windows Server に PHP を導入する (随時加筆)

前回の続きで、nginxを導入した「Windows Server 2016」にPHPを導入します。
とは言っても、PHPを単純に動かすだけなら、ダウンロードして展開したファイルをポンッと格納すれば終わりです。

PHPの導入

PHPのセットアップ

  1. 公式サイトより、PHPをダウンロードします。
  2. 今回の導入対象OSは「Windows Server 2016」そして「nginx」に導入しますし、単純に単体でWordpressを動かすだけなので、「Non Thread Safe」版を導入します。
    今回は「PHP7.4.8 VC15 x64 Non Thread Safe (2020-Jul-09 14:56:48)」の「ZIP版」をダウンロードします。
  1. ダウンロードしたファイルを展開します。
  2. 展開したフォルダーを「c:\」直下に移動し、フォルダー名を「php」にリネームします。
    (c:\php になります。)

ほんっとうにシンプルに使うだけなら簡単になりました。
とはいえ、「じゃぁNon Thread Safe版ってなによ?」とか色々やろうとすると色々しなければいけないのですが、今回の趣旨は「Windows Server でとりあえずWordpressを使うだけ」なので、これくらいです。

PHP.ini を作りましょう (随時加筆)

つくるというか、既存である物を流用になります。
「c:\php」内に「php.ini-development (開発環境向け)」と「php.ini-production (本番環境向け)」がありますが、今回は本番環境のテストなので、「php.ini-production」をリネームして、「php.ini」にします。

nginx、MySQL、Wordpressを利用するために最低限以下の設定をしています。
※この部分は随時加筆していきます。

extension ディレクトリーの有効化

; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
;extension_dir = "./"
; On windows:
;extension_dir = "ext"
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "ext"

PHPでは様々な拡張モジュールが用意されています。
現状では無効化されているので、コメントアウトを外して有効にします。

セッションタイムアウトの変更

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 180

PHPの実行時にタイムアウトエラーを出す値を変更します。
サーバースペックが低い場合などはプラグインの初期設定などで実行時間がかなりかかるケースがあるので、変更しました。

アップロードサイズの変更

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 50M

主にWordpressで色々アップロード出来るサイズを変更します。
初期は「2MB」と心許ないので、「50MB」に変更します。

各エクステンションの有効化

extension=curl
extension=fileinfo
extension=gd2
extension=mbstring
extension=exif
extension=mysqli
extension=openssl

WordPress必須機能&サイトヘルス対策に、7つのコメントアウトを外します。
(2020年7月21日改版)

環境変数の追加

  1. 「win+R」で「ファイル名を指定して実行」を開きます。
  2. 「sysdm.cpl」と入力し、「OK」をクリックします。
  3. 「システムのプロパティ」ウィンドウが表示されるので、「詳細設定」>「環境変数」を開きます。
  4. 「システム環境変数」の「Path」を選択し、「編集」をクリックします。
  5. 「新規」をクリックし、「c:\php」を入力した後「OK」をクリックします。

PHP をサービス化して自動起動にする

このままでもいいのですけど、再起動時に手動でPHPを起動するのは面倒という事で、サービス化してみました。
このままではサービス化は出来ないので、Nginxの時と同様に「WinSW」と言うツールを使ってサービス化することにしました。

.NET Framework 3.5 を有効にする

Configファイルを作れば本frameworkは不要なのですが、導入することにしました。
(理由は後述)

  1. サーバーマネージャーを起動します。
  2. 「管理」>「役割と追加」を選択します。
  3. 「役割と機能の追加ウィザード」が起動します。
  4. 「開始する前に」の項目は「次へ」をクリックします。
  5. 「インストールの種類」の項目は「次へ」をクリックします。
  6. 「サーバーの選択」の項目は「次へ」をクリックします。
  7. 「サーバーの役割」の項目は「次へ」をクリックします。
  8. 「機能」の項目では「.NET Framework 3.5 Futures」にチェックをして「次へ」をクリックします。
  9. 「確認」の項目で「警告」が表示されますが、そのまま「インストール」をクリックします。
  1. 「結果」に遷移し、インストールが開始されます。「<サーバー名>でインストールが正常に完了しました。」が表示されたのを確認して、「閉じる」をクリックします。

WinSW の導入

  1. ダウンロードページより、winswの最新版「winsw-*.*.*-bin.exe」をダウンロードします。
  2. ダウンロードしたファイルを「php-cgi.exe」と同じ場所に格納します。
  3. PHPでも同じくサービス化で利用するため、リネームします。
    今回私は「winsw_290_php_svc.exe」という名前に変更しました。
  4. xmlファイルを作成します。名前は「3」でリネームした名前と同じ名前にします。
    今回は「winsw_290_php_svc.xml」にしました。
<service>
  <id>PHPCGI</id>
  <name>PHPCGI</name>
  <description>PHP</description>
  <executable>C:\php\php-cgi.exe</executable>
  <logpath>C:\php\logs\</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <startargument>-b127.0.0.1:9000</startargument>
  <startargument>-cc:\php\php.ini</startargument>
  <stopexecutable>taskkill.exe</stopexecutable>
  <stopargument>/f</stopargument>
	<stopargument>/im</stopargument>
	<stopargument>php-cgi.exe</stopargument>
  <!--<stopargument>taskkill /f /IM php-cgi.exe</stopargument>  -->
</service>
  1. Configファイルを作成します。名前は「3」でリネームした名前と同じ名前にします。
    今回の場合は「winsw_290_php_svc.config」にしました。
    ※ 「.NET framework 3.5」を導入している場合は不要です。
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>
  1. 「4」で作成した「xml」ファイル及び、「5」で作成した「config」ファイルを「php-cgi.exe」と同じフォルダーに格納します。

今回私がconfigファイルを作成せずに、「.NET Framework 3.5」で動作させた理由は、configファイルがうまく機能しなかったからです。
「Windows Server 2016」では「.NET Framework 4.6」ですので、恐らくバージョンの記述を変える必要ありそうです。

サービス登録

コマンドプロンプトもしくはPowerShellで以下のコマンドを実行します。

cd c:\php
winsw_290_php_svc install

これでサービスに登録が出来ます。
ちゃんと登録出来たか確認をします。

削除したい場合は上述の「install」を「uninstall」に変更して実行してください。

ImageMagick の導入

WordPressのサイトヘルスで「ImageMagickが入ってないよー」と怒られるので導入メモ追記。
いろんなサイトを確認したのですが、「PHP7.x環境&Windows Server環境」でちゃんと説明されていたのがここのサイト様だけでしたので、ほぼ丸写しですが備忘録的にメモしておきます。

前提調査

まず、「phpinfo.php」を表示させて、必要情報の調査します。

確認しておくべき項目は

  • Version : PHP 7.4.7
  • Architecture : x64
  • PHP Extension Build : VC15
  • Thread Safety : disabled

今回はNginxを入れてるので、PHPは NoneThread版にしてます。

ImageMagickのダウンロード

所謂本体ファイルとPHPのエクステンションDLLの二つをダウンロードします。

本体ファイル群

この中で、今回は「ImageMagick-7.0.7-11-vc15-x64.zip」をダウンロードします。

PHPエクステンションdll

こちらのサイトからダウンロードをします。

詳細ページに遷移しますので、その中で今回は「PHP7.4」の「7.4 Non Thread Safe (NTS) x64」を選択します。

ImageMagick の導入

まずダウンロードした2つのZIPファイルを解凍します。

本体ファイルの展開

任意のフォルダーを作成し、そこに、展開した内容の「bin」フォルダー内全てをコピーします。
(今回はc:\bin\ImageMagick)

環境変数の追加

前述のPHPの項目で紹介した「環境変数の追加」を参考に作成したフォルダー(今回は c:\bin\ImageMagick)にPathを通します。

PHPエクステンションdll の展開

展開したファイルの中から、「php_imagick.dll」のみを、「PHPフォルダー配下」の「extフォルダー」に格納します。

php.ini への追記

以下の項目を「php.ini」に追加します。
場所は「Dynamic Extensions」の一番最後でいいと思います。

extension=php_imagick.dll

最終確認

最後に私の環境では、「PHP-CGI」と「Nginx」をサービス化している為、両方とも再起動します。
その後、再び「phpinfo.php」を表示させて、「ImageMagick」の項目が追加されていることを確認します。

もし、本手順若しくは参考サイト様の手順で有効にならない場合は・・・

  • ダウンロードしたファイルは適切か? (前提調査の項目に適合しているか?)
  • 環境変数は通しているか?
  • Nginx (環境によってはApache)を再起動させているか?
  • 念のため、サーバーを再起動したか?
  • PHP.iniへの記述は間違っていないか

等を確認してください。

PHPが落ちてしまう問題

しばらくするとPHPのサービスが終了してしまう問題ですが、単純にサーバーメモリかと思いました。

4GBから16GBに増設しても落ちてしまうので、なぜかな?と思っていましたが、どうやら標準設定では「500リクエストで終了」してしまうとのこと。

  • PHP-CGIが終了したら自動的に再起動するようにする。
  • そもそもリクエスト数を無制限にする。

どちらかにすると回避出来るようなので、今回は「Windows Server」の環境変数に「変数名:PHP_FCGI_MAX_REQUESTS」、「値:0」を設定してみました。

これで様子を見てみます。

改版履歴