39

Nginx Unit 初探及其性能对比分析

 5 years ago
source link: https://mp.weixin.qq.com/s/nsOrp-R2ZueH11Sf2Erg0Q?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

yUniy2B.gif

点击上方 蓝字 关注

张林林,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的配置文件。

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

1curl -X PUT -d @/ data0 / www / htdocs / phpConfig . json --unix-socket /var/run/control.unit.sock http://localhost

成功配置后会出现如下提示

1curl -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/

  • 压测结果:

nqIbaen.jpg!web

每行的的后两列数据是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组合的.其动态化的配置方式也是为未来创造无限可能。

作者:张林林

监审:程天亮

编辑:郝   爽

网址:tech.ke.com

请猛戳右边二维码

关注我们的公众号

产品技术先行

iuuaInv.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK