Hvordan koble NGINX til PHP-FPM ved hjelp av UNIX eller TCP/IP-socket


NGINX nettserver (som omvendt proxy) betjener PHP-applikasjoner gjennom FastCGI-protokollen (som en backend-applikasjonsserver). NGINX bruker PHP-FPM (FastCGI Process Manager), en alternativ PHP FastCGI-implementering som kjører i bakgrunnen som en demon og lytter etter CGI-forespørsler. Den kommer med ekstra funksjoner designet for å drive tungt belastede nettsteder eller nettapplikasjoner, men den kan brukes for nettsteder av alle størrelser.

Ikke bare støtter PHP-FPM konfigurasjonen av FastCGI-ressurspooler, men det forbedrer også mange av FastCGI-internene og øker feilrapportering, skript oppsigelse og mye mer. Den har PHP-demonisering, prosessadministrasjon, et dynamisk antall prosesser som forespørsler kan komme fra, feiloverskrift, støtte for akselerert opplasting og mer.

For å godta FastCGI-forespørsler fra NGINX, kan PHP-FPM enten lytte på en TCP/IP-socket eller UNIX-domene stikkontakt. Uansett hvilken adresse du velger å bruke er det NGINX bruker for å koble (proxy-forespørsler) til PHP-FPM ved å bruke fastcgi_pass-direktivet.

Denne veiledningen forklarer hvordan du konfigurerer NGINX til server PHP-applikasjoner ved hjelp av PHP-FPM. Den beskriver når du skal bruke en TCP/IP-socket eller UNIX-domenekontakt for å koble NGINX til PHP-FPM og hvorfor.

Denne veiledningen forutsetter at du har NGINX og PHP-FPM installert på Linux-systemet ditt, ellers kan du se:

  • Hvordan installere LEMP Server på CentOS 8
  • Hvordan installere LEMP stack PhpMyAdmin i Ubuntu 20.04 Server
  • Hvordan installere NGINX, MySQL/MariaDB og PHP på RHEL 8
  • Hvordan installere LEMP på Debian 10 Server

Hva bør jeg bruke: UNIX Domain Socket eller TCP/IP Socket?

UNIX domene (eller IPC) sockets er et middel for interprosesskommunikasjon (IPC) som tillater effektiv datautveksling mellom prosesser som kjører på samme operativsystem mens TCP /IP (eller Internettdomene)-sockets tillater prosesser å kommunisere over et nettverk.

I motsetning til en TCP/IP-socket som identifiserer en server med en IP-adresse og port (f.eks. 127.0.0.1:9000), kan du binde en server til en UNIX-domenekontakt ved å bruke et filbanenavn (f.eks. /run/php-fpm/www.sock), som er synlig i filsystemet.

En UNIX-domene-socket er en spesiell type fil - fil- og katalogtillatelser gjelder for den (som tilfellet er med alle andre typer UNIX-filer) og kan brukes til å begrense hvilke prosesser på verten som kan lese og skrive til filen, (og dermed kommunisere med backend-serveren).

På denne måten er en UNIX-domene-socket sikker fordi bare prosesser på den lokale verten kan bruke den. En TCP/IP-socket kan bli utsatt for internett som utgjør en sikkerhetsrisiko med mindre ekstra sikkerhetstiltak som en brannmur er implementert.

Viktigere, å bruke en UNIX-domene-socket er ikke det samme som å bruke en TCP/IP-socket angående ytelse, flere tester og benchmarks har vist at UNIX-domene-sockets er raskere. Den største ulempen med UNIX domene sockets er at de er mindre skalerbare, de støtter bare kommunikasjon mellom prosesser innenfor samme operativsystem (OS).

Hvor kan jeg konfigurere PHP-FPM-lytteadresse?

Du kan konfigurere adressen PHP-FPM lytter til i en konfigurasjonsfil for ressursutvalg. Vær oppmerksom på at med PHP-FPM kan du kjøre flere grupper av prosesser med forskjellige innstillinger. Standardpoolen heter www.

Plasseringen av konfigurasjonsfilen for ressurspoolen avhenger av måten PHP og PHP-FPM er installert på et Linux-system (enten det er en standard/enkeltversjon eller flere versjoner samtidig) .

For eksempel, på CentOS 8, med én enkelt versjon, er alle PHP-konfigurasjonsfiler plassert i /etc-katalogen og standard PHP-FPM pool (www) konfigurasjonsfilen er /etc/php-fpm.d/www.conf:

For å liste opp alle PHP-konfigurasjonsfiler, bruk følgende ls-kommando.

ls /etc/php*

Ubuntu 20.04 er PHP-konfigurasjonsfilene plassert i /etc/php//-katalogen og standard PHP-FPM > pool (www) konfigurasjonsfilen er /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Konfigurere PHP-FPM til å lytte på en UNIX-domenekontakt

For å konfigurere PHP-FPM til å lytte på en UNIX-domenekontakt, åpne standard konfigurasjonsfilen for PHP-FPM pool ved å bruke din favoritttekstredigerer.

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

Se deretter etter lyttedirektivet og sett det til filbanenavnet til UNIX-domenekontakten som følger. Merk at de fleste installasjoner bruker en UNIX-domenekontakt som standard.

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Hvis du bruker en UNIX-domenekontakt, må du også angi passende lese-/skrivetillatelser for filen for å tillate tilkoblinger fra NGINX-nettserveren. Som standard kjører NGINX som bruker og gruppe nginxCentOS/RHEL/Fedora og www-dataUbuntu og Debian.

Så finn parameterne listen.owner og listen.group og sett dem deretter. Sett også modusen til 0660 ved å bruke parameteren listen.mode.

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Merk at hvis tillatelsene på UNIX-domene-socket-filen ikke er riktig angitt, kan NGINX returnere en dårlig gateway-feil.

Konfigurere PHP-FPM til å lytte på en TCP/IP-kontakt

Selv om en UNIX-domenekontakt er raskere enn en TCP/IP-kontakt, er førstnevnte mindre skalerbar, fordi den bare kan støtte kommunikasjon mellom prosesser på samme operativsystem. Hvis NGINX og backend-applikasjonstjeneren (PHP-FPM) kjører på forskjellige systemer, må du konfigurere PHP-FPM for å lytte på en TCP/IP-kontakt for tilkoblinger.

Angi lytte-adressen som følger i PHP-FPM-konfigurasjonsfilen for bassenget. Sørg for at porten du har valgt ikke brukes av en annen prosess eller tjeneste på samme system.

listen = 127.0.0.1:3000

Konfigurere NGINX til å fungere med PHP-FPM Application Server

Når du har konfigurert adressen PHP-FPM lytter på, må du konfigurere NGINX til å sende proxy-forespørsel til den via den adressen, ved å bruke fastcgi_pass konfigurasjonsparameter, i en konfigurasjonsfil for virtuell serverblokk.

Hvis for eksempel konfigurasjonsfilen for nettstedet ditt er /etc/nginx/conf.d/example.com.conf, åpner du den for redigering.

vim /etc/nginx/conf.d/example.com.conf 

Se etter location-blokken for behandling av .php-filer og still inn fastcgi_pass-parameteren som følger, hvis du konfigurerte PHP-FPM til å lytte på en UNIX domenekontakt.

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Eller bruk en TCP/IP-adresse hvis du konfigurerte PHP-FPM til å lytte på en TCP/IP-kontakt. Hvis backend-applikasjonsserveren (PHP-FPM) kjører på en separat server (erstatt 10.42.0.10 med IP-adressen til maskinen som PHP-FPM FastCGI-serveren på løper).

fastcgi_pass  10.42.0.10:3000;

Viktig: På CentOS 8 er PHP-FPM definert som en oppstrømsserver i / etc/nginx/conf.d/php-fpm.conf-fil, innenfor en oppstrømsblokk, med navnet php-fpm.

Du kan gjøre endringer her tilsvarende avhengig av adressen PHP-FPM er konfigurert til å lytte på, i bassengkonfigurasjonsfilen. Standardkonfigurasjonen peker til en UNIX-domenekontakt.

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

og i nettstedets serverblokkfil, still inn parameteren fastcgi_pass som vist.

fastcgi_pass php-fpm;

Etter å ha gjort endringer i PHP-FPM- og NGINX-konfigurasjonene, kontroller konfigurasjonssyntaksen deres for korrekthet som følger.

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

Mens kommandoutgangen kun viser hovedkonfigurasjonsfilen, er alle de andre konfigurasjonsfilene inkludert og sjekket også.

Deretter må du starte de to tjenestene på nytt for å bruke endringene ved å bruke systemctl-kommandoen.

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

Hvis du får noen feil, kan du sjekke NGINX- og PHP-FPM-loggfilene ved å bruke cat-kommandoen.

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

Det er alt vi hadde for deg. Kommentarseksjonen nedenfor kan brukes til å stille spørsmål. For mer informasjon, se NGINX-dokumentasjonen og PHP-FPM-dokumentasjonen.