问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nginx和php-fpm之间是怎样通信的

发布网友 发布时间:2022-04-28 04:40

我来回答

2个回答

懂视网 时间:2022-04-28 09:01

【相关学习推荐:php图文教程】

PHP-FPM 介绍

CGI 协议与 FastCGI 协议

每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件。

由于 CGI 的机制是每处理一个请求需要 fork 一个 CGI 进程,请求结束再kill掉这个进程,在实际应用上比较浪费资源,于是就出现了CGI 的改良版本 FastCGI,FastCGI 在请求处理完后,不会 kill 掉进程,而是继续处理多个请求,这样就大大提高了效率。

PHP-FPM 是什么

PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种;master 进程只有一个,负责监听端口,接收来自服务器的请求,而 worker 进程则一般有多个(具体数量根据实际需要进行配置),每个进程内部都会嵌入一个 PHP 解释器,是代码真正执行的地方。

Nginx 与 php-fpm 通信机制

当我们访问一个网站(如 www.test.com)的时候,处理流程是这样的:

 www.test.com
 |
 |
 Nginx
 |
 |
路由到 www.test.com/index.php
 |
 |
加载 nginx 的 fast-cgi 模块
 |
 |
fast-cgi 监听 127.0.0.1:9000 地址
 |
 |
www.test.com/index.php 请求到达 127.0.0.1:9000
 |
 |
 等待处理...

【相关文章推荐:Nginx教程】

Nginx 与 php-fpm 的结合

在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。

tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。

Unix socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx配置文件中填写 php-fpm 的 socket 文件位置。

两种方式的数据传输过程如下图所示:

二者的不同:

由于 Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。

Nginx 与 php-fpm 结合只需要在各自的配置文件中做设置即可:

1) Nginx 中的配置

以 tcp socket通信为例

server {
 listen 80; #监听 80 端口,接收http请求
 server_name www.test.com; #就是网站地址
 root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
 #路由到网站根目录 www.test.com 时候的处理
 location / {
 index index.php; #跳转到 www.test.com/index.php
 autoindex on;
 } 

 #当请求网站下 php 文件的时候,反向代理到 php-fpm
 location ~ .php$ {
 include /usr/local/etc/nginx/fastcgi.conf; #加载 nginx 的 fastcgi 模块
 fastcgi_intercept_errors on;
 fastcgi_pass 127.0.0.1:9000; # tcp 方式,php-fpm 监听的 IP 地址和端口
 # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式
 }

}

2) php-fpm 的配置

listen = 127.0.0.1:9000
# 或者下面这样
listen = /var/run/php-fpm.sock

注意,在使用 unix socket 方式连接时,由于 socket 文件本质上是一个文件,存在权限控制的问题,所以需要注意 nginx 进程的权限与 php-fpm 的权限问题,不然会提示无权限访问。(在各自的配置文件里设置用户)

通过以上配置即可完成 php-fpm 与 nginx 的通信。

在应用中的选择

如果是在同一台服务器上运行的 nginx 和 php-fpm,且并发量不高(不超过1000),选择unix socket,以提高 nginx 和 php-fpm 的通信效率。
如果是面临高并发业务,则考虑选择使用更可靠的 tcp socket,以负载均衡、内核优化等运维手段维持效率。

若并发较高但仍想用 unix socket 时,可通过以下方式提高 unix socket 的稳定性。

1)将sock文件放在 /dev/shm 目录下,此目录下将 sock 文件放在内存里面,内存的读写更快。

2)提高 backlog

backlog 默认位 128,1024 这个值换成自己正常的 QPS,配置如下。

nginx.conf 文件中

server {
 listen 80 default backlog = 1024;
 }

php-fpm.conf 文件中

listen.backlog = 1024

3)增加 sock 文件和 php-fpm 实例

在 /dev/shm 新建一个 sock 文件,在 nginx 中通过 upstream 模块将请求负载均衡到两个 sock 文件,并且将两个 sock 文件分别对应到两套 php-fpm 实例上。

相关学习推荐:php编程(视频)

热心网友 时间:2022-04-28 06:09

FastCGI原理
FastCGI是一个运用于Http Server和动态脚本语言间通信的接口,多数流行的Http Server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。
FastCGI接口方式采用C/S结构,可以将HttP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HttP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给客户端。这种方式可以让HttP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

Nginx+php-fpm实现原理

Nginx本身不会对PHP进行解析,终端对PHP页面的请求将会被Nginx交给FastCGI进程监听的IP地址及端口,由php-fpm作为动态解析服务器处理,最后将处理结果再返回给nginx。其实,Nginx就是一个反向代理服务器。Nginx通过反向代理功能将动态请求转向后端php-fpm,从而实现对PHP的解析支持,这就是Nginx实现PHP动态解析的原理。

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。

Nginx 简单配置
location ~ \.php$ {
root /home/admin/web/nginx/html/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/admin/web/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在公交车上实施扒窃,会受到怎样的处罚? 交通违法行为识别 公交车扒窃会如何处罚? 郑州鱼缸清洗找哪家公司做得比较好? 郑州有没有专业维修鱼缸,清洗鱼缸的? ...的鱼缸,放在办公室养些鱼水草之类的。郑州哪里有卖这样的鱼缸。_百... 我们公司想要定做个观赏鱼缸,不知道郑州哪家公司最专业? 谁知道郑州生态鱼缸定做哪家做的效果最好? 联想电脑启用无线功能的功能键? 笔记本电脑怎么连接网笔记本电脑怎样连接无线网 我们为什么要选择PHP而不是ASP.net 为什么现在的大型网站还在使用php ?php对比jsp的优势在哪里 Python中文件访问模式默认可读对吗? 关于python中文件打开模式a+? 关于Python文件中的w➕打开模式属于什么模式? python文件打开 书声琅琅教育旗下智圭谷:Python支持的所有文件处理模式? linux php扩展目录在哪 PHP怎么禁止代理访问 帮满看一串PHP代码,如何实现禁止的IP显示网页内容 请问我如何禁止大陆区IP浏览我的网页? 网站某php页面被流量攻击.....如何获得访问该页面的IP并禁止访问 如何在php服务器不访问ip,访问域名形式访问网页 PHP让某个IP无法访问网站? PHPCMS如何禁止IP访问网站 php,类外函数调用类的成员函数的方法 php中self的真正含义是什么?为什么可以调用父类 的成员和方法? - PHP进阶讨论 在php中,如何引用成员函数autocommit() PHP中,怎么在成员函数当中调用自己的成员属性?除了静态调用之外还有别的方法吗? php面向对象中成员方法传参问题,求解 请问砖家,nginx怎么和php交互 nginx和php-fpm 是使用 tcp socket 还是 unix socket nginx 监听80 为什么php-fpm监听9000 如何通俗的解释cgi,fastcgi,php-fpm之间的关系 php-fpm和fast-cgi的关系,nginx怎样配置php-fpm PHP中的FPM是做什么的 php-fpm 有执行慢的脚本该怎么优化 php fpm配置优化 pm 怎么配置 php-fpm的FAQ php-fpm worker设置多少最佳 php-fpmcpu高有哪些原因 作为一个程序员,TP真的是最好的选择吗 作为一个程序员,应该具备什么样的素质? 那些已经工作的程序员,如果学习新的技术或者编程语言,他们是看书自学的还是看视频? 我是个编程的自学者,想当程序员不知道公司写文档是什么意思知道的情给我解释一下,还有具体是怎样工作的 java程序员第一天来公司,项目经理让我看老项目写学习文档? 程序员这工作好吗 程序员鼓励师作为程序员的衍生职业,程序员对这个职业如何看? 作为一名程序员,你通常是如何自黑的? 今天问了一下,程序员的英语要到什么程度,大神说,能看得懂那些最简单的文档就够了,比如,msdn文档