Een PHP-app configureren voor Azure-app Service

PHP-versie weergeven

Deze handleiding laat zien hoe u uw PHP-web-apps, mobiele back-ends en API-apps in Azure-app Service configureert.

Deze handleiding bevat belangrijke concepten en instructies voor PHP-ontwikkelaars die apps implementeren in App Service. Als u Azure-app Service nog nooit hebt gebruikt, volgt u eerst de PHP-quickstart en PHP met MySQL- zelfstudie.

Als u de huidige PHP-versie wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

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

Notitie

Als u een ontwikkelsite wilt aanpakken, neemt u de parameter --slot op gevolgd door de naam van de site.

Als u alle ondersteunde PHP-versies wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

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

Deze handleiding laat zien hoe u uw PHP-web-apps, mobiele back-ends en API-apps in Azure-app Service configureert.

Deze handleiding bevat belangrijke concepten en instructies voor PHP-ontwikkelaars die apps implementeren in App Service. Als u Azure-app Service nog nooit hebt gebruikt, volgt u eerst de PHP-quickstart en PHP met MySQL- zelfstudie.

Als u de huidige PHP-versie wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

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

Notitie

Als u een ontwikkelsite wilt aanpakken, neemt u de parameter --slot op gevolgd door de naam van de site.

Als u alle ondersteunde PHP-versies wilt weergeven, voert u de volgende opdracht uit in de Cloud Shell:

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

PHP-versie instellen

Voer de volgende opdracht uit in Cloud Shell om de PHP-versie in te stellen op 8.1:

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

Voer de volgende opdracht uit in Cloud Shell om de PHP-versie in te stellen op 8.1:

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

Composer uitvoeren

Als u Wilt dat App Service Composer uitvoert tijdens de implementatie, is de eenvoudigste manier om de Composer op te nemen in uw opslagplaats.

Wijzig vanuit een lokaal terminalvenster de map in de hoofdmap van uw opslagplaats en volg de instructies bij het downloaden van Composer om composer.phar te downloaden naar de hoofdmap van de map.

Voer de volgende opdrachten uit (u moet npm hebben geïnstalleerd):

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

De hoofdmap van de opslagplaats bevat nu twee extra bestanden: .deployment en deploy.sh.

Open deploy.sh en zoek de Deployment sectie, die er als volgt uitziet:

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

Voeg de codesectie toe die u nodig hebt om het vereiste hulpprogramma aan het einde van de Deployment sectie uit te voeren:

# 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

Voer al uw wijzigingen door en implementeer uw code met Behulp van Git of Zip Deploy met build automation ingeschakeld. Composer moet nu worden uitgevoerd als onderdeel van implementatieautomatisering.

Grunt/Bower/Gulp uitvoeren

Als u wilt dat App Service populaire automatiseringshulpprogramma's uitvoert tijdens de implementatie, zoals Grunt, Bower of Gulp, moet u een aangepast implementatiescript opgeven. App Service voert dit script uit wanneer u implementeert met Git of met Zip-implementatie met buildautomatisering ingeschakeld.

Als u wilt dat uw opslagplaats deze hulpprogramma's uitvoert, moet u deze toevoegen aan de afhankelijkheden in package.json. Bijvoorbeeld:

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

Wijzig vanuit een lokaal terminalvenster de map in de hoofdmap van uw opslagplaats en voer de volgende opdrachten uit (u moet npm hebben geïnstalleerd):

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

De hoofdmap van de opslagplaats bevat nu twee extra bestanden: .deployment en deploy.sh.

Open deploy.sh en zoek de Deployment sectie, die er als volgt uitziet:

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

Deze sectie eindigt met uitvoeren npm install --production. Voeg de codesectie toe die u nodig hebt om het vereiste hulpprogramma aan het einde van de Deployment sectie uit te voeren:

Bekijk een voorbeeld in het mean.js-voorbeeld, waarbij het implementatiescript ook een aangepaste npm install opdracht uitvoert.

Bower

Dit fragment wordt uitgevoerd 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

Dit fragment wordt uitgevoerd 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

Dit fragment wordt uitgevoerd grunt.

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

De automatisering van bouwbewerkingen aanpassen

Als u uw app implementeert met Git of zip-pakketten gebruikt waarvoor buildautomatisering is ingeschakeld, doorloopt de App Service-buildautomatisering de volgende reeks:

  1. Voer aangepast script uit als dit is opgegeven door PRE_BUILD_SCRIPT_PATH.
  2. Voer php composer.phar install uit.
  3. Voer aangepast script uit als dit is opgegeven door POST_BUILD_SCRIPT_PATH.

PRE_BUILD_COMMAND en POST_BUILD_COMMAND zijn omgevingsvariabelen die standaard leeg zijn. Als u vooraf gebouwde opdrachten wilt uitvoeren, definieert u PRE_BUILD_COMMAND. Als u achteraf gebouwde opdrachten wilt uitvoeren, definieert u POST_BUILD_COMMAND.

In het volgende voorbeeld worden de twee variabelen voor een reeks opdrachten opgegeven, gescheiden door komma's.

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"

Zie Oryx-configuratie voor aanvullende omgevingsvariabelen om bouwautomatisering aan te passen.

Zie de Oryx-documentatie voor meer informatie over hoe App Service PHP-apps uitvoert en bouwt in Linux: Hoe PHP-apps worden gedetecteerd en gebouwd.

Opstarten aanpassen

Als u wilt, kunt u een aangepaste opdracht uitvoeren tijdens het opstarten van de container door de volgende opdracht uit te voeren in Cloud Shell:

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

Toegang tot omgevingsvariabelen

In App Service kunt u app-instellingen configureren buiten uw app-code. Vervolgens kunt u ze openen met behulp van het standaard getenv() -patroon. Voor toegang tot bijvoorbeeld de app-instelling DB_HOST gebruikt u de volgende code:

getenv("DB_HOST")

Hoofdmap van site wijzigen

Het webframework van uw keuze kan een submap gebruiken als de hoofdmap van de site. Laravel gebruikt bijvoorbeeld de openbare/submap als de hoofdmap van de site.

Als u de hoofdmap van de site wilt aanpassen, stelt u het pad voor de virtuele toepassing voor de app in met behulp van de az resource update opdracht. In het volgende voorbeeld wordt de hoofdmap van de site ingesteld op de openbare/ submap in uw opslagplaats.

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 wijst standaard het hoofdpad voor de virtuele toepassing (/) toe aan de hoofdmap van de geïmplementeerde toepassingsbestanden (sites\wwwroot).

Het webframework van uw keuze kan een submap gebruiken als de hoofdmap van de site. Laravel gebruikt bijvoorbeeld de public/ submap als de hoofdmap van de site.

De standaard-PHP-installatiekopieën voor App Service maken gebruik van Nginx en u wijzigt de hoofdmap van de site door de Nginx-server te configureren met de root instructie. Dit voorbeeldconfiguratiebestand bevat de volgende codefragmenten waarmee de root instructie wordt gewijzigd:

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
    }
    ...

De standaardcontainer maakt gebruik van het configuratiebestand dat is gevonden op /etc/nginx/sites-available/default. Houd er rekening mee dat alle wijzigingen die u in dit bestand aanbrengt, worden gewist wanneer de app opnieuw wordt gestart. Als u een wijziging wilt aanbrengen die van kracht is bij het opnieuw opstarten van apps, voegt u een aangepaste opstartopdracht toe, zoals in dit voorbeeld:

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

Met deze opdracht wordt het standaardconfiguratiebestand Nginx vervangen door een bestand met de naam standaard in de hoofdmap van de opslagplaats en wordt Nginx opnieuw gestart.

HTTPS-sessie detecteren

In App Service vindt TLS/SSL-beëindiging plaats bij de netwerktaakverdelers, zodat alle HTTPS-aanvragen uw app bereiken als niet-versleutelde HTTP-aanvragen. Inspecteer de header X-Forwarded-Proto als de app-logica moet controleren of de aanvragen van gebruikers al dan niet zijn versleuteld.

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

Populaire webframeworks bieden toegang tot de X-Forwarded-*-informatie in het patroon van de standaard-app. In CodeIgniter wordt met is_https() standaard de waarde van X_FORWARDED_PROTO gecontroleerd.

Php.ini-instellingen aanpassen

Als u wijzigingen wilt aanbrengen in uw PHP-installatie, kunt u een van de php.ini-instructies wijzigen door deze stappen te volgen.

Notitie

De beste manier om de PHP-versie en de huidige php.ini-configuratie te zien, is door phpinfo() aan te roepen in uw app.

Richtlijnen voor niet-PHP_INI_SYSTEM aanpassen

Als u PHP_INI_USER, PHP_INI_PERDIR en PHP_INI_ALL instructies (zie php.ini-instructies) wilt aanpassen, voegt u een .user.ini bestand toe aan de hoofdmap van uw app.

Voeg configuratie-instellingen toe aan het .user.ini bestand met dezelfde syntaxis die u in een php.ini bestand zou gebruiken. Als u bijvoorbeeld de display_errors instelling wilt inschakelen en de instelling wilt instellen upload_max_filesize op 10M, bevat het .user.ini bestand deze tekst:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

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

Implementeer uw app opnieuw met de wijzigingen en start deze opnieuw.

Als alternatief voor het gebruik van een .user.ini bestand kunt u ini_set() in uw app gebruiken om deze niet-PHP_INI_SYSTEM instructies aan te passen.

Als u PHP_INI_USER, PHP_INI_PERDIR en PHP_INI_ALL instructies voor Linux-web-apps, zoals upload_max_filesize en expose_php, wilt aanpassen, gebruikt u een aangepast ini-bestand. U kunt deze maken in een SSH-sessie.

  1. Ga naar uw KUDU-site https://< sitename.scm.azurewebsites.net>.
  2. Selecteer Bash of SSH in het bovenste menu.
  3. Ga in Bash/SSH naar uw map '/home/site/wwwroot'.
  4. Maak een map met de naam 'ini' (bijvoorbeeld mkdir ini).
  5. Wijzig de huidige werkmap in de map 'ini' die u zojuist hebt gemaakt.

U moet een 'ini'-bestand maken om uw instellingen toe te voegen. In dit voorbeeld gebruiken we extensions.ini. Er zijn geen bestandseditors zoals Vi, Vim of Nano, dus u gebruikt echo om de instellingen aan het bestand toe te voegen. Wijzig de 'upload_max_filesize' van 2M in 50M. Gebruik de volgende opdracht om de instelling toe te voegen en een bestand extensions.ini te maken als deze nog niet bestaat.

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

Ga vervolgens naar Azure Portal en voeg een toepassingsinstelling toe om de map 'ini' te scannen die u zojuist hebt gemaakt om de wijziging voor upload_max_filesize toe te passen.

  1. Ga naar Azure Portal en selecteer uw App Service Linux PHP-toepassing.
  2. Selecteer Toepassing Instellingen voor de app.
  3. Selecteer in de sectie Toepassingsinstellingen de optie + Nieuwe instelling toevoegen.
  4. Voer voor de naam van de app-instelling 'PHP_INI_SCAN_DIR' in en voer voor waarde '/home/site/wwwroot/ini' in.
  5. Selecteer de knop Opslaan.

Notitie

Als u een PHP-extensie, zoals GD, opnieuw hebt gecompileerd, volgt u de stappen bij Php-extensies opnieuw compileren bij Azure-app Service - PHP-extensies toevoegen

Richtlijnen voor PHP_INI_SYSTEM aanpassen

Gebruik de PHP_INI_SCAN_DIR app-instelling om PHP_INI_SYSTEM richtlijnen aan te passen (zie php.ini-instructies).

Voer eerst de volgende opdracht uit in Cloud Shell om een app-instelling toe te voegen met de naam 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"

Navigeer naar de Kudu-console (https://<app-name>.scm.azurewebsites.net/DebugConsole) en navigeer naar d:\home\site.

Maak een map met d:\home\site de naam inien maak vervolgens een INI-bestand in de d:\home\site\ini map (bijvoorbeeld settings.ini) met de instructies die u wilt aanpassen. Gebruik dezelfde syntaxis die u zou gebruiken in een php.ini-bestand .

Als u bijvoorbeeld de waarde van expose_php wilt wijzigen, voert u de volgende opdrachten uit:

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

Start de app opnieuw om de wijzigingen door te voeren.

Als u PHP_INI_SYSTEM instructies wilt aanpassen (zie php.ini-instructies), kunt u de .htaccess-benadering niet gebruiken. App Service biedt een afzonderlijk mechanisme met behulp van de PHP_INI_SCAN_DIR app-instelling.

Voer eerst de volgende opdracht uit in Cloud Shell om een app-instelling toe te voegen met de naam 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 is de standaardmap waarin php.ini bestaat. /home/site/ini is de aangepaste map waarin u een aangepast .ini-bestand toevoegt. U scheidt de waarden met een :.

Navigeer naar de web-SSH-sessie met uw Linux-container (https://<app-name>.scm.azurewebsites.net/webssh/host).

Maak een map met /home/site de naam inien maak vervolgens een INI-bestand in de /home/site/ini map (bijvoorbeeld settings.ini) met de instructies die u wilt aanpassen. Gebruik dezelfde syntaxis die u zou gebruiken in een php.ini-bestand .

Tip

In de ingebouwde Linux-containers in App Service wordt /home gebruikt als permanente gedeelde opslag.

Als u bijvoorbeeld de waarde van expose_php wilt wijzigen, voert u de volgende opdrachten uit:

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

Start de app opnieuw om de wijzigingen door te voeren.

PHP-extensies inschakelen

De ingebouwde PHP-installaties bevatten de meest gebruikte extensies. U kunt extra extensies op dezelfde manier inschakelen als u php.ini-instructies aanpast.

Notitie

De beste manier om de PHP-versie en de huidige php.ini-configuratie te zien, is door phpinfo() aan te roepen in uw app.

Ga als volgt te werk om extra extensies in te schakelen:

Voeg een bin map toe aan de hoofdmap van uw app en plaats de .dll extensiebestanden erin (bijvoorbeeld mongodb.dll). Zorg ervoor dat de extensies compatibel zijn met de PHP-versie in Azure en vc9 en niet-thread-safe (nts) compatibel zijn.

Implementeer uw wijzigingen.

Volg de stappen in Instructies aanpassen PHP_INI_SYSTEM, voeg de extensies toe aan het aangepaste .ini-bestand met de extensie of zend_extension instructies.

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

Start de app opnieuw om de wijzigingen door te voeren.

De ingebouwde PHP-installaties bevatten de meest gebruikte extensies. U kunt extra extensies op dezelfde manier inschakelen als u php.ini-instructies aanpast.

Notitie

De beste manier om de PHP-versie en de huidige php.ini-configuratie te zien, is door phpinfo() aan te roepen in uw app.

Ga als volgt te werk om extra extensies in te schakelen:

Voeg een bin map toe aan de hoofdmap van uw app en plaats de .so extensiebestanden erin (bijvoorbeeld mongodb.so). Zorg ervoor dat de extensies compatibel zijn met de PHP-versie in Azure en vc9 en niet-thread-safe (nts) compatibel zijn.

Implementeer uw wijzigingen.

Volg de stappen in Instructies aanpassen PHP_INI_SYSTEM, voeg de extensies toe aan het aangepaste .ini-bestand met de extensie of zend_extension instructies.

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

Start de app opnieuw om de wijzigingen door te voeren.

Toegang tot diagnostische logboeken

Gebruik het standaardhulpprogramma error_log() om uw diagnostische logboeken weer te geven in Azure-app Service.

Als u toegang wilt tot de consolelogboeken die worden gegenereerd binnen uw toepassingscode in de App Service, schakelt u diagnostische logboekregistratie in door de volgende opdracht in de Cloud Shell uit te voeren:

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

Mogelijk waarden voor --level zijn: Error, Warning, Info en Verbose. Elk hoger niveau omvat het vorige niveau. Bijvoorbeeld: Error omvat alleen foutberichten en Verbose omvat alle berichten.

Nadat diagnostische logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:

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

Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.

Notitie

U kunt ook de logboekbestanden van de browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker.

U kunt op elk gewenst moment Ctrl+C typen om te stoppen met logboekstreaming.

U hebt vanuit de container toegang tot de consolelogboeken.

Schakel eerst logboekregistratie voor containers in door de volgende opdracht uit te voeren:

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

Vervang <app-name> en <resource-group-name> door de namen die van toepassing zijn op uw web-app.

Zodra logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:

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

Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.

U kunt op elk gewenst moment stoppen met logboekstreaming door Ctrl+C te typen.

U kunt ook de logboekbestanden in een browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Problemen oplossen

Wanneer een werkende PHP-app zich anders gedraagt in App Service of fouten bevat, probeert u het volgende:

  • Open de logboekstream.
  • Test de app lokaal in de productiemodus. App Service voert uw app uit in de productiemodus, dus u moet ervoor zorgen dat uw project werkt zoals verwacht in de productiemodus lokaal. Bijvoorbeeld:
    • Afhankelijk van uw composer.json kunnen verschillende pakketten worden geïnstalleerd voor de productiemodus (require vs. require-dev).
    • Bepaalde webframeworks kunnen statische bestanden anders implementeren in de productiemodus.
    • Bepaalde webframeworks kunnen aangepaste opstartscripts gebruiken wanneer ze worden uitgevoerd in de productiemodus.
  • Voer uw app uit in App Service in de foutopsporingsmodus. In Laravel kunt u uw app bijvoorbeeld configureren om foutopsporingsberichten in productie uit te voeren door de app-instelling APP_DEBUG in te stellen op true.

robots933456 in logboeken

U ziet mogelijk het volgende bericht in de containerlogboeken:

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

U kunt dit bericht veilig negeren. /robots933456.txt is een dummy-URL-pad dat App Service gebruikt om te controleren of de container aanvragen kan verwerken. Een 404-antwoord geeft alleen aan dat het pad niet bestaat, maar laat App Service wel weten dat de container in orde is en klaar is om te reageren op aanvragen.

Volgende stappen

Of zie aanvullende informatiebronnen:

Naslaginformatie over omgevingsvariabelen en app-instellingen