聊聊Nginx与php-fpm的通信机制,看看如何配置?

本篇文章带大家聊聊Nginx与php-fpm的通信机制,介绍一下两种通信方式的不同,看看Nginx 与 php-fpm 的结合要怎么配置,分析一下应用中如何选择通信方式,希望能够给大家提供帮助!

本篇文章带大家聊聊Nginx与php-fpm的通信机制,介绍一下两种通信方式的不同,看看Nginx 与 php-fpm 的结合要怎么配置,分析一下应用中如何选择通信方式,希望能够给大家提供帮助!

聊聊Nginx与php-fpm的通信机制,看看如何配置?

php零基础到就业直播视频课:进入学习Apipost-比 postman 更好用的 API 文档、设计、调试、自动化测试一体化协作平台!点击使用

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 与 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 文件位置。

两种方式的数据传输过程如下图所示:
聊聊Nginx与php-fpm的通信机制,看看如何配置?

二者的不同:

由于 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 实例上。

记录Nginx怎么配置TP5.1及所遇问题

转载2022-01-05 16:28:401072 + php学习QQ群:609135716下面thinkphp框架教程栏目将给大家介绍关于Nginx怎么配置ThinkPHP5.1以及遇到的问题的解决方法,希望对需要的朋友有所帮助!

1.Nginx用户对项目目录的访问权限

cd /usr/local/nginx/html/setfacl -m u:nginx:rwx -R ../html

2.确保访问路径是正确的,最好在本地测过访问URL路径能正确访问到文件

聊聊Nginx与php-fpm的通信机制,看看如何配置?

php零基础到就业直播视频课:进入学习Apipost-比 postman 更好用的 API 文档、设计、调试、自动化测试一体化协作平台!点击使用

3.nginx支持tp的pathinfo

vi /usr/local/nginx/conf/nginx.conf

nginx.conf配置文件找到位置修改内容为

location ~ \.php$ {
#root html;
#这段路径指向是必须加的
root /usr/local/nginx/html/zh/public;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/usr/local/php/var/run/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$; #增加这一句
fastcgi_param PATH_INFO $fastcgi_path_info; #增加这一句
include fastcgi_params;
}

4.nginx rewrite重写规则

vi /usr/local/nginx/conf/nginx.conf

nginx.conf配置文件找到位置修改内容为

server {
listen 80;
server_name www.liuyuanshan.top;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
#root html;
# 设置www.liuyuanshan.top默认访问路径为/usr/local/nginx/html/zh/public/
root /usr/local/nginx/html/zh/public/;
index index.php index.html index.htm;

if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}

以上就是记录Nginx怎么配置TP5.1及所遇问题的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/24784/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年9月22日 上午11:51
下一篇 2022年9月22日 上午11:52
软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!