1. Nginx Unit 初探
Nginx Unit 是一个开源的,以 Nginx 为基础、支持多语言的 Web 服务器,它支持 Python,PHP,Go 等多语言应用程序,可以在不中断服务的情况下完成部署配置更改,以多种语言运行代码。而它运行多种语言的能力是基于内部路由器进程之间的隔离,路由器进程可终止传入的 HTTP 请求,以及应用程序进程的分组,路由器进程是持久的,不重新启动。
它具有以下特征:
使用 RESTful JSON API 进行动态重配置服务器;
同时支持多语言,多版本应用;
即将支持的特性有:
动态语言的进程管理功能;
TLS 支持;
TCP,HTTP,HTTPS,HTTP/2 路由和代理。
下面我们以一个简单的 php-test 应用为例介绍 nginx unit 的安装和使用。
2. 安装 Nginx Unit
以 centos 6.9 为例。
- 创建 /etc/yum.repos.d/unit.repo。
1[unit]
|
|
2name=unit repo
|
|
3baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
|
|
4gpgcheck=0
|
|
5enabled=1
|
- 开始安装
1# yun install unit
|
3. 配置和运行
每个单独的应用,都可以在 NGINX Unit 的配置文件中,使用 JSON 语法来定义一个 applications。下面以配置一个应用为例,名为 php-test,该应用的本地路径为 /data0/www/htdocs/nginxUnit/。
- 首先,我们创建一个目录并进入相应目录。
cd /data0/www/htdocs/nginxUnit/
|
- 在该目录下创建一个 index.php 文件用于测试。
1
|
|
2echo "hello world";
|
|
3
|
- 在 /data0/www/htdocs 目录下创建一个名为 phpConfig.json 的配置文件。
1{
|
|
2 "listeners": {
|
|
3 "*:8100": {
|
|
4 "application": "php-test"
|
|
5 }
|
|
6 },
|
|
7 "applications": {
|
|
8 "php-test": {
|
|
9 "type": "php",
|
|
10 "processes": 20,
|
|
11 "root": "/data0/www/htdocs/nginxUnit",
|
|
12 "index": "index.php"
|
|
13 }
|
|
14 }
|
|
15}
|
该配置文件包含一个监听器和应用配置。当应用被通过 HTTP 访问时,须定义至少一个监听器 listeners。监听器是一个 IP 地址和一个被定义的端口,当用户访问时,Unit 的监听器会返回正确的结果,IP 地址可以是一个完整的 IP 地址(如 127.0.0.1:8100) 或(*:8100)。
在命令行执行如下命令来创建一个应用 php-test
1# curl -X PUT -d @/data0/www/htdocs/phpConfig.json --unix-socket /var/run/control.unit.sock http://localhost
|
成功配置后会出现如下提示
1# curl -X PUT -d @/data0/www/htdocs/phpConfig.json --unix-socket /var/run/control.unit.sock http://localhost
|
|
2{
|
|
3 "success": "Reconfiguration done."
|
|
4}
|
这时可以访问 http://localhost:8100/ 查看 index.php 的程序是否正常运行。
至此我们的环境搭建和应用配置已经完成。
4. 性能对比
接下来我们进行性能对比分析。将 Nginx Unit 与我们现在使用的 tengine+php-fpm 进行对比分析。
在进行分析之前,介绍下基本环境。
CPU:1 核
内存:4G
操作系统:Centos 6.9
php 版本:7.0.6
nginx unit 的部分参数配置
1"listeners": {
|
|
2 "*:8100": {
|
|
3 "application": "php-test"
|
|
4 }
|
|
5 },
|
|
6 "applications": {
|
|
7 "php-test": {
|
|
8 "type": "php",
|
|
9 "processes": 20,
|
|
10 "root": "/data0/www/htdocs/nginxUnit",
|
|
11 "index": "index.php"
|
|
12 }
|
|
13 }
|
tengine +php-fpm 的部分参数配置:
1[unit.local]
|
|
2user = www
|
|
3group = www
|
|
4listen = 127.0.0.1:9008
|
|
5listen.allowed_clients = 127.0.0.1
|
|
6pm = static
|
|
7pm.max_children = 20
|
|
8pm.start_servers = 1
|
|
9pm.min_spare_servers = 1
|
|
10pm.max_spare_servers = 32
|
|
11pm.max_requests = 1500
|
|
12pm.status_path = /h3_monitor
|
|
13slowlog = /data0/www/logs/$pool-slow_log
|
|
14request_slowlog_timeout = 3
|
|
15request_terminate_timeout = 20
|
|
16catch_workers_output = no
|
|
17security.limit_extensions = ""
|
压测参数:每个压测指令指令 10 次,取 10 次 qps 值的平均值作为最后的统计数据。
压测指令:
[root@lianjia ~]# ab -n 10000 -c 100 http://127.0.0.1:8100/
[root@lianjia ~]# ab -n 10000 -c 100 http://unit.local/
[root@lianjia ~]# ab -n 10000 -c 50 http://unit.local/
[root@lianjia ~]# ab -n 10000 -c 50 http://127.0.0.1:8100/
[root@lianjia ~]# ab -n 1000 -c 50 http://127.0.0.1:8100/
[root@lianjia ~]# ab -n 1000 -c 50 http://unit.local/
压测结果:
每行的的后两列数据是 Requests per second 和 Time per request 服务器平均处理时间值。Requests per second 是总时间除以总请求数的值,也就是我们平常所所的 QPS 值,QPS 值越高表明服务器处理请求数越高,性能越好。Time per request 是服务器平均处理时间,值越小表示服务器处理速度越快。
分析这三行数据:
1. 在并发请求参数相同均为 50 的前提下,压测请求总数设置为 1000 和 10000 两种情况时,发现相同并发数时,压测请求总数越高,其 QPS 值相对越高, 服务器处理速度相对越快,tengine+php-fpm 和 nginx+unit 均是如此;
2. 对比 tengine+php-fpm 和 nginx+unit 在并发请求总数 50,压测请求总数 10000 时,nginx+unit 的 QPS 值高于 tengine+php-fpm 的 91%; 服务器平均处理时间也是快 87.5%;
综上:Nginx+Unit 在纯文本输出中的 QPS 值和服务器平均处理时间是明显高于 tengine+php-fpm 组合的. 其动态化的配置方式也是为未来创造无限可能。
作者介绍:
张林林,2017 年校招进入贝壳找房,现任职 PHP 研发工程师,负责移动端 API 研发工作。
本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。
原文链接:
https://mp.weixin.qq.com/s/nsOrp-R2ZueH11Sf2Erg0Q