前言
大家应该都知道,Nginx与PHP-FPM的通信方式有两种。
(1)TCP/IP连接,这个是默认连接方式;
(2)Unix套接字;
但是它们应该如何配置?有什么差异?性能对比如何?接下来我给大家做个测试验证下。
前期的准备,需要一个运行nginx+php的环境。
一、使用TCP/IP连接
根据上面提供的文章启动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%。
本次试验结果不一定准确,受服务器环境、硬件资源的影响,不同配置可能导致不同的结果。加上本人能力有限,还有许多不足之处还望多多指教,谢谢。