点击上方 蓝字 关注
张林林, 2017 年校招进入贝壳找房, 现任职 PHP 研发工程师, 负责移动端 API 研发工作.
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]
- 2 name=unit repo
- 3 baseurl=https: //packages.nginx.org/unit/centos/$releasever/$basearch/
- 4 gpgcheck= 0
- 5
- enabled=
- 1
开始安装
- 1 # yun install unit
- 3.
配置和运行
每个单独的应用, 都可以在 NGINX Unit 的配置文件中, 使用 JSON 语法来定义一个 applications. 下面以配置一个应用为例, 名为 php-test, 该应用的本地路径为 / data0/www/htdocs/nginxUnit/.
首先, 我们创建一个目录并进入相应目录.
1 # cd /data0/www/htdocs/nginxUnit/
在该目录下创建一个 index.php 文件用于测试.
- 1
- <?php
- 2 echo "hello world" ;
- 3
- ?>
在 / data0/www/htdocs 目录下创建一个名为 phpConfig.json 的配置文件.
- {
- "listeners" : {
- "*:8100" : {
- "application" : "php-test"
- }
- },
- "applications" : {
- "php-test" : {
- "type" : "php" ,
- "processes" : 20 ,
- "root" : "/data0/www/htdocs/nginxUnit" ,
- "index" : "index.php"
- }
- }
- }
该配置文件包含一个监听器和应用配置. 当应用被通过 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 的部分参数配置
- "listeners": {
- "*:8100": {
- "application": "php-test"
- }
- },
- "applications": {
- "php-test": {
- "type": "php",
- "processes": 20,
- "root": "/data0/www/htdocs/nginxUnit",
- "index": "index.php"
- }
- }
tengine +php-fpm 的部分参数配置:
- [unit.local]
- user = www
- group = www
- listen = 127.0.0.1:9008
- listen.allowed_clients = 127.0.0.1
- pm = static
- pm.max_children = 20
- pm.start_servers = 1
- pm.min_spare_servers = 1
- pm.max_spare_servers = 32
- pm.max_requests = 1500
- pm.status_path = /h3_monitor
- slowlog = /data0/www/logs/$pool-slow_log
- request_slowlog_timeout = 3
- request_terminate_timeout = 20
- catch_workers_output = no
- security.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 组合的. 其动态化的配置方式也是为未来创造无限可能.
来源: http://www.tuicool.com/articles/Rn2Ujuv