NGINX 502 Bad Gateway: PHP-FPM
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.
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
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
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:
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
):
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ä:
sudo systemctl enable php7.2-fpm.service
voit käyttää list-unit-files
komento, jolla näet tietoja palvelustasi:
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:
php7.2-fpm.service enabled
Jos haluat nähdä tiedot PHP-FPM-palvelustasi, käytä tätä komentoa:
sudo systemctl is-active php7.2-fpm.service
tämän komennon pitäisi palauttaa tuloste active
. Jos ei, voit aloittaa palvelun:
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
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
connect() to unix:/run/php/mypool.sock failed (2: No such file or directory)
Tarkista nginx.conf-tiedosto, jolla varmistetaan, että asianomainenlocation
lohko määrittää saman socket. Alla olevassa esimerkissä oninclude
direktiivi, joka lataa PHP-FPM: n yleisiä asetustietoja, jafastcgi_pass
direktiivi, joka määrittää saman Unix-socket: n nimeltä mypool.conf-tiedosto, yllä.
nginx.conf
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
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
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.owner
jalisten.group
vastaavat 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
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
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
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
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:
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.
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ä.
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.
Leave a Reply