次の方法で共有


Azure App Service で PHP アプリを構成する

警告

Windows 上の PHP は、2022 年 11 月にサポート終了を迎えました。 PHP は App Service on Linux でのみサポートされています。 この記事は参照専用です。

このガイドでは、Azure App Service の PHP Web アプリ、モバイル バックエンド、API アプリを構成する方法を示します。 最も一般的な構成タスクについて説明します。

App Service を初めて使用する場合は、まず「 Azure App Service で PHP Web アプリを作成する 」のクイックスタートと 「PHP、MySQL、Redis アプリを Azure App Service にデプロイ する」チュートリアルに従う必要があります。

PHP のバージョンを表示する

現在のPHPバージョンを表示するには、次のコマンドを実行します。 Azure Cloud Shell は、次の場合に使用できます。

az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion

<resource-group-name><app-name> は、Web アプリに適した名前に置き換えます。

開発スロットに対処するには、--slot パラメーターの後にスロット名を指定して含めます。

サポートされているすべてのPHPバージョンを表示するには、次のコマンドを実行します。

az webapp list-runtimes --os windows | grep PHP

このガイドでは、Azure App Service の PHP Web アプリ、モバイル バックエンド、API アプリを構成する方法を示します。 最も一般的な構成タスクについて説明します。

App Service を初めて使用する場合は、まず「 Azure App Service で PHP Web アプリを作成する 」のクイックスタートと 「PHP、MySQL、Redis アプリを Azure App Service にデプロイ する」チュートリアルに従う必要があります。

PHP のバージョンを表示する

現在のPHPバージョンを表示するには、次のコマンドを実行します。 Azure Cloud Shell を使用できます。

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

<resource-group-name><app-name> は、Web アプリに適した名前に置き換えます。

開発スロットに対処するには、--slot パラメーターの後にスロット名を指定して含めます。

サポートされているすべてのPHPバージョンを表示するには、次のコマンドを実行します。

az webapp list-runtimes --os linux | grep PHP

PHP のバージョンを設定する

PHP バージョンを 8.1 に設定するには、次のコマンドを実行します。

az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1

PHP バージョンを 8.1 に設定するには、次のコマンドを実行します。

az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"

App Service の古いランタイムはどうなりますか?

古いランタイムは、保守組織によって非推奨になったり、重大な脆弱性が見つかったりします。 そのため、ポータルの作成ページと構成ページから削除されます。 古いランタイムがポータルから非表示になっている場合、そのランタイムをまだ使用しているアプリは引き続き実行されます。

ポータルに表示されなくなった古いランタイム バージョンのアプリを作成する場合は、Azure CLI、ARM テンプレート、または Bicep を使用します。 これらのデプロイの代替手段を使用すると、ポータルで削除されたが、引き続きサポートされている非推奨のランタイムを作成できます。

ランタイムが App Service プラットフォームから完全に削除された場合、Azure サブスクリプション所有者は削除前に電子メール通知を受け取ります。

Composer を実行する

デプロイ時に App Service で Composer を実行する場合、最も簡単な方法は、Composer をリポジトリに含めることです。

ローカル ターミナル ウィンドウから、ディレクトリをリポジトリのルートに変更します。 次に、「Composer をダウンロードする」の指示に従って、ディレクトリ ルートに composer.phar をダウンロードします。

次のコマンドを実行します。 これらを実行するには、npm をインストールする必要があります。

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

リポジトリのルートに、 .deploymentdeploy.sh の 2 つの新しいファイルが追加されました。

deploy.sh を開き、次のような Deployment セクションを見つけます。

##################################################################################################################################
# Deployment
# ----------

セクションのDeploymentに、必要なツールの実行に必要なコード セクションを追加します。

# 4. Use composer
echo "$DEPLOYMENT_TARGET"
if [ -e "$DEPLOYMENT_TARGET/composer.json" ]; then
  echo "Found composer.json"
  pushd "$DEPLOYMENT_TARGET"
  php composer.phar install $COMPOSER_ARGS
  exitWithMessageOnError "Composer install failed"
  popd
fi

Git を使用するか、ビルド オートメーションを有効にした Zip デプロイを使用して、すべての変更をコミットし、コードをデプロイします。 これで Composer はデプロイの自動化の一部として実行されているはずです。

Bower、gulp、または Grunt を実行する

App Service でデプロイ時に一般的な自動化ツール (Bower、Gulp、Grunt など) を実行する場合は、 カスタム デプロイ スクリプトを用意する必要があります。 App Service では、Git を使用するか、ビルド オートメーションを有効にした Zip デプロイを使用してデプロイする場合、このスクリプトが実行されます。

リポジトリでこれらのツールを実行できるようにするには、package.json での依存関係にこれらを追加する必要があります。 例えば次が挙げられます。

"dependencies": {
  "bower": "^1.7.9",
  "grunt": "^1.0.1",
  "gulp": "^3.9.1",
  ...
}

ローカル ターミナル ウィンドウから、ディレクトリをリポジトリのルートに変更し、次のコマンドを実行します。 これらを実行するには、npm をインストールする必要があります。

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

リポジトリのルートに、 .deploymentdeploy.sh の 2 つの新しいファイルが追加されました。

deploy.sh を開き、次のような Deployment セクションを見つけます。

##################################################################################################################################
# Deployment
# ----------

このセクションは、npm install --production の実行で終わります。 セクションのDeploymentに、必要なツールの実行に必要なコード セクションを追加します。

MEAN.js サンプルでの例を参照してください。ここでは、デプロイ スクリプトはカスタム npm install コマンドも実行します。

このスニペットは bower install を実行します。

if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
  cd - > /dev/null
fi

gulp

このスニペットは gulp imagemin を実行します。

if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/gulp imagemin
  exitWithMessageOnError "gulp failed"
  cd - > /dev/null
fi

イサキ

このスニペットは grunt を実行します。

if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/grunt
  exitWithMessageOnError "Grunt failed"
  cd - > /dev/null
fi

ビルド オートメーションのカスタマイズ

Git を使用してアプリをデプロイするか、 ビルド自動化が有効になっている ZIP パッケージを使用してデプロイする場合、App Service のビルド自動化は次のシーケンスを実行します。

  1. カスタム スクリプト がPRE_BUILD_SCRIPT_PATH によって指定されている場合、カスタム スクリプトを実行します。
  2. php composer.phar install を実行します。
  3. カスタム スクリプト がPOST_BUILD_SCRIPT_PATH によって指定されている場合、カスタム スクリプトを実行します。

PRE_BUILD_COMMAND および POST_BUILD_COMMAND は、既定では空の環境変数です。 ビルド前のコマンドを実行するには、PRE_BUILD_COMMAND を定義します。 ビルド後のコマンドを実行するには、POST_BUILD_COMMAND を定義します。

次の例では、一連のコマンドに対して 2 つの変数をコンマ区切りで指定しています。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

ビルドの自動化をカスタマイズするためのその他の環境変数については、「Oryx の構成」を参照してください。

App Service が Linux で PHP アプリを実行およびビルドする方法については、 PHP アプリの検出方法とビルド方法に関する Oryx のドキュメントを参照してください。

スタートアップのカスタマイズ

カスタムコマンドは、コンテナの起動時に実行できます。 次のコマンドを実行します。

az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"

環境変数へのアクセス

App Service では、アプリ コードの外部でアプリ設定を指定できます。 その後、標準の getenv() パターンを使用して、これらの設定にアクセスできます。 たとえば、DB_HOST というアプリ設定にアクセスするには、次のコードを使用します。

getenv("DB_HOST")

サイト ルートを変更する

選択した Web フレームワークでは、サイト ルートとしてサブディレクトリを使用できます。 たとえば、Laravel は、サイト ルートとして public/ サブディレクトリを使用します。

サイト ルートをカスタマイズするには、az resource update コマンドを利用し、アプリの仮想アプリケーション パスを設定します。 次の例では、リポジトリの public/ サブディレクトリにサイト ルートが設定されます。

az resource update --name web --resource-group <group-name> --namespace Microsoft.Web --resource-type config --parent sites/<app-name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

既定では、Azure App Service は、デプロイされたアプリケーション ファイルのルート ディレクトリ (/) に対して仮想アプリケーションのルート パス (sites\wwwroot) をポイントします。

選択した Web フレームワークでは、サイト ルートとしてサブディレクトリを使用できます。 たとえば、Laravel は、サイト ルートとして public/ サブディレクトリを使用します。

App Service の既定の PHP イメージでは NGINX が使用されます。サイト ルートを変更するには、NGINX サーバーを root ディレクティブで構成します。 この 例の設定ファイル には、 root ディレクティブを変更する次のスニペットが含まれています。

server {
    #proxy_cache cache;
    #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot/public; # Changed for Laravel

    ___location / {            
        index  index.php index.html index.htm hostingstart.html;
        try_files $uri $uri/ /index.php?$args; # Changed for Laravel
    }
    ...

既定のコンテナーでは、/etc/nginx/sites-available/default にある構成ファイルが使用されます。 このファイルに加えた編集内容は、アプリの再起動時に消去されます。 アプリを再起動しても消去されない変更を行うには、次の例のようにカスタムの起動コマンドを追加します

cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload

このコマンドにより、リポジトリ ルートにある default という名前のファイルが既定の NGINX 構成ファイルに取って代わり、NGINX が再起動されます。

HTTPS セッションを検出する

App Service では、TLS または SSL 終了がネットワーク ロード バランサーで発生するため、すべての HTTPS リクエストは暗号化されていない HTTP リクエストとしてアプリに到達します。 ユーザー要求が暗号化されているかどうかをアプリ ロジックで確認する必要がある場合は、X-Forwarded-Proto ヘッダーを調べます。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}

一般的な Web フレームワークでは、標準のアプリ パターンで X-Forwarded-* 情報にアクセスできます。 CodeIgniter では、is_https () 関数は既定で X_FORWARDED_PROTO の値をチェックします。

php.ini 設定をカスタマイズする

PHP のインストールを変更する必要がある場合は、次の手順を使用して、いずれかの php.ini ディレクティブを変更できます。

PHP のバージョンと現在の php.ini 構成を確認する最善の方法は、アプリで phpinfo() を呼び出すことです。

非 PHP_INI_SYSTEM ディレクティブをカスタマイズする

PHP_INI_USERPHP_INI_PERDIRPHP_INI_ALL ディレクティブをカスタマイズするには、アプリのルート ディレクトリに .user.ini ファイルを追加します。

.user.ini ファイルで使用するものと同じ構文を使用して、構成設定を php.ini ファイルに追加します。 たとえば、display_errors 設定をオンにして upload_max_filesize 設定を 10M に設定する場合は、.user.ini ファイルに次のテキストを含めます。

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

 ; Write errors to d:\home\LogFiles\php_errors.log
 ; log_errors=On

変更内容でアプリを再デプロイし、再起動します。

.user.ini ファイルを使用する代わりに、アプリで ini_set() を使用し、これらの非 PHP_INI_SYSTEM ディレクティブをカスタマイズできます。

Linux Web アプリ (PHP_INI_USERPHP_INI_PERDIR など) の PHP_INI_ALLupload_max_filesizeexpose_php ディレクティブをカスタマイズするには、カスタム .ini ファイルを使用します。 これは、SSH セッションで作成できます。 最初に、ディレクトリを設定します。

  1. Kudu サイトに移動します。 ランダムなハッシュ値とリージョン値を取得するには、アプリの [概要] で [デフォルト ドメイン] をコピーします。
  2. 上部のメニューで、[ デバッグ コンソール] を選択し、[ Bash または SSH] を選択します。
  3. Bash または SSH で、/home/site/wwwroot ディレクトリに移動します。
  4. ini という名前のディレクトリを作成します (たとえば、mkdir ini)。
  5. 現在の作業ディレクトリを、作成した ini フォルダに変更します。

次に、設定を追加する .ini ファイルを作成します。 この例では、extensions.iniを使用します。 Vi、Vim、Nanoなどのファイルエディタはないので、 Echo を使用してファイルに設定を追加します。 upload_max_filesize の値を 2M から 50M に変更します。 次のコマンドを使用して設定を追加し、extensions.ini ファイルがまだ存在しない場合は作成します。

/home/site/wwwroot/ini>echo "upload_max_filesize=50M" >> extensions.ini
/home/site/wwwroot/ini>cat extensions.ini

upload_max_filesize=50M

/home/site/wwwroot/ini>

Azure portal で、先ほど作成した ini ディレクトリをスキャンするアプリケーション設定を追加し、upload_max_filesize の変更を適用します。

  1. Azure portal にアクセスし、App Service Linux PHP アプリケーションを選択します。
  2. [設定] >[環境変数] に移動します。
  3. [+ 追加] を選択します。
  4. [名前] に「PHP_INI_SCAN_DIR」と入力し、[] に「:/home/site/wwwroot/ini」と入力します。
  5. [適用] を選択し、もう一度 [適用] を選択します。 変更を確認します。

GD などの PHP 拡張機能を再コンパイルした場合は、「PHP 拡張機能の再コンパイル」の手順に従ってください。

PHP_INI_SYSTEM ディレクティブをカスタマイズする

PHP_INI_SYSTEM ディレクティブをカスタマイズするには、PHP_INI_SCAN_DIR アプリ設定を使用します。

まず、次のコマンドを実行して、 PHP_INI_SCAN_DIR というアプリ設定を追加します。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"

Azure portal で、アプリを選択します。 サイドバーメニューの [開発ツール ]で、[ 詳細ツール]を選択し、[SSHを使用して d:\home\site ]に移動します。

d:\home\site 内に ini という名前のディレクトリを作成します。 次に、 ディレクトリに d:\home\site\ini ファイル (settings.ini など) を作成し、カスタマイズするディレクティブを含めます。 php.ini ファイルで使用するのと同じ構文を使用します。

たとえば、expose_php の値を変更するには、次のコマンドを実行します。

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

変更内容を有効にするには、アプリを再起動します。

PHP_INI_SYSTEMディレクティブをカスタマイズするために、.htaccessアプローチを使用することはできません。 App Service は、PHP_INI_SCAN_DIR アプリ設定を使用する別のメカニズムを提供します。

まず、次のコマンドを実行して、 PHP_INI_SCAN_DIR というアプリ設定を追加します。

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/home/site/ini"

/usr/local/etc/php/conf.d は、php.ini が存在する既定のディレクトリです。 値 /home/site/ini は、カスタム .ini ファイルを追加するカスタム ディレクトリです。 これらの値は、コロン (:) で区切ります。

Linux コンテナとの Web SSH セッションに移動します。

/home/site 内に ini という名前のディレクトリを作成します。 次に、 ディレクトリに /home/site/ini ファイル (settings.ini など) を作成し、カスタマイズするディレクティブを含めます。 php.ini ファイルで使用するのと同じ構文を使用します。

ヒント

App Service での組み込み Linux コンテナーで、/home を永続化された共有ストレージとして使用します。

たとえば、expose_php の値を変更するには、次のコマンドを実行します。

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

変更内容を有効にするには、アプリを再起動します。

PHP 拡張機能を有効にする

組み込み PHP のインストールには、最もよく使用される拡張機能が含まれています。 php.ini ディレクティブをカスタマイズするのと同じ方法で、より多くの拡張機能を有効にすることができます。

PHP のバージョンと現在の php.ini 構成を確認する最善の方法は、アプリで phpinfo() を呼び出すことです。

他の拡張機能を有効にするには、次の手順を使用します。

  1. アプリのルート ディレクトリに bin ディレクトリを追加し、 その中に.dll 拡張ファイル ( mongodb.dll など) を配置します。 拡張機能が Azure の PHP バージョンと互換性があり、VC9 および非スレッドセーフ (NTS) 互換であることを確認してください。

  2. 変更をデプロイします。

  3. PHP_INI_SYSTEM ディレクティブのカスタマイズ」の手順に従って、extension または zend_extension ディレクティブを使用したカスタム .ini ファイルに拡張機能を追加します。

    extension=d:\home\site\wwwroot\bin\mongodb.dll
    zend_extension=d:\home\site\wwwroot\bin\xdebug.dll
    

変更内容を有効にするには、アプリを再起動します。

組み込み PHP のインストールには、最もよく使用される拡張機能が含まれています。 php.ini ディレクティブをカスタマイズするのと同じ方法で、より多くの拡張機能を有効にすることができます。

PHP のバージョンと現在の php.ini 構成を確認する最善の方法は、アプリで phpinfo() を呼び出すことです。

他の拡張機能を有効にするには、次の手順を使用します。

  1. アプリのルート ディレクトリに bin ディレクトリを追加し、 その中に .so 拡張子ファイル ( mongodb.so など) を配置します。 拡張機能が Azure の PHP バージョンと互換性があり、VC9 および非スレッドセーフ (NTS) 互換であることを確認してください。

  2. 変更をデプロイします。

  3. PHP_INI_SYSTEM ディレクティブのカスタマイズ」の手順に従って、extension または zend_extension ディレクティブを使用したカスタム .ini ファイルに拡張機能を追加します。

    extension=/home/site/wwwroot/bin/mongodb.so
    zend_extension=/home/site/wwwroot/bin/xdebug.so
    

変更内容を有効にするには、アプリを再起動します。

診断ログにアクセスする

標準の error_log() ツールを使用して、診断ログを Azure App Service に表示します。

App Service のアプリケーション コード内から生成されたコンソール ログにアクセスするには、Cloud Shell で次のコマンドを実行して、診断ログを有効にします。

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

--level で有効な値は、ErrorWarningInfoVerbose です。 後続の各レベルには、前のレベルが含まれます。 たとえば、Error にはエラー メッセージのみが含まれます。 Verbose には、すべてのメッセージが含まれます。

診断ログがオンになったら、次のコマンドを実行して、ログのストリームを確認します。

az webapp log tail --resource-group <resource-group-name> --name <app-name>

コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。

ログ ストリーミングをいつでも停止するには、Ctrl+ キーを押します

コンテナー内から生成されたコンソール ログにアクセスできます。

コンテナーのログを有効にするには、次のコマンドを実行します。

az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem

<app-name><resource-group-name> は、Web アプリに適した名前に置き換えます。

コンテナー ログがオンになったら、次のコマンドを実行して、ログのストリームを確認します。

az webapp log tail --name <app-name> --resource-group <resource-group-name>

コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。

ログ ストリーミングをいつでも停止するには、Ctrl+ キーを押します

トラブルシューティング

動作中の PHP アプリが App Service で異なる動作をしたり、エラーが発生した場合は、次の解決策を試してください。

  • 診断ログ・ストリームにアクセスします。
  • 実稼働モードでローカルにアプリをテストします。 App Service では、アプリが実稼働モードで実行されるので、プロジェクトがローカルで実稼働モードで予想どおりに動作することを確認する必要があります。 例えば:
    • composer.json に応じて、実稼働モードに別々のパッケージ (requirerequire-dev) がインストールされる場合があります。
    • 特定の Web フレームワークでは、実稼働モードで静的ファイルを別にデプロイすることがあります。
    • 特定の Web フレームワークでは、実稼働モードで実行しているときにカスタム スタートアップ スクリプトを使用することがあります。
  • デバッグ モードで Azure App Service でアプリを実行します。 たとえば、Laravel で、APP_DEBUG アプリ設定を true に指定することにより、実稼働環境でのデバッグ メッセージを出力するようにアプリを構成できます。

ログ内の robots933456 メッセージを無視する

コンテナー ログで次のメッセージが表示されることがあります。

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

このメッセージは無視してかまいません。 /robots933456.txt は、コンテナーが要求を処理できるかどうかを調べるために App Service が使用するダミーの URL パスです。 404 応答は、パスが存在しないことを示し、コンテナーが正常であり、要求に応答できる状態であることを App Service に知らせます。