502 dårlig Port: PHP-FPM
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.
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
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
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:
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
):
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:
så kan du bruge list-unit-files
kommando for at se oplysninger om din tjeneste:
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:
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:
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
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
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
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
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
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.owner
oglisten.group
matcher 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
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
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
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
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:
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.
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å
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.
Leave a Reply