Nginx与PHP-FPM的两种通信方式,它们的性能对比如何?

前言

大家应该都知道,Nginx与PHP-FPM的通信方式有两种。

(1)TCP/IP连接,这个是默认连接方式;

(2)Unix套接字;

但是它们应该如何配置?有什么差异?性能对比如何?接下来我给大家做个测试验证下。

前期的准备,需要一个运行nginx+php的环境。

如何使用docker部署php服务-CSDN博客

一、使用TCP/IP连接

如何使用docker部署php服务-CSDN博客

根据上面提供的文章启动test1服务。

因为PHP-FPM默认使用的是这个连接方式,所以不需要改任何配置。

二、使用Unix套接字

1、创建test2项目相关目录,执行如下命令。

mkdir -p /docker/test2/html
cd /docker/test2/

2、复制运行中的test1项目的nginx、php-fpm的配置到当前目录,方便test2修改相关配置,执行如下命令。

docker cp test1:/usr/local/nginx/conf/nginx.conf ./
docker cp test1:/usr/local/php/etc/php-fpm.conf ./
docker cp test1:/usr/local/php/etc/php-fpm.d ./

3、修改nginx配置。

vim nginx.conf
# 将fastcgi_pass的值更改为如下内容
fastcgi_pass  unix:/var/run/php8.3-fpm.sock;

4、修改php-fpm配置。

vim php-fpm.d/www.conf
# 修改listen的方式
listen = /var/run/php8.3-fpm.sock

# 增加三行配置
listen.owner = www
listen.group = www
listen.mode = 0660

5、编写index.php文件,内容如下。

vim html/index.php
<?php
echo "hello ayzen!this is test2!\r\n";

6、编写yaml文件,内容如下;version替换成自己的docker-compose版本。

version: '2.2.2'
services:
    web:
        image: ayzen/nginx-php8.3.3
        ports:
            - "8082:80"
        container_name: test2
        command: ["/start.sh"]
        volumes:
            - "./html:/usr/local/nginx/html"
            - "./nginx.conf:/usr/local/nginx/conf/nginx.conf"
            - "./php-fpm.conf:/usr/local/php/etc/php-fpm.conf"
            - "./php-fpm.d:/usr/local/php/etc/php-fpm.d"
        networks:
            - mynet
networks:
    mynet:
        name: mynet
        driver: bridge

7、启动test2项目,执行如下命令。

docker-compose up -d

8、检查项目是否正常运行,执行如下命令。

docker-compose ps -a

返回如下内容,说明项目已正常启动,正在运行。

9、检查项目请求是否可以正常响应,执行如下命令。

curl http://127.0.0.1:8082/index.php

请求正常会返回如下内容。

10、至此test2项目已配置完成,并且使用的是Unix套接字连接方式。

三、两种方式的配置有什么差异?

1、nginx的配置差异,主要体现在fastcgi_pass上面。

# TCP/IP连接方式
fastcgi_pass  127.0.0.1:9000;

###### 这里是分割线 ###############

# Unix套接字方式
fastcgi_pass  unix:/var/run/php8.3-fpm.sock;

2、php-fpm的配置差异,主要体现在listen上面。

# TCP/IP连接方式
listen = 127.0.0.1:9000

###### 这里是分割线 ###############

# Unix套接字方式
listen = /var/run/php8.3-fpm.sock

# 还增加了三行配置
listen.owner = www
listen.group = www
listen.mode = 0660

3、小结,总的来说它们两个的配置差异体现在,一个是host:port,一个是unix:/path。

四、两种方式的性能有什么差异?

1、对web进行压测的工具有Apache JMeter、Locust、Gatling、Tsung、Siege等等,这次选择简单的Siege做验证。

2、基于ubuntu安装siege,首先拉取ubuntu镜像,执行如下命令。

docker pull ubuntu

3、运行ubuntu容器,需要跟test1、test2同一个网络,执行如下命令。

docker run -it --network mynet ubuntu /bin/bash

4、在容器内安装siege,执行如下命令。

# 更新软件包列表
apt-get update && apt-get install -y software-properties-common

# 安装siege
apt-get update && apt-get install -y siege

5、安装成功后,可以执行如下命令查看帮助。

siege -h

成功的话返回类似如下内容。

6、压测项目test1(使用TCP/IP连接),10个并发请求1000次,执行如下命令。

siege -c 10 -r 1000 http://test1/index.php

连续执行三次的结果如下。

7、压测项目test2(使用Unix套接字),同样的方式10个并发请求1000次,执行如下命令。

siege -c 10 -r 1000 http://test2/index.php

连续执行三次的结果如下。

8、对比结果,我们都取三次的平均值。

(1)项目test1,平均每秒响应次数为:(2915.45+2898.55+3125)/3=2979.67;

(2)项目test2,平均每秒响应次数为:(3205.13+3267.97+3289.47)/3=3254.19;

平均每秒响应次数提升比例,(3254.19-2979.67)/2979.67=0.0921。

小结,项目test2平均每秒响应次数相比于test1提升了9.2%,说明Unix套接字的方式可以提供更强的性能。

总结

1、Nginx与PHP-FPM的通信方式有两种。

(1)TCP/IP连接,这个是默认连接方式;

(2)Unix套接字;

2、两种通信方式的配置差异总的来说体现在,一个是host:port,一个是unix:/path。

3、两种通信方式的性能差异,Unix套接字的方式性能要更强,本次试验性能提升了9.2%。

本次试验结果不一定准确,受服务器环境、硬件资源的影响,不同配置可能导致不同的结果。加上本人能力有限,还有许多不足之处还望多多指教,谢谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayzen1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值