Articles

NGINX 502 Bad Gateway: PHP-FPM

tip / nginx /502 bad gateway /php

Editorin huomautus: php-fpm käyttää primääriprosessistaan termiä ”master”. Datadog ei käytä tätä termiä. Tässä blogikirjoitus, viittaamme tähän ”ensisijainen,” paitsi selkeyden vuoksi tapauksissa, joissa meidän on viitattava tietyn prosessin nimi.

tämä viesti on osa sarjaa nginx 502 Bad Gateway-virheiden vianmäärityksestä. Jos et käytä PHP-FPM: ää, tutustu toiseen artikkeliimme nginx 502s: n vianmäärityksestä gunicornin taustajärjestelmänä.

PHP-FastCGI Process Manager (PHP-FPM) on palvelinpyyntöjen käsittelyyn tarkoitettu demoni PHP-sovelluksille. Tuotannossa PHP-FPM otetaan usein käyttöön nginx-verkkopalvelimen takana. NGINX välittää verkkopyynnöt ja välittää ne PHP-FPM-työprosesseihin, jotka suorittavat PHP-sovelluksen.

kaavio näyttää pyyntöjen virran selaimesta NGINXILLE PHP-FPM: ään ja takaisin.

NGINX palauttaa 502 pahan Porttivirheen, jos se ei pysty proxy pyyntöä PHP-FPM, tai jos PHP-FPM ei vastaa. Tässä viestissä, tarkastelemme joitakin yleisiä syitä 502 virheitä nginx / PHP-FPM pino, ja annamme ohjeita, mistä löydät tietoa, joka voi auttaa sinua ratkaisemaan nämä virheet.

tutki Datadogin avulla nginx 502: n pahojen Porttivirheiden takana olevia mittareita, lokeja ja jälkiä.

joitakin mahdollisia 502s: n syitä

tässä osiossa kuvataan, miten seuraavat olosuhteet voivat aiheuttaa nginxille 502-virheen palauttamisen:

  • PHP-FPM ei ole käynnissä
  • nginx ei voi kommunikoida PHP-FPM: n kanssa
  • PHP-FPM on ajoitettu pois

Jos NGINX ei pysty jos haluat kommunikoida PHP-FPM: n kanssa mistä tahansa näistä syistä, se vastaa 502 virheellä ja toteaa tämän käyttöoikeuslokissaan (/var/log/nginx/access).log) kuten tässä esimerkissä:

access.loki

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

Nginxin käyttöloki ei selitä 502 virheen syytä, mutta voit tutustua sen virhelokiin (/var/log / nginx / error.log) oppia lisää. Esimerkiksi tässä on vastaava merkintä NGINX-virhelokissa, joka osoittaa, että 502-virheen syy on se, että pistorasiaa ei ole olemassa, mahdollisesti siksi, että PHP-FPM ei ole käynnissä. (Seuraavassa jaksossa, tarkastelemme, miten havaita ja korjata tämä ongelma.)

virhe.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 ei ole käynnissä

Huom: Tämä osio sisältää prosessin nimen, joka käyttää termiä ”master.”Paitsi kun viitataan tiettyihin prosesseihin, tässä artikkelissa käytetään sen sijaan termiä ”ensisijainen”.

Jos PHP-FPM ei ole käynnissä, NGINX palauttaa 502-virheen kaikista pyynnöistä, joiden tarkoituksena on päästä PHP-sovellukseen. Jos näet 502s: n, tarkista ensin, että PHP-FPM on käynnissä. Esimerkiksi Linux-isännällä voi käyttää ps tämänkaltaista komentoa etsimään käynnissä olevia PHP-FPM-prosesseja:

Copy
sudo ps aux | grep 'php'

PHP-FPM järjestää työprosessinsa ryhmiksi nimeltään pools. Alla oleva otostulos osoittaa, että PHP-FPM-primääriprosessi on käynnissä, samoin kuin kaksi oletuspoolissa olevaa työprosessia (nimeltään www):

Kopioi
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

Josps komento ei näytä yhtään PHP-FPM: n primääri-tai pooliprosessia, sinun on saatava PHP-FPM käyntiin ratkaistaksesi 502 virhettä.

tuotantoympäristössä kannattaa harkita systemd: n käyttämistä PHP-FPM: n ajamiseen palveluna. Tämä voi tehdä PHP-sovelluksesta luotettavamman ja skaalautuvamman, sillä PHP-FPM-taustaprosessi alkaa automaattisesti palvella PHP-sovellusta, kun palvelin käynnistyy tai kun uusi instanssi käynnistyy. PHP-FPM sisältyy PHP: n lähdekoodiin, joten voit lisätä PHP-FPM: n systemd-palveluna, kun määrität PHP: n.

kun PHP-FPM-projektisi on määritetty palveluksi, voit käyttää seuraavaa komentoa varmistaaksesi, että se käynnistyy automaattisesti palvelimesi käynnistyessä:

Kopioi
sudo systemctl enable php7.2-fpm.service

voit käyttää list-unit-files komento, jolla näet tietoja palvelustasi:

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

PHP: llä 7.2 palvelin, johon on asennettu PHP-FPM (vaikka se ei olisikaan käynnissä), tämän komennon tuloste on:

Kopioi
php7.2-fpm.service enabled

Jos haluat nähdä tiedot PHP-FPM-palvelustasi, käytä tätä komentoa:

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

tämän komennon pitäisi palauttaa tuloste active. Jos ei, voit aloittaa palvelun:

Kopioi
sudo service php7.2-fpm start

nginx ei voi käyttää pistorasiaa

kun PHP-FPM käynnistyy, se luo yhden tai useamman TCP-tai Unix-pistorasian kommunikoidakseen nginx-verkkopalvelimen kanssa. PHP-FPM: n työprosessit käyttävät näitä pistorasioita Nginxin pyyntöjen kuunteluun.

selvittääksesi, johtuiko 502-virhe pistorasian virheellisestä määrityksestä, vahvista, että PHP-FPM ja NGINX on määritetty käyttämään samaa pistorasiaa. PHP-FPM käyttää erillistä asetustiedostoa jokaiselle työprosessipoolille; nämä tiedostot sijaitsevat osoitteessa / etc/php/7.2/fpm / pool.D/. Kunkin poolin socket on määritelty listen direktiivissä poolin asetustiedostossa. Esimerkiksi listen alla oleva direktiivi määrittää mypool – nimisen poolin käyttämään /run/php/mypoolissa sijaitsevaa Unix-liitäntää.sukka:

mypool.conf

Kopioi
listen = /run/php/mypool.sock

Jos nginx ei pääse käsiksi tietyn poolin pistorasiaan, voit määrittää, mikä työntekijäpooli on mukana asiassa tarkistamalla, mikä pistorasia on nimetty NGINX-virhelokimerkinnässä. Jos esimerkiksi PHP-FPM ei olisi käynnistänyt mypool työläispoolia, NGINX palauttaisi 502: n ja sen virhelokimerkintä sisältäisi:

virhe.log

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

Tarkista nginx.conf-tiedosto, jolla varmistetaan, että asianomainenlocationlohko määrittää saman socket. Alla olevassa esimerkissä onincludedirektiivi, joka lataa PHP-FPM: n yleisiä asetustietoja, jafastcgi_passdirektiivi, joka määrittää saman Unix-socket: n nimeltä mypool.conf-tiedosto, yllä.

nginx.conf

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

Unix-pistorasiat ovat Unix-tiedostojärjestelmän käyttöoikeuksien alaisia. PHP-FPM-poolin asetustiedosto määrittää socketin tilan ja omistuksen, kuten tästä näkyy:

www.conf

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

varmista, että nämä oikeudet sallivat nginxiä käyttävän käyttäjän ja ryhmän käyttää pistorasiaa. Jos pistorasian käyttöoikeudet ovat virheelliset, nginx kirjaa käyttöoikeuslokiinsa 502 virheen ja virhelokissa alla olevan kaltaisen viestin:

virhe.loki

Kopioi
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"

huomaa, ettälisten.ownerjalisten.groupvastaavat oletusomistajaa ja ryhmä käynnissä Nginx, jalisten.mode oletusarvo 0660. Käyttämällä näitä oletuksia, NGINX pitäisi pystyä käyttämään pistorasiaan.

Jos PHP-FPM kuuntelee TCP-pistokkeella, poolikonfiguraation listen direktiivin arvo on muodossa address:port, kuten alla on esitetty:

www.conf

Kopioi
listen = 127.0.0.1:9000

aivan kuten Unix-pistorasiassa, voit estää 502 virhettä vahvistamalla, että tämän pistorasian sijainti vastaa NGINX-asetuksissa määriteltyä.

PHP-FPM on aikalisä

Jos sovelluksen vastaaminen kestää liian kauan, käyttäjät kokevat aikakatkaisuvirheen. Jos PHP—FPM: n aikakatkaisu—joka on asetettu pool-kokoonpanon request_terminate_timeout direktiivi (ja oletusarvo 20 sekuntia) – on pienempi kuin Nginxin aikakatkaisu (joka oletusarvo on 60 sekuntia), NGINX vastaa 502 virheellä. Alla oleva nginx-virheloki osoittaa, että sen alkupään prosessi—joka on PHP-FPM—sulki yhteyden ennen kelvollisen vastauksen lähettämistä. Toisin sanoen, tämä on virhe loki näemme, kun PHP-FPM kertaa ulos:

virhe.log

Copy
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"

tässä tapauksessa PHP-FPM-loki (joka oletusarvoisesti sijaitsee osoitteessa / var / log / php7.2-fpm.log) osoittaa korreloivan viestin, josta saadaan lisätietoja:

php7.2-fpm.loki

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

voit nostaa PHP-FPM: n aikalisäasetusta muokkaamalla poolin asetustiedostoa, mutta tämä voi aiheuttaa toisen ongelman: NGINX voi aikalisää ennen kuin saa vastauksen PHP-FPM: ltä. Oletus nginx-aikakatkaisu on 60 sekuntia; jos olet nostanut PHP-FPM timeout yli 60 sekuntia, NGINX palauttaa 504 Gateway Timeout virhe, jos PHP sovellus ei ole vastannut ajoissa. Voit estää tämän myös nostamalla NGINX-aikalisää. Alla olevassa esimerkissä olemme nostaneet aikalisän arvoa 90 sekuntiin lisäämällä fastcgi_read_timeout kohteen http lohkon /etc/nginx/nginx.conf:

nginx.conf

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

Lataa nginx-asetuksesi uudelleen tämän muutoksen soveltamiseksi:

Kopioi
nginx -s reload

seuraavaksi voit selvittää, miksi PHP-FPM-aikakirja on poistettu, voit kerätä lokit ja sovelluksen suorituskyvyn seurannan (APM) tiedot, jotka voivat paljastaa viiveen syyt sovelluksessa ja sen ulkopuolella.

kerää ja analysoi lokit

hakuvirheiden vianmääritystä varten voit kerätä lokit ja lähettää ne lokinhallintapalveluun. Edellä tarkastelemiemme NGINX-lokien lisäksi PHP voi kirjata virheitä ja muita tapahtumia, jotka saattavat olla sinulle arvokkaita. Katso lisätietoja PHP kirjautuminen opas.

kun tuot PHP-ja NGINX-lokit lokinhallintapalveluun yhdistettynä asiaankuuluvien teknologioiden, kuten välimuistipalvelimien ja tietokantojen lokeihin, voit analysoida lokit koko web-pinosta yhdellä alustalla.

Datadogin log Analyticsin pylväsdiagrammi visualisoi PHP-ja NGINX-lokit eri tiloista, kuten virhe, varoitus ja info.
Datadogin Lokianalytiikka näyttää useiden palveluiden lokit ryhmiteltyinä tilan mukaan.

kerää APM-tiedot verkkopinostasi

APM voi auttaa sinua tunnistamaan pullonkauloja ja ratkaisemaan ongelmia, kuten 502 virhettä, jotka vaikuttavat sovelluksen suorituskykyyn. Alla oleva kuvakaappaus näyttää Nginxin APM-tiedot visualisoituna Datadogissa. Tämä näkymä sisältää yhteenvedon nginx-pohjaisen palvelun pyyntöjen määrästä, virheasteista ja latenssista ja auttaa sinua tutkimaan suorituskykyyn liittyviä ongelmia, kuten 502 virhettä.

datadogin APM: n nginx-palvelun näkymässä on viivakaavioita, jotka osoittavat pyyntöjen ja virheiden määrän, histogrammi, joka näyttää viivejakauman, ja viivakaavio, joka näyttää viivearvot ajan kuluessa.

200 OK

Mitä nopeammin voit diagnosoida ja ratkaista sovelluksen 502 virhettä, sen parempi. Datadogin avulla voit analysoida mittareita, jälkiä, lokeja ja verkon suorituskykyä koskevia tietoja eri puolilta infrastruktuuriasi. Jos olet jo Datadogin asiakas, voit aloittaa Nginxin, PHP-FPM: n ja yli 400 muun teknologian seurannan. Jos sinulla ei vielä ole Datadog-tiliä, rekisteröidy 14 päivän ilmaiskokeiluun ja aloita muutamassa minuutissa.