加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

概括PHP-FPM与Nginx的通信机制

发布时间:2022-07-21 13:14:55 所属栏目:PHP教程 来源:互联网
导读:PHP-FPM 介绍 CGI 协议与 FastCGI 协议 每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使
  PHP-FPM 介绍
  CGI 协议与 FastCGI 协议
  每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信。PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件。
 
 
  PHP-FPM 是什么
  PHP-FPM 即 PHP-FastCGI Process Manager, 它是 FastCGI 的实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种;master 进程只有一个,负责监听端口,接收来自服务器的请求,而 worker 进程则一般有多个(具体数量根据实际需要进行配置),每个进程内部都会嵌入一个 PHP 解释器,是代码真正执行的地方。
 
  Nginx 与 php-fpm 通信机制
  当我们访问一个网站(如 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 中的配置
 
  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,以负载均衡、内核优化等运维手段维持效率。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读