nginx+php-fpm分离部署提升web服务器性能

之前一直都有用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


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/511.html