之前一直都有用nginx的动静分离和负载均衡功能,但是现在手上一个接到的CASE是前端nginx无法变动,但是机器负载非常高,平均每颗CPU负载达到了10,已经严重超过负荷,并发非常之高,各种优化都不能很好解决,架构比较复杂,所以想到了php-fpm可以以监听的方式来提供php cgi的服务,这样就好办了,想了后端还可以用负载均衡来做php-fpm的负载,决定动手实践
主要是更改nginx中虚拟机的配置
location ~ \.php(/|$) { fastcgi_pass 192.168.128.140:9000; #这里改成提供php cgi的服务器IP fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name; #分离部署时这里不能填写变量,只能填写实际目录 include fastcgi_params; }
以上就是前端的配置,后端我们主要改php-fpm.conf内的
listen = 192.168.128.140:9000
这样改好了以后我们就可以重启php-fpm,查看监听状态
netstat -ntpl | grep 9000
处于了监听状态下,那么我们来访问网站,这里需要注意的是,这里的nginx和php-fpm分离部署有些类似负载均衡的架构
我们就需要在192.168.128.140和前端nginx上部署一样的目录结构 /data/www,将php网站放置这个目录下即可
这里我们就对fcgi的连接方式做一个优缺点分析如下:
unix socket方式
优点:
unix socket方式要比tcp的方式快,而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。
会有很多linux傻瓜面板,他们可能会有很多中 php-fpm的版本,那么如果是不同版本去开不同的端口,然后nginx去配置的话,你要记住很多端口,sock文件便是解决这个问题最简单的方法。
Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock(很多教程使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多)
缺点:
unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。
虽然sock有更少的数据拷贝和上下文切换,更少的资源占用,但是如果数据都是错的,那还有什么用呢。另外使用sock的话,必须nginx和fpm在同一台机器上
tcp方式
优点:
从稳妥的考虑肯定是使用tcp,tcp协议能保证数据的正确性,sock不能保证。
可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式
缺点:
性能不如unix socket