Articles

502 dårlig Port: PHP-FPM

tip / nginks /502 dårlig Port /php

Redaktørens note: php-fpm bruger udtrykket “master” til at beskrive dets primære proces. Datadog bruger ikke dette udtryk. I dette blogindlæg vil vi henvise til dette som” primært”, bortset fra for klarhedens skyld i tilfælde, hvor vi skal henvise til et specifikt procesnavn.

dette indlæg er en del af en serie om fejlfinding af fejl i NGINK 502. Hvis du ikke bruger PHP-FPM, skal du tjekke vores anden artikel om fejlfinding af 502S med Gunicorn som backend.

PHP-FastCGI Process Manager (PHP-FPM) er en dæmon til håndtering af internetserveranmodninger til PHP-applikationer. I produktionen er PHP-FPM ofte implementeret bag en netserver. Vi sender dem videre til PHP-FPM-arbejdsprocesser, der udfører PHP-applikationen.

et diagram viser strømmen af anmodninger fra bro.ser til PHP-FPM og tilbage.

NGINK vil returnere en 502 dårlig Portfejl, hvis den ikke kan erstatte en anmodning til PHP-FPM, eller hvis PHP-FPM ikke reagerer. I dette indlæg vil vi undersøge nogle almindelige årsager til 502 fejl i PHP-FPM stakken, og vi vil give vejledning om, hvor du kan finde oplysninger, der kan hjælpe dig med at løse disse fejl.

Udforsk metrics, logfiler og spor bag NGINK 502 dårlige Portfejl ved hjælp af Datadog.

nogle mulige årsager til 502S

i dette afsnit beskriver vi, hvordan følgende forhold kan få NGINKS til at returnere en 502-fejl:

  • PHP-FPM kører ikke
  • NGINKS kan ikke kommunikere med PHP-FPM
  • PHP-FPM er timing ud

Hvis det vil reagere med en 502-fejl og bemærke dette i sin adgangslog (/var/log/ngink/access.log) som vist i dette eksempel:

adgang.log

Kopier
127.0.0.1 - - "GET / HTTP/1.1" 502 182 "-" "curl/7.58.0"

NGINKS adgangslog forklarer ikke årsagen til en 502-fejl, men du kan se dens fejllog (/var/log/nginks/fejl.log) for at lære mere. For eksempel er her en tilsvarende post i fejlloggen, der viser, at årsagen til 502-fejlen er, at stikket ikke findes, muligvis fordi PHP-FPM ikke kører. (I det næste afsnit vil vi se på, hvordan du opdager og retter dette problem.)

fejl.log

Copy
2020/01/31 18:30:55 13617#13617: *557 connect() to unix:/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "localhost"

PHP-FPM kører ikke

Bemærk: dette afsnit indeholder et procesnavn, der bruger udtrykket “master.”Undtagen når der henvises til specifikke processer, bruger denne artikel udtrykket “primær” i stedet.

Hvis PHP-FPM ikke kører, returnerer NGINK en 502-fejl for enhver anmodning, der er beregnet til at nå PHP-applikationen. Hvis du ser 502s, skal du først kontrollere, at PHP-FPM kører. Bruge enps kommando som denne til at lede efter kørende PHP-FPM-processer:

kopi
sudo ps aux | grep 'php'

PHP-FPM organiserer sine arbejdsprocesser i grupper kaldet puljer. Prøveudgangen nedenfor viser, at PHP-FPM primære proces kører, ligesom to arbejdsprocesser i standardpuljen (navngivet www):

Kopier
root 29852 0.0 2.2 435484 22396 ? Ssl 16:27 0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)www-data 29873 0.0 1.5 438112 15220 ? Sl 16:27 0:00 php-fpm: pool wwwwww-data 29874 0.0 1.6 438112 16976 ? Sl 16:27 0:00 php-fpm: pool www

hvis output fraps kommandoen viser ikke nogen PHP-FPM primære eller poolprocesser, skal du få PHP-FPM kørende for at løse de 502 fejl.

i et produktionsmiljø bør du overveje at bruge systemd til at køre PHP-FPM som en tjeneste. Dette kan gøre din PHP-applikation mere pålidelig og skalerbar, da PHP-FPM-dæmonen automatisk begynder at betjene din PHP-app, når din server starter, eller når en ny forekomst lanceres. PHP-FPM er inkluderet i PHP-kildekoden, så du kan tilføje PHP-FPM som en systemd-tjeneste, når du konfigurerer PHP.

når dit PHP-FPM-projekt er konfigureret som en tjeneste, kan du bruge følgende kommando til at sikre, at det starter automatisk, når din server starter:

Kopier

så kan du bruge list-unit-files kommando for at se oplysninger om din tjeneste:

kopier
sudo systemctl list-unit-files | grep -E 'php*fpm'

på en PHP 7.2 server, der har PHP-FPM installeret (selvom den ikke kører), vil udgangen af denne kommando være:

php7.2-fpm.service enabled

for at se oplysninger om din PHP-FPM-tjeneste skal du bruge denne kommando:

Kopier
sudo systemctl is-active php7.2-fpm.service

denne kommando skal returnere en output af active. Hvis det ikke gør det, kan du starte tjenesten med:

Kopier
sudo service php7.2-fpm start

NGINK kan ikke få adgang til stikket

når PHP-FPM starter, opretter den en eller flere TCP-eller Unikkontakter til at kommunikere med NGINK-internetserveren. PHP-FPM ‘ s arbejdsprocesser bruger disse stik til at lytte efter anmodninger fra .

for at afgøre, om en 502-fejl skyldes en forkert konfiguration af stikket, skal du bekræfte, at PHP-FPM og NGINKS er konfigureret til at bruge den samme stikkontakt. PHP-FPM bruger en separat konfigurationsfil for hver arbejdstager proces pulje; disse filer er placeret på /etc/php/7.2/fpm/pool.g/. Hver pool socket er defineret i etlisten direktiv i poolens konfigurationsfil. For eksempel konfigurerer listen direktivet nedenfor en pulje med navnet mypool for at bruge en unik stikkontakt placeret på /run/php/mypool.sok:

mypool.Conf

Copy
listen = /run/php/mypool.sock

Hvis NGINK ikke kan få adgang til stikket til en bestemt pulje, kan du bestemme, hvilken arbejdstager pulje er involveret i problemet ved at kontrollere, hvilken sokkel er navngivet i NGINK fejl log post. For eksempel, hvis PHP-FPM ikke havde startet mypool arbejderpool, ville NGINKS returnere en 502, og dens fejllogindtastning ville omfatte:

fejl.log

Kopier
connect() to unix:/run/php/mypool.sock failed (2: No such file or directory)

Tjek din nginks.conf-fil for at sikre, at den relevante location blok angiver det samme stik. Eksemplet nedenfor indeholder etinclude direktiv, der indlæser nogle generelle konfigurationsoplysninger for PHP-FPM, og etfastcgi_pass direktiv, der angiver det samme unikke stik, der er navngivet i mypool.conf fil, ovenfor.

ngink.conf

Copy
location / { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/mypool.sock;}

unike sockets er underlagt unike filsystem tilladelser. PHP-FPM-poolens konfigurationsfil angiver tilstanden og ejerskabet af stikket, som vist her:

.conf

Kopier
listen.owner = www-datalisten.group = www-datalisten.mode = 0660

sørg for, at disse tilladelser giver brugeren og gruppen, der kører NGINK, adgang til stikket. Hvis tilladelserne på soklen er forkerte, logger NGINK en 502-fejl i adgangsloggen og en meddelelse som den, der er vist nedenfor i fejlloggen:

fejl.log

Copy
2020/02/20 17:12:03 3059#3059: *4 connect() to unix:/run/php/mypool.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

Bemærk, at standardværdierne forlisten.owneroglisten.groupmatcher standardejeren, og at standardværdierne forlisten.owner gruppen kører nginksog listen.mode som standard 0660. Ved hjælp af disse standardindstillinger skal NGINK være i stand til at få adgang til stikket.

Hvis PHP-FPM lytter på et TCP-stik, vil pool conifguration ‘ s listen direktivet have en værdi i form af address:port, som vist nedenfor:

.conf

Kopier
listen = 127.0.0.1:9000

ligesom med et enkelt stik kan du forhindre 502 fejl ved at bekræfte, at placeringen af dette stik svarer til den, der er angivet i NGINKS konfiguration.

PHP-FPM er timing ud

Hvis din ansøgning tager for lang tid at reagere, vil dine brugere opleve en timeout fejl. Hvis PHP-FPM ‘ s timeout-som er angivet i poolkonfigurationensrequest_terminate_timeout direktiv (og som standard er 20 sekunder)—er mindre end NGINKS timeout (som standard er 60 sekunder), svarer NGINKS med en 502-fejl. Fejlloggen vist nedenfor angiver, at dens opstrømsproces—som er PHP-FPM—lukkede forbindelsen, før der blev sendt et gyldigt svar. Med andre ord er dette den fejllog, vi ser, når PHP-FPM gange ud:

fejl.log

Kopier
2020/02/20 17:17:12 3059#3059: *29 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

i dette tilfælde PHP-FPM log (som som standard er placeret på/var/log / php7.2-FPM.log) viser en korreleret meddelelse, der giver yderligere information:

php7.2-fpm.log

Kopier
 WARNING: child 2120, script '/var/www/html/index.php' (request: "GET /index.php") execution timed out (25.755070 sec), terminating

Du kan hæve PHP-FPMS timeoutindstilling ved at redigere puljens konfigurationsfil, men dette kan medføre et andet problem: NGINK kan timeout, før du modtager et svar fra PHP-FPM. Standard timeout er 60 sekunder; hvis du har hævet din PHP-FPM-timeout over 60 sekunder, returnerer NGINK en 504 – timeout-fejl, hvis din PHP-applikation ikke har reageret i tide. Du kan forhindre dette ved også at hæve din timeout. I eksemplet nedenfor har vi hævet timeoutværdien til 90 sekunder ved at tilføje fastcgi_read_timeout elementet til http blok af /etc/nginks/nginks.conf:

ngink.conf

Kopier
http { ... fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_connect_timeout 90; fastcgi_send_timeout 90; fastcgi_read_timeout 90;}

genindlæs din konfiguration for at anvende denne ændring:

Kopier
nginx -s reload

for at bestemme, hvorfor PHP-FPM timeout, kan du indsamle logfiler og APM-data (application performance monitoring), der kan afsløre årsager til latens inden for og uden for din applikation.

indsamle og analysere dine logfiler

Hvis du vil foretage fejlfinding af applikationsfejl, kan du indsamle dine logfiler og sende dem til en logadministrationstjeneste. Ud over de logfiler, vi undersøgte ovenfor, kan PHP logge fejl og andre begivenheder, der kan være værdifulde for dig. Se vores PHP logging guide for mere information.

Når du bringer dine PHP-og NGINK-logfiler ind i en logadministrationstjeneste kombineret med logfiler fra relevante teknologier som caching-servere og databaser, kan du analysere logfiler fra hele din netstak på en enkelt platform.

en søjlediagram i Datadog Log Analytics visualiserer PHP og NGINK logs af forskellige statuser såsom fejl, advarsel og info.
Datadog Log Analytics viser logfiler fra flere tjenester, grupperet efter status.

Saml APM-data fra din internetstak

APM kan hjælpe dig med at identificere flaskehalse og løse problemer, som 502 fejl, der påvirker ydeevnen for din app. Skærmbilledet nedenfor viser APM data visualiseret i Datadog. Denne visning opsummerer anmodningsvolumen, fejlfrekvenser og latenstid for en tjeneste, der er baseret på , og hjælper dig med at undersøge ydeevneproblemer som f.eks. 502 fejl.

en visning af en NGINKS-tjeneste i Datadog APM inkluderer søjlediagrammer, der viser mængden af anmodninger og fejl, et histogram, der viser latensfordeling, og en linjediagram, der viser latensværdier over tid.

200 OK

jo hurtigere du kan diagnosticere og løse din applikations 502 fejl, jo bedre. Datadog giver dig mulighed for at analysere metrics, spor, logfiler og netværksydelsesdata fra hele din infrastruktur. Hvis du allerede er en Datadog-kunde, kan du begynde at overvåge NGINK, PHP-FPM og mere end 400 andre teknologier. Hvis du endnu ikke har en Datadog-konto, skal du tilmelde dig en 14-dages gratis prøveperiode og komme i gang på få minutter.