CGI:通信网关协议
- CGI协议:动态语言的代码文件需要对应的语言解释器才能被服务器识别,CGI协议就是用来使得解释器与服务器之间互相通信
请求链路:
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掉一些节省资源
- cgi:每次新的请求,fork一个子进程,结束后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
- 高并发场景,使用 tcp socket,nginx默认使用tcp方式
- 保证通信完整
- Unix socket:
- 减少tcp开销,提高性能
- 优化:
- TCP socket
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查看返回错误
- 将运行中的错误输出到日志文件中