Vyhledávání na webu

Jak připojit NGINX k PHP-FPM pomocí UNIX nebo TCP/IP Socket


Webový server NGINX (jako reverzní proxy) obsluhuje aplikace PHP prostřednictvím protokolu FastCGI (jako backendový aplikační server). NGINX využívá PHP-FPM (FastCGI Process Manager), alternativní implementaci PHP FastCGI, která běží na pozadí jako démon a naslouchá CGIpožadavky. Dodává se s dalšími funkcemi navrženými pro napájení vysoce zatížených webů nebo webových aplikací, ale lze jej použít pro weby jakékoli velikosti.

Nejen, že PHP-FPM podporuje konfiguraci zdrojů FastCGI, ale také zlepšuje mnoho interních FastCGI a zvyšuje hlášení chyb, skripty ukončení a mnoho dalšího. Obsahuje démonizaci PHP, správu procesů, dynamický počet procesů, ze kterých mohou přicházet požadavky, chybovou hlavičku, podporu zrychleného nahrávání a další.

Pro přijímání požadavků FastCGI od NGINX může PHP-FPM naslouchat na TCP/IP soketu nebo doméně UNIX zásuvka. Ať už se rozhodnete použít kteroukoli adresu, NGINX používá k připojení (požadavky proxy) k PHP-FPM pomocí direktivy fastcgi_pass.

Tato příručka vysvětluje, jak nakonfigurovat NGINX pro server PHP aplikací pomocí PHP-FPM. Popisuje, kdy pro připojení NGINX k PHP-FPM použít soket TCP/IP nebo doménový soket UNIX a proč.

Tato příručka předpokládá, že máte v systému Linux nainstalované NGINX a PHP-FPM, jinak viz:

  • Jak nainstalovat LEMP Server na CentOS 8
  • Jak nainstalovat LEMP stack PhpMyAdmin na Ubuntu 20.04 Server
  • Jak nainstalovat NGINX, MySQL/MariaDB a PHP na RHEL 8
  • Jak nainstalovat LEMP na Debian 10 Server

Co bych měl použít: UNIX Domain Socket nebo TCP/IP Socket?

Sokety UNIX domény (nebo IPC) jsou prostředkem meziprocesové komunikace (IPC), který umožňuje efektivní výměnu dat mezi procesy běžícími na stejném operačním systému, zatímco TCP /IP (nebo internetová doména) umožňují procesům komunikovat přes síť.

Na rozdíl od soketu TCP/IP, který identifikuje server pomocí adresy IP a portu (např. 127.0.0.1:9000), můžete server svázat se soketem domény UNIX pomocí název cesty k souboru (např. /run/php-fpm/www.sock), který je viditelný v systému souborů.

Doménový soket UNIX je speciální typ souboru – vztahují se na něj oprávnění k souborům a adresářům (stejně jako v případě jakéhokoli jiného typu souboru UNIX) a lze jej použít k omezení toho, které procesy na hostiteli mohou číst a zapisovat do souboru, (a tedy komunikovat s backend serverem).

Tímto způsobem je soket domény UNIX bezpečný, protože jej mohou používat pouze procesy na místním hostiteli. Soket TCP/IP může být vystaven internetu, což představuje bezpečnostní riziko, pokud nejsou implementována zvláštní bezpečnostní opatření, jako je brána firewall.

Důležité je, že použití soketu UNIX domény není totéž jako použití soketu TCP/IP z hlediska výkonu. Několik testů a benchmarků prokázalo, že sokety domény UNIX jsou rychlejší. Hlavní nevýhodou doménových soketů UNIX je, že jsou méně škálovatelné, podporují pouze meziprocesovou komunikaci v rámci stejného operačního systému (OS).

Kde mohu nakonfigurovat adresu pro poslech PHP-FPM?

Adresu, na které PHP-FPM naslouchá, můžete nakonfigurovat v konfiguračním souboru fondu zdrojů. Všimněte si, že s PHP-FPM můžete spustit několik skupin procesů s různými nastaveními. Výchozí fond se nazývá www.

Umístění konfiguračního souboru fondu zdrojů závisí na způsobu instalace PHP a PHP-FPM v systému Linux (zda se jedná o výchozí/jedinou verzi nebo více verzí současně) .

Například v systému CentOS 8 s jedinou verzí jsou všechny konfigurační soubory PHP umístěny v adresáři /etc a výchozí PHP-FPM konfigurační soubor fondu (www) je /etc/php-fpm.d/www.conf:

Chcete-li vypsat všechny konfigurační soubory PHP, použijte následující příkaz ls.

ls /etc/php*

Na Ubuntu 20.04 jsou konfigurační soubory PHP umístěny v adresáři /etc/php// a výchozí PHP-FPM konfigurační soubor fondu (www) je /etc/php//fpm/pool.d/www.conf:

ls /etc/php/7.4/

Konfigurace PHP-FPM pro naslouchání na doménovém soketu UNIX

Chcete-li nakonfigurovat PHP-FPM pro naslouchání na soketu domény UNIX, otevřete svůj výchozí konfigurační soubor fondu PHP-FPM pomocí svého oblíbeného textového editoru.

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

Poté vyhledejte direktivu listen a nastavte ji na cestu k souboru soketu domény UNIX následovně. Všimněte si, že většina instalací standardně používá doménový soket UNIX.

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

Pokud používáte doménový soket UNIX, musíte také nastavit příslušná oprávnění pro čtení/zápis pro soubor, abyste umožnili připojení z webového serveru NGINX. Ve výchozím nastavení běží NGINX jako uživatel a skupina nginx na CentOS/RHEL/Fedora a www-data na Ubuntu a Debian.

Najděte tedy parametry listen.owner a listen.group a podle toho je nastavte. Také nastavte režim na 0660 pomocí parametru 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

Všimněte si, že pokud oprávnění pro soubor soketu domény UNIX nejsou správně nastavena, NGINX může vrátit chybnou chybu brány.

Konfigurace PHP-FPM pro poslech na TCP/IP soketu

Ačkoli je soket domény UNIX rychlejší než soket TCP/IP, první je méně škálovatelný, protože může podporovat pouze meziprocesovou komunikaci na stejném operačním systému. Pokud NGINX a backendový aplikační server (PHP-FPM) běží na různých systémech, budete muset nakonfigurovat PHP-FPM, aby naslouchal soket TCP/IP pro připojení.

V konfiguračním souboru fondu PHP-FPM nastavte adresu listen následovně. Ujistěte se, že port, který jste vybrali, není používán jiným procesem nebo službou ve stejném systému.

listen = 127.0.0.1:3000

Konfigurace NGINX pro práci s aplikačním serverem PHP-FPM

Jakmile nakonfigurujete adresu, na které PHP-FPM naslouchá, musíte nakonfigurovat NGINX tak, aby na ni prostřednictvím této adresy žádal proxy pomocí fastcgi_pass konfigurační parametr v konfiguračním souboru bloku virtuálního serveru.

Pokud je například konfigurační soubor vašeho webu /etc/nginx/conf.d/example.com.conf, otevřete jej pro úpravy.

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

Pokud jste nakonfigurovali PHP-FPM pro naslouchání v systému UNIX, vyhledejte blok location pro zpracování souborů .php a nastavte parametr fastcgi_pass následovně doménový soket.

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

Nebo použijte TCP/IP adresu, pokud jste nakonfigurovali PHP-FPM pro naslouchání na TCP/IP soketu. Pokud server backendové aplikace (PHP-FPM) běží na samostatném serveru (nahraďte 10.42.0.10 IP adresou počítače, na kterém je server PHP-FPM FastCGI běží).

fastcgi_pass  10.42.0.10:3000;

Důležité: V systému CentOS 8 je PHP-FPM definován jako upstream server v / etc/nginx/conf.d/php-fpm.conf v rámci upstream bloku s názvem php-fpm.

Zde můžete provést změny podle toho, na jaké adrese je PHP-FPM v konfiguračním souboru fondu nakonfigurován k naslouchání. Výchozí konfigurace ukazuje na soket domény UNIX.

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

a v souboru bloku serveru vašeho webu jednoduše nastavte parametr fastcgi_pass podle obrázku.

fastcgi_pass php-fpm;

Po provedení změn v konfiguracích PHP-FPM a NGINX zkontrolujte správnost jejich konfigurační syntaxe následujícím způsobem.

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

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

Zatímco výstup příkazu zobrazuje pouze hlavní konfigurační soubor, jsou zahrnuty a zkontrolovány také všechny ostatní konfigurační soubory.

Dále je třeba restartovat obě služby, aby se změny projevily, pomocí příkazu 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

Pokud se objeví nějaké chyby, můžete zkontrolovat soubory protokolu NGINX a PHP-FPM pomocí příkazu 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 vše, co jsme pro vás měli. Sekci komentářů níže lze použít k pokládání otázek. Další informace najdete v dokumentaci NGINX a dokumentaci PHP-FPM.