网站搜索

如何使用 UNIX 或 TCP/IP 套接字将 NGINX 连接到 PHP-FPM


NGINX Web 服务器(作为反向代理)通过 FastCGI 协议(作为后端应用程序服务器)为 PHP 应用程序提供服务。 NGINX 采用 PHP-FPM(FastCGI 进程管理器),这是另一种 PHP FastCGI 实现,它作为守护进程在后台运行,监听 >CGI 请求。它配备了专为支持重载网站或 Web 应用程序而设计的额外功能,但它可用于任何规模的网站。

PHP-FPM不仅支持FastCGI资源池的配置,而且还改进了许多FastCGI内部机制,增加了错误报告、脚本终止等等。它具有 PHP 妖魔化、进程管理、发出请求的动态进程数、错误标头、加速上传支持等等。

要接受来自 NGINXFastCGI 请求,PHP-FPM 可以侦听 TCP/IP 套接字或 UNIX 域插座。无论您选择使用哪个地址,NGINX 都会使用 fastcgi_pass 指令连接(代理请求)到 PHP-FPM

本指南介绍如何配置 NGINX 以使用 PHP-FPM 服务器 PHP 应用程序。它描述了何时使用 TCP/IP 套接字或 UNIX 域套接字将 NGINX 连接到 PHP-FPM 以及原因。

本指南假设您的 Linux 系统上安装了 NGINXPHP-FPM,否则请参阅:

  • 如何在 CentOS 8 上安装 LEMP 服务器
  • 如何在 Ubuntu 20.04 服务器中安装 LEMP 堆栈 PhpMyAdmin
  • 如何在 RHEL 8 上安装 NGINX、MySQL/MariaDB 和 PHP
  • 如何在 Debian 10 服务器上安装 LEMP

我应该使用什么:UNIX 域套接字还是 TCP/IP 套接字?

UNIX 域(或 IPC)套接字是一种进程间通信 (IPC) 的方式,允许在同一操作系统上运行的进程之间进行有效的数据交换,而 TCP /IP(或互联网域)套接字允许进程通过网络进行通信。

与通过 IP 地址和端口(例如 127.0.0.1:9000)标识服务器的 TCP/IP 套接字不同,您可以使用以下命令将服务器绑定到 UNIX 域套接字:文件路径名(例如 /run/php-fpm/www.sock),在文件系统中可见。

UNIX 域套接字是一种特殊类型的文件 - 文件和目录权限适用于它(与任何其他类型的 UNIX 文件一样),并且可用于限制主机上的哪些进程可以读取和写入该文件, (从而与后端服务器通信)。

这样,UNIX 域套接字是安全的,因为只有本地主机上的进程才能使用它。除非实施防火墙等额外的安全措施,否则 TCP/IP 套接字可能会暴露在互联网上,从而带来安全风险。

重要的是,就性能而言,使用 UNIX 域套接字与使用 TCP/IP 套接字不同,多项测试和基准测试已证明 UNIX 域套接字更快。 UNIX 域套接字的主要缺点是可扩展性较差,仅支持同一操作系统 (OS) 内的进程间通信。

PHP-FPM监听地址在哪里配置?

您可以在资源池配置文件中配置PHP-FPM侦听的地址。请注意,使用 PHP-FPM,您可以使用不同的设置运行多个进程池。默认池称为 www

资源池配置文件的位置取决于PHPPHP-FPM在Linux系统上的安装方式(是默认/单个版本还是同时多个版本) 。

例如,在 CentOS 8 上,使用单一版本,所有 PHP 配置文件都位于 /etc 目录中,默认的 PHP-FPM(www) 配置文件为 /etc/php-fpm.d/www.conf

要列出所有 PHP 配置文件,请使用以下 ls 命令。

ls /etc/php*

Ubuntu 20.04 上,PHP 配置文件位于 /etc/php// 目录中,默认的 PHP-FPM > pool (www) 配置文件为 /etc/php//fpm/pool.d/www.conf

ls /etc/php/7.4/

配置 PHP-FPM 以侦听 UNIX 域套接字

要将 PHP-FPM 配置为侦听 UNIX 域套接字,请使用您喜欢的文本编辑器打开默认的 PHP-FPM 池配置文件。

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

然后查找listen指令并将其设置为UNIX域套接字的文件路径名,如下所示。请注意,大多数安装默认使用 UNIX 域套接字。

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

如果您使用 UNIX 域套接字,您还需要为文件设置适当的读/写权限,以允许来自 NGINX Web 服务器的连接。默认情况下,NGINX 在 CentOS/RHEL/Fedora 上以用户和组 nginx 运行,在 Ubuntu 上以 www-data 运行和Debian

因此,找到 listen.ownerlisten.group 参数并进行相应的设置。另外,使用 listen.mode 参数将模式设置为 0660

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

请注意,如果 UNIX 域套接字文件的权限设置不正确,NGINX 可能会返回错误网关错误。

配置 PHP-FPM 以侦听 TCP/IP 套接字

尽管 UNIX 域套接字比 TCP/IP 套接字更快,但前者的可扩展性较差,因为它只能支持同一操作系统上的进程间通信。如果 NGINX 和后端应用服务器 (PHP-FPM) 运行在不同的系统上,则必须配置 PHP-FPM 来监听用于连接的 TCP/IP 套接字。

PHP-FPM池配置文件中,设置监听地址,如下所示。确保您选择的端口未被同一系统上的其他进程或服务使用。

listen = 127.0.0.1:3000

配置 NGINX 以与 PHP-FPM 应用程序服务器配合使用

配置 PHP-FPM 侦听地址后,您需要配置 NGINX,使用 fastcgi_pass 通过该地址代理请求配置参数,位于虚拟服务器块配置文件中。

例如,如果您网站的配置文件是 /etc/nginx/conf.d/example.com.conf,请打开它进行编辑。

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

如果您将 PHP-FPM 配置为在 UNIX 上侦听,请查找用于处理 .php 文件的 location 块,并按如下方式设置 fastcgi_pass 参数域套接字。

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

或者,如果您将 PHP-FPM 配置为侦听 TCP/IP 套接字,则可以使用 TCP/IP 地址。如果后端应用程序服务器 (PHP-FPM) 在单独的服务器上运行(将 10.42.0.10 替换为 PHP-FPM FastCGI 服务器所在计算机的 IP 地址)在跑)。

fastcgi_pass  10.42.0.10:3000;

重要:在 CentOS 8 上,PHP-FPM 被定义为 / 中的上游服务器etc/nginx/conf.d/php-fpm.conf 文件,位于上游块内,名称为 php-fpm

您可以根据池配置文件中配置为侦听的地址 PHP-FPM 在此处进行相应的更改。默认配置指向 UNIX 域套接字。

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

在站点的服务器块文件中,只需设置 fastcgi_pass 参数,如图所示。

fastcgi_pass php-fpm;

更改 PHP-FPMNGINX 配置后,请检查其配置语法是否正确,如下所示。

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

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

虽然命令输出仅显示主配置文件,但也包含并检查所有其他配置文件。

接下来,您需要使用 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

如果出现任何错误,可以使用 cat 命令检查 NGINXPHP-FPM 日志文件。

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

这就是我们为您提供的一切。下面的评论部分可以用来提问。有关更多信息,请参阅 NGINX 文档和 PHP-FPM 文档。