CGI:通信网关协议

  • CGI协议:动态语言的代码文件需要对应的语言解释器才能被服务器识别,CGI协议就是用来使得解释器与服务器之间互相通信

image

请求链路:
1、客户端输入ur
2、解析到服务器IP
3、请求发送到Web服务器(nginx)
4、Nginx收到请求,通过fast-cgi协议,将请求数据发送到php-fpm进程管理器
5、php-fpm进程管理器将任务发给子进程:fork的子worke进程
6、work进程中的php解释器执行php文件来处理请求
7、php解释器处理好之后再通过fast-cgi协议将处理结果发给Nginx服务器
8、Nginx将结果返回到客户端

  • cgi:

    • 每次来一个请求,都需要fork一个子进程,请求结束后,再kill掉子进程
  • fast-cgi:

    • fast-cgi,请求结束后,不会kill掉子进程,而是还可以继续处理后续的请求
  • php-fmp:

    • Fast-cgi进程管理器,包含2种进程
    • master进程:主进程,负责监听端口,接收请求
    • worker进程:内部有php解释器,负责执行php代码
  • 更新php.ini后,无法平滑重启,需要更新php-fpm,worker进程才可生效

  • cgi和fast-cgi的区别:

    • cgi:每次新的请求,fork一个子进程,结束后kill掉
      • 每次新fork子进程,都要重新读取php.ini,初始化环境
    • fast-fgi:先启动一部分worker进程,处理请求后不会立即kill,而是可以等待继续处理后续的请求
      • worker进程不会kill掉,就无需重新读取php.ini和初始化环境
      • 当worker进程不够时,可先fork一些worker,如果空闲worker较多时,可kill掉一些节省资源

Nginx与php-fpm通信:Nginx和php-fpm之间,2种通信方式

  • TCP socket:通过 IP:port的方式进行通信

    • 这种方式,可以将nginx和php-fpm分布在不同的服务器上
  • Unix socket:通过 php启动生成的socket文件进行通信

    • 这种通过方式,nginx和php-fpm就只能部署在一台机器上
  • 优缺点:

    • tcp socket:需要重新打包、拆包、计算校验、应答等
      • 缺点:需要有多余的tcp开销
      • 优点:高并发下,保证通信的正确性和完整性
    • unix socket:
      • 优点:效率比tcp高,只是将数据进行进程间的拷贝,减少不必要的tcp开销
      • 缺点:高并发时不稳定,产生大量长时缓存,数据可能出错不返回异常
  • 使用场景:

    • TCP socket
      • 高并发场景,使用 tcp socket,nginx默认使用tcp方式
      • 保证通信完整
    • Unix socket:
      • 减少tcp开销,提高性能
      • 优化:

php-fpm优化:

  • 改为Unix socket通信方式
    • 非高并发请求,注重性能:
  • Unix socket通信方式:
    • 将socket文件放在内存中(/dev/shm目录下)

Nginx优化:

  • 修改nginx的worker数,指定nginx运行时的worker数量
    • 当worker_processes数等于2*CPU核心数时,性能最优
  • 设置nginx中的backlog数
    • listen 80 default backlog=1024;
  • 增加php-fpm的worker数
    • 增加并发能力
    • 一个常驻worker大概耗内存30M,不可以开太大
  • 配置php-fpm关闭执行时间限制
    • 减少由于超时导致的终止
  • 定时重启php-fpm
    • crontab定时重启
  • 配置php-fpm查看返回错误
    • 将运行中的错误输出到日志文件中