Kako spojiti NGINX na PHP-FPM koristeći UNIX ili TCP/IP utičnicu


NGINX web server (kao reverse proxy) opslužuje PHP aplikacije putem FastCGI protokola (kao backend server aplikacija). NGINX koristi PHP-FPM (FastCGI Process Manager), alternativnu PHP FastCGI implementaciju koja radi u pozadini kao demon, slušajući CGI zahtjevi. Dolazi s dodatnim funkcijama dizajniranim za pokretanje jako opterećenih web stranica ili web aplikacija, ali se može koristiti za web stranice bilo koje veličine.

Ne samo da PHP-FPM podržava konfiguraciju FastCGI skupova resursa, već također poboljšava mnoge interne elemente FastCGI i povećava izvještavanje o greškama, skriptu raskid, i još mnogo toga. Sadrži demonizaciju PHP-a, upravljanje procesima, dinamički broj procesa iz kojih mogu doći zahtjevi, zaglavlje greške, podršku za ubrzano otpremanje i još mnogo toga.

Da prihvati FastCGI zahtjeve od NGINX, PHP-FPM može slušati na TCP/IP utičnici ili UNIX domeni socket. Koju god adresu da odaberete, NGINX koristi za povezivanje (proxy zahtjeve) na PHP-FPM, koristeći fastcgi_pass direktivu.

Ovaj vodič objašnjava kako da konfigurišete NGINX za serverske PHP aplikacije koristeći PHP-FPM. Opisuje kada koristiti TCP/IP utičnicu ili UNIX domensku utičnicu za povezivanje NGINX na PHP-FPM i zašto.

Ovaj vodič pretpostavlja da imate NGINX i PHP-FPM instaliran na vašem Linux sistemu, u suprotnom pogledajte:

  • Kako instalirati LEMP server na CentOS 8
  • Kako instalirati LEMP stack PhpMyAdmin na Ubuntu 20.04 server
  • Kako instalirati NGINX, MySQL/MariaDB i PHP na RHEL 8
  • Kako instalirati LEMP na Debian 10 poslužitelj

Šta da koristim: UNIX domensku utičnicu ili TCP/IP utičnicu?

UNIX domene (ili IPC) utičnice su sredstvo međuprocesne komunikacije (IPC) koje omogućava efikasnu razmjenu podataka između procesa koji rade na istom operativnom sistemu dok TCP /IP (ili Internet domen) utičnice omogućavaju procesima da komuniciraju preko mreže.

Za razliku od TCP/IP utičnice koja identifikuje server putem IP adrese i porta (npr. 127.0.0.1:9000), možete povezati server sa utičnicom UNIX domene koristeći ime putanje datoteke (npr. /run/php-fpm/www.sock), koja je vidljiva u sistemu datoteka.

UNIX domenska utičnica je posebna vrsta datoteke – na nju se primjenjuju dozvole za datoteke i direktorije (kao što je slučaj sa bilo kojom drugom vrstom UNIX datoteke) i može se koristiti za ograničavanje procesa na hostu koji mogu čitati i pisati u datoteku, (i na taj način komuniciraju sa backend serverom).

Na ovaj način, UNIX domenska utičnica je sigurna jer je mogu koristiti samo procesi na lokalnom hostu. TCP/IP socket može biti izložen internetu i predstavlja sigurnosni rizik osim ako se ne implementiraju dodatne sigurnosne mjere kao što je zaštitni zid.

Važno je da korištenje UNIX domenske utičnice nije isto što i korištenje TCP/IP utičnice u pogledu performansi, nekoliko testova i mjerila je pokazalo da su utičnice UNIX domene brže. Glavni nedostatak UNIX domenskih soketa je to što su manje skalabilni, podržavaju samo međuprocesnu komunikaciju unutar istog operativnog sistema (OS).

Gdje mogu konfigurirati PHP-FPM adresu slušanja?

Možete konfigurirati adresu koju PHP-FPM sluša u konfiguracijskoj datoteci spremišta resursa. Imajte na umu da sa PHP-FPM možete pokrenuti nekoliko skupova procesa s različitim postavkama. Zadani bazen se zove www.

Lokacija konfiguracijske datoteke spremišta resursa ovisi o načinu na koji su PHP i PHP-FPM instalirani na Linux sistemu (bilo da je zadana/jedna verzija ili više verzija istovremeno) .

Na primjer, na CentOS 8, s jednom verzijom, sve PHP konfiguracijske datoteke se nalaze u /etc direktoriju i zadanom PHP-FPM pool (www) konfiguracijski fajl je /etc/php-fpm.d/www.conf:

Da navedete sve PHP konfiguracijske datoteke, koristite sljedeću naredbu ls.

ls /etc/php*

Na Ubuntu 20.04, PHP konfiguracijske datoteke se nalaze u /etc/php// direktoriju i zadanom PHP-FPMu > pool (www) konfiguracijski fajl je /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Konfiguriranje PHP-FPM-a za slušanje na UNIX domenskoj utičnici

Da konfigurišete PHP-FPM za slušanje na UNIX domenskoj utičnici, otvorite svoj podrazumevani PHP-FPM konfiguracioni fajl, koristeći svoj omiljeni uređivač teksta.

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

Zatim potražite direktivu slušanja i postavite je na ime putanje datoteke UNIX domenske utičnice na sljedeći način. Imajte na umu da većina instalacija koristi UNIX domensku utičnicu po defaultu.

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

Ako koristite UNIX domensku utičnicu, također morate postaviti odgovarajuće dozvole za čitanje/pisanje za datoteku, kako biste omogućili veze sa NGINX web servera. Podrazumevano, NGINX radi kao korisnik i grupa nginx na CentOS/RHEL/Fedora i www-data na Ubuntu i Debian.

Dakle, pronađite parametre listen.owner i listen.group i postavite ih u skladu s tim. Također, postavite način rada na 0660 koristeći parametar 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

Imajte na umu da ako dozvole za datoteku utičnice UNIX domene nisu ispravno postavljene, NGINX može vratiti grešku lošeg mrežnog prolaza.

Konfigurisanje PHP-FPM-a za slušanje na TCP/IP utičnici

Iako je utičnica UNIX domene brža od TCP/IP utičnice, prva je manje skalabilna, jer može podržati samo međuprocesnu komunikaciju na istom OS-u. Ako NGINX i pozadinski poslužitelj aplikacija (PHP-FPM) rade na različitim sistemima, morat ćete konfigurirati PHP-FPM za slušanje TCP/IP utičnicu za veze.

U PHP-FPM konfiguracijskom fajlu bazena, postavite adresu slušanja na sljedeći način. Uvjerite se da port koji ste odabrali ne koristi drugi proces ili usluga na istom sistemu.

listen = 127.0.0.1:3000

Konfigurisanje NGINX-a za rad sa PHP-FPM serverom aplikacija

Nakon što ste konfigurirali adresu koju PHP-FPM sluša, trebate konfigurirati NGINX za proxy zahtjev putem te adrese, koristeći fastcgi_pass konfiguracioni parametar, u konfiguracionoj datoteci bloka virtuelnog servera.

Na primjer, ako je konfiguracijska datoteka za vašu web stranicu /etc/nginx/conf.d/example.com.conf, otvorite je za uređivanje.

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

Potražite blok location za obradu .php datoteka i postavite parametar fastcgi_pass na sljedeći način, ako ste konfigurirali PHP-FPM da sluša na UNIX-u domain socket.

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

Ili koristite TCP/IP adresu ako ste konfigurirali PHP-FPM za slušanje na TCP/IP utičnici. Ako backend server aplikacija (PHP-FPM) radi na zasebnom serveru (zamijenite 10.42.0.10 IP adresom mašine na kojoj je PHP-FPM FastCGI server trči).

fastcgi_pass  10.42.0.10:3000;

Važno: Na CentOS 8, PHP-FPM je definiran kao upstream server u / etc/nginx/conf.d/php-fpm.conf fajl, unutar uzvodnog bloka, sa imenom php-fpm.

Ovdje možete napraviti promjene u skladu s tim u zavisnosti od adrese koju je PHP-FPM konfigurirao za slušanje, u konfiguracijskoj datoteci bazena. Podrazumevana konfiguracija ukazuje na utičnicu UNIX domene.

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

i u blok fajlu servera vaše web lokacije, jednostavno postavite parametar fastcgi_pass kao što je prikazano.

fastcgi_pass php-fpm;

Nakon što izvršite promjene u PHP-FPM i NGINX konfiguracijama, provjerite njihovu konfiguracijsku sintaksu da li je tačna kako slijedi.

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

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

Dok izlaz naredbe prikazuje samo glavnu konfiguracijsku datoteku, sve ostale konfiguracijske datoteke su također uključene i provjerene.

Zatim morate ponovo pokrenuti dvije usluge da biste primijenili promjene, koristeći naredbu systemctl.

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

Ako dobijete bilo kakvu grešku, možete provjeriti datoteke dnevnika NGINX i PHP-FPM pomoću naredbe cat.

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

To je sve što smo imali za vas. Odjeljak za komentare ispod može se koristiti za postavljanje pitanja. Za više informacija pogledajte NGINX dokumentaciju i PHP-FPM dokumentaciju.