Sdílet prostřednictvím


Konfigurace aplikace PHP v Azure App Service

Výstraha

PHP ve Windows dosáhlo konce podpory v listopadu 2022. PHP se podporuje jenom pro App Service v Linuxu. Tento článek je určen pouze pro referenci.

V této příručce se dozvíte, jak nakonfigurovat webové aplikace PHP, mobilní back-endy a aplikace API ve službě Azure App Service. Jsou zde pokryty nejběžnější konfigurační úlohy.

Pokud s App Service začínáte, měli byste nejprve postupovat podle rychlého startu Vytvoření webové aplikace PHP v Azure App Service a kurzu Nasazení aplikace PHP, MySQL a Redis do Azure App Service .

Zobrazení verze PHP

Chcete-li zobrazit aktuální verzi PHP, spusťte následující příkaz. Můžete použít Azure Cloud Shell:

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

Nahraďte <resource-group-name> a <app-name> názvy, které jsou vhodné pro vaši webovou aplikaci.

Poznámka:

Pokud chcete řešit vývojový slot, zahrňte parametr --slot následovaný názvem slotu.

Chcete-li zobrazit všechny podporované verze PHP, spusťte následující příkaz:

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

V této příručce se dozvíte, jak nakonfigurovat webové aplikace PHP, mobilní back-endy a aplikace API ve službě Azure App Service. Jsou zde pokryty nejběžnější konfigurační úlohy.

Pokud s App Service začínáte, měli byste nejprve postupovat podle rychlého startu Vytvoření webové aplikace PHP v Azure App Service a kurzu Nasazení aplikace PHP, MySQL a Redis do Azure App Service .

Zobrazení verze PHP

Chcete-li zobrazit aktuální verzi PHP, spusťte následující příkaz. Můžete použít Azure Cloud Shell.

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

Nahraďte <resource-group-name> a <app-name> názvy, které jsou vhodné pro vaši webovou aplikaci.

Poznámka:

Pokud chcete řešit vývojový slot, zahrňte parametr --slot následovaný názvem slotu.

Chcete-li zobrazit všechny podporované verze PHP, spusťte následující příkaz:

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

Nastavení verze PHP

Chcete-li nastavit verzi PHP na 8.1, spusťte následující příkaz:

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

Chcete-li nastavit verzi PHP na 8.1, spusťte následující příkaz:

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

Co se stane se zastaralými runtimy ve službě App Service?

Zastaralé verze runtime jsou organizací, která je spravuje, zrušeny nebo mají zásadní bezpečnostní zranitelnosti. Proto se odeberou z vytváření a konfigurace stránek na portálu. Pokud je zastaralý modul runtime skrytý na portálu, všechny aplikace, které stále používají tento modul runtime, budou dál běžet.

Pokud chcete vytvořit aplikaci se zastaralou verzí modulu runtime, která se už na portálu nezobrazuje, použijte Azure CLI, šablonu ARM nebo Bicep. Tyto alternativy nasazení umožňují vytvářet zastaralé moduly runtime, které byly odebrány na portálu, ale stále se podporují.

Pokud je modul runtime plně odebraný z platformy Služby App Service, obdrží vlastník předplatného Azure před odebráním e-mailové oznámení.

Spustit Composer

Pokud chcete, aby služba App Service spouštěla nástroj Composer v době nasazení, nejjednodušší je zahrnout Composer do svého úložiště.

V okně místního terminálu změňte adresář na kořen úložiště. Potom postupujte podle pokynů na webu Download Composer a stáhněte composer.phar si ho do kořenového adresáře.

Spusťte následující příkazy. Abyste je mohli spustit, musíte mít nainstalovaný npm .

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

Kořenový adresář úložiště má nyní dva nové soubory: .deployment a deploy.sh.

Otevřete deploy.sh a najděte oddíl, který vypadá jako v tomto příkladu Deployment :

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

Na konec oddílu Deployment přidejte oddíl kódu, který potřebujete ke spuštění požadovaného nástroje:

# 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

Potvrďte všechny změny a nasaďte kód pomocí Gitu nebo pomocí nasazení ZIP s povolenou automatizací sestavení. Nástroj Composer by teď měl být spuštěný jako součást automatizace nasazení.

Spuštění Boweru, Gulpu nebo Gruntu

Pokud chcete, aby App Service v době nasazení spouštěl oblíbené automatizační nástroje, jako je Bower, Gulp nebo Grunt, musíte zadat vlastní skript nasazení. App Service spustí tento skript při nasazení pomocí Gitu nebo nasazením ZIP s povolenou automatizací sestavení.

Pokud chcete úložišti povolit spouštění těchto nástrojů, musíte je přidat do závislostí v package.jsonsouboru . Například:

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

V okně místního terminálu změňte adresář na kořenový adresář úložiště a spusťte následující příkazy. Abyste je mohli spustit, musíte mít nainstalovaný npm .

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

Kořenový adresář úložiště má nyní dva nové soubory: .deployment a deploy.sh.

Otevřete deploy.sh a najděte oddíl, který vypadá jako v tomto příkladu Deployment :

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

Tento oddíl končí spuštěním npm install --production. Na konec oddílu Deployment přidejte oddíl kódu, který potřebujete ke spuštění požadovaného nástroje:

Podívejte se na příklad v ukázce MEAN.js, kde skript nasazení také spouští vlastní npm install příkaz.

Loubí

Tento fragment kódu se spustí 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

Lok

Tento fragment kódu se spustí 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

Chrochtání

Tento fragment kódu se spustí grunt:

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

Přizpůsobte automatizaci sestavení

Pokud aplikaci nasadíte pomocí Gitu nebo pomocí balíčků ZIP s povolenou automatizací sestavení, automatizace sestavení v App Service provede následující postup:

  1. Spusťte vlastní skript, pokud to specifikuje PRE_BUILD_SCRIPT_PATH.
  2. Spusťte php composer.phar install.
  3. Spusťte vlastní skript, pokud to specifikuje POST_BUILD_SCRIPT_PATH.

PRE_BUILD_COMMAND a POST_BUILD_COMMAND jsou proměnné prostředí, které jsou ve výchozím nastavení prázdné. Chcete-li spustit příkazy prebuild, definujte PRE_BUILD_COMMAND. Chcete-li spustit příkazy po sestavení, definujte POST_BUILD_COMMAND.

Následující příklad určuje dvě proměnné na řadu příkazů oddělených čárkami:

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"

Další proměnné prostředí pro přizpůsobení automatizace sestavení najdete viz Konfigurace Oryxu.

Informace o tom, jak App Service spouští a sestavuje aplikace PHP v Linuxu, najdete v dokumentaci k Oryxu o tom, jak se zjišťují a sestavují aplikace PHP.

Přizpůsobení spuštění

Vlastní příkaz můžete spustit při spuštění kontejneru. Spusťte následující příkaz:

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

Přístup k proměnným prostředí

Ve službě App Service můžete nastavit nastavení aplikace mimo kód aplikace. K těmto nastavením pak můžete přistupovat pomocí standardního getenv() vzoru. Například pro přístup k aplikačnímu nastavení s názvem DB_HOST použijete následující kód:

getenv("DB_HOST")

Změna kořenového adresáře webu

Webová architektura podle vašeho výběru může jako kořen webu použít podadresář. Laravel například používá public/ podadresář jako kořen webu.

Pokud chcete upravit kořen webu, nastavte cestu virtuální aplikace pro aplikaci pomocí az resource update příkazu. Následující příklad nastaví kořen webu na public/ podadresář ve vašem úložišti:

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

Ve výchozím nastavení Azure App Service odkazuje kořenovou cestu virtuální aplikace (/) do kořenového adresáře nasazených souborů aplikace (sites\wwwroot).

Webová architektura podle vašeho výběru může jako kořen webu použít podadresář. Laravel například používá public/ podadresář jako kořen webu.

Výchozí image PHP pro App Service používá NGINX a změníte kořen webu tak, že nakonfigurujete server NGINX s direktivouroot. Tento příklad konfiguračního souboru obsahuje následující fragment kódu, který mění direktivu 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
    }
    ...

Výchozí kontejner používá konfigurační soubor na adrese /etc/nginx/sites-available/default. Veškeré úpravy tohoto souboru budou po restartu aplikace vymazány. Pokud chcete provést změnu, která je efektivní při restartování aplikace, přidejte vlastní spouštěcí příkaz podobný tomuto příkladu:

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

Tento příkaz nahradí výchozí konfigurační soubor NGINX souborem pojmenovaným default v kořenovém adresáři úložiště a restartuje NGINX.

Zjištění relace HTTPS

Ve službě App Service dochází k ukončení protokolu TLS/SSL v nástrojích pro vyrovnávání zatížení sítě, takže všechny požadavky HTTPS dosáhnou vaší aplikace jako nešifrované požadavky HTTP. Pokud logika vaší aplikace potřebuje zkontrolovat, jestli jsou požadavky uživatelů zašifrované, zkontrolujte hlavičku X-Forwarded-Proto :

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

Oblíbené webové architektury umožňují přístup k X-Forwarded-* informacím ve standardním vzoru aplikace. V CodeIgniter zkontroluje funkce is_https() hodnotu X_FORWARDED_PROTO ve výchozím nastavení.

Přizpůsobte nastavení php.ini

Pokud potřebujete provést změny instalace PHP, můžete pomocí následujícího postupu změnit libovolnou direktivuphp.ini .

Poznámka:

Nejlepší způsob, jak zobrazit verzi PHP a aktuální php.ini konfiguraci, je použít phpinfo() ve vaší aplikaci.

Přizpůsobte direktivy mimo PHP_INI_SYSTEM

Pokud chcete přizpůsobit PHP_INI_USER, PHP_INI_PERDIRa PHP_INI_ALL direktivy, přidejte .user.ini soubor do kořenového adresáře aplikace.

Do souboru přidejte nastavení .user.ini konfigurace pomocí stejné syntaxe, jakou byste použili v php.ini souboru. Pokud byste například chtěli zapnout nastavení display_errors a nastavit upload_max_filesize na hodnotu 10M, soubor .user.ini by obsahoval tento text:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

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

Znovu nasaďte aplikaci se změnami a restartujte ji.

Jako alternativu k použití souboru .user.ini můžete v aplikaci použít ini_set(), abyste přizpůsobili tyto direktivy ne-PHP_INI_SYSTEM.

Chcete-li přizpůsobit PHP_INI_USERdirektivy , PHP_INI_PERDIRa PHP_INI_ALL pro webové aplikace Linux, například upload_max_filesize a expose_php, použijte vlastní soubor .ini . Můžete ho vytvořit v relaci SSH. Nejprve nastavte adresář:

  1. Přejděte na své stránky Kudu. Pokud chcete získat náhodné hodnoty hash a oblasti, zkopírujte v přehledu aplikace výchozí doménu.
  2. V horní nabídce vyberte možnost Konzola pro ladění a poté Bash nebo SSH.
  3. V Bash nebo SSH přejděte do adresáře /home/site/wwwroot .
  4. Vytvořte adresář s názvem ini (například mkdir ini).
  5. Změňte aktuální pracovní adresář na složku ini, kterou jste vytvořili.

Dále vytvořte soubor.ini , do kterého přidáte svá nastavení. Tento příklad používá extensions.ini. Nejsou zde žádné editory souborů, jako je Vi, Vim nebo Nano, takže použijte Echo pro přidání nastavení do souboru. upload_max_filesize Změňte hodnotu z 2M na 50M. Pomocí následujícího příkazu přidejte nastavení a vytvořte extensions.ini soubor, pokud ještě neexistuje:

/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>

Na webu Azure Portal přidejte nastavení aplikace pro kontrolu ini adresáře, který jste právě vytvořili, aby se změna použila pro upload_max_filesize:

  1. Přejděte na Azure Portal a vyberte svou aplikaci App Service Linux PHP.
  2. Přejděte do Nastavení>Proměnné prostředí.
  3. Vyberte + Přidat.
  4. Do pole Název zadejte PHP_INI_SCAN_DIR a do pole Hodnota zadejte :/home/site/wwwroot/ini.
  5. Vyberte možnost Použít (Apply) a pak znovu Použít (Apply). Potvrďte provedené změny.

Poznámka:

Pokud jste překompilovali rozšíření PHP, například GD, postupujte podle pokynů v tématu Rekompiling rozšíření PHP.

Přizpůsobení direktiv PHP_INI_SYSTEM

K přizpůsobení PHP_INI_SYSTEM direktiv použijte PHP_INI_SCAN_DIR nastavení aplikace.

Nejprve spusťte následující příkaz a přidejte nastavení aplikace s názvem 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"

V Azure Portal vyberte svou aplikaci. V části Vývojové nástroje v nabídce postranního panelu vyberte možnost Pokročilé nástroje a poté přejděte na d:\home\site používání SSH.

Vytvořte adresář v d:\home\site s názvem ini. Poté v adresáři vytvořte soubor d:\home\site\ini, například , s direktivami, settings.inikteré chcete přizpůsobit. Použijte stejnou syntaxi, jakou byste použili v php.ini souboru.

Pokud například chcete změnit hodnotu expose_php, spusťte následující příkazy:

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

Aby se změny projevily, restartujte aplikaci.

Chcete-li přizpůsobit PHP_INI_SYSTEM direktivy, nemůžete použít přístup .htaccess . App Service poskytuje samostatný mechanismus, který používá PHP_INI_SCAN_DIR nastavení aplikace.

Nejprve spusťte následující příkaz a přidejte nastavení aplikace s názvem 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"

Hodnota /usr/local/etc/php/conf.d je výchozí adresář, kde php.ini existuje. Hodnota /home/site/ini je vlastní adresář, do kterého přidáte vlastní soubor.ini . Hodnoty oddělíte dvojtečkam (:).

Přejděte na webovou SSH relaci s Linux kontejnerem.

Vytvořte adresář v /home/site s názvem ini. Poté v adresáři vytvořte soubor /home/site/ini, například , s direktivami, settings.inikteré chcete přizpůsobit. Použijte stejnou syntaxi, jakou byste použili v php.ini souboru.

Návod

Integrované kontejnery Linuxu ve službě App Service se používají /home jako trvalé sdílené úložiště.

Pokud například chcete změnit hodnotu expose_php, spusťte následující příkazy:

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

Aby se změny projevily, restartujte aplikaci.

Povolení rozšíření PHP

Integrované instalace PHP obsahují nejčastěji používaná rozšíření. Další rozšíření můžete povolit stejným způsobem, jakým přizpůsobujete php.ini direktivy.

Poznámka:

Nejlepší způsob, jak zobrazit verzi PHP a aktuální php.ini konfiguraci, je použít phpinfo() ve vaší aplikaci.

Chcete-li povolit další rozšíření, postupujte následovně:

  1. Přidejte adresář bin do kořenového adresáře vaší aplikace a vložte do něj soubory rozšíření .dll, například mongodb.dll. Ujistěte se, že jsou rozšíření kompatibilní s verzí PHP v Azure a že jsou kompatibilní s VC9 a bez vláken (NTS).

  2. Nasaďte změny.

  3. Postupujte podle kroků v části Přizpůsobit direktivy PHP_INI_SYSTEM a přidejte rozšíření do vlastního souboru .ini s příponou nebo direktivou zend_extension :

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

Aby se změny projevily, restartujte aplikaci.

Integrované instalace PHP obsahují nejčastěji používaná rozšíření. Další rozšíření můžete povolit stejným způsobem, jakým přizpůsobujete php.ini direktivy.

Poznámka:

Nejlepší způsob, jak zobrazit verzi PHP a aktuální php.ini konfiguraci, je použít phpinfo() ve vaší aplikaci.

Chcete-li povolit další rozšíření, postupujte následovně:

  1. bin Přidejte adresář do kořenového adresáře vaší aplikace a vložte do něj soubory s příponou .so (například mongodb.so). Ujistěte se, že jsou rozšíření kompatibilní s verzí PHP v Azure a že jsou kompatibilní s VC9 a bez vláken (NTS).

  2. Nasaďte změny.

  3. Postupujte podle kroků v části Přizpůsobit direktivy PHP_INI_SYSTEM a přidejte rozšíření do vlastního souboru .ini s příponou nebo direktivou zend_extension :

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

Aby se změny projevily, restartujte aplikaci.

Přístup k diagnostickým protokolům

Pomocí standardního error_log() nástroje můžete diagnostické protokoly zobrazit ve službě Azure App Service.

Pokud chcete získat přístup k protokolům konzoly vygenerovaným v kódu aplikace ve službě App Service, zapněte protokolování diagnostiky spuštěním následujícího příkazu v Cloud Shellu:

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

Možné hodnoty pro --level jsou Error, Warning, Infoa Verbose. Každá další úroveň zahrnuje předchozí úroveň. Například Error obsahuje pouze chybové zprávy. Verbose obsahuje všechny zprávy.

Po zapnutí protokolování diagnostiky spuštěním následujícího příkazu zobrazte stream protokolu:

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

Pokud se protokoly konzoly nezobrazí okamžitě, zkontrolujte to znovu za 30 sekund.

Pokud chcete streamování protokolů kdykoli zastavit, vyberte Ctrl+C.

Přístup k protokolům konzoly vygenerovaným z kontejneru.

Protokolování kontejneru zapnete spuštěním následujícího příkazu:

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

Nahraďte <app-name> a <resource-group-name> názvy, které jsou vhodné pro vaši webovou aplikaci.

Po zapnutí protokolování kontejneru spusťte následující příkaz, abyste viděli stream protokolu:

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

Pokud se protokoly konzoly nezobrazí okamžitě, zkontrolujte to znovu za 30 sekund.

Pokud chcete streamování protokolů kdykoli zastavit, vyberte Ctrl+C.

Řešení problémů

Pokud se funkční aplikace PHP chová jinak ve službě App Service nebo obsahuje chyby, vyzkoušejte následující řešení:

  • Získejte přístup ke streamu diagnostického protokolu.
  • Otestujte aplikaci místně v produkčním režimu. App Service spouští vaši aplikaci v produkčním režimu, takže se musíte ujistit, že váš projekt funguje podle očekávání v produkčním režimu místně. Například:
    • V závislosti na vašem composer.json souboru se můžou nainstalovat různé balíčky pro produkční režim (require versus require-dev).
    • Některé webové architektury můžou v produkčním režimu nasazovat statické soubory jinak.
    • Některé webové architektury můžou při spuštění v produkčním režimu používat vlastní spouštěcí skripty.
  • Spusťte aplikaci ve službě App Service v režimu ladění. Například v Laravelu můžete aplikaci nakonfigurovat tak, aby v produkčním prostředí aplikace generovala ladicí zprávy tím, že nastavíte APP_DEBUG na true.

Ignorovat zprávu robots933456 v protokolech

V protokolech kontejneru se může zobrazit následující zpráva:

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

Tuto zprávu klidně ignorujte. /robots933456.txt je fiktivní cesta URL, kterou App Service používá ke kontrole, jestli kontejner dokáže obsloužit požadavky. Odpověď 404 značí, že cesta neexistuje, a signalizuje app Service, že kontejner je v pořádku a připravený reagovat na požadavky.