如何测试Nginx的高性能

简介:

简介

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器;

作为一款轻量级的Web服务器,具有占有内存少,并发能力强等优势,是高连接并发场景下Apache的不错的替代品;

本篇主要介绍Nginx作为Web服务器时,相对于Apache的性能优势;

下一篇将会介绍Nginx作为方向代理服务器的实现;


重要特点

  • 非阻塞:数据复制时,磁盘I/O的第一阶段是非阻塞的;

  • 事件驱动:通信机制采用epoll模型,支持更大的并发连接;

  • master/worker结构:一个master进程,生成一个或多个worker进程;


基础架构

wKioL1NhsRCizui1AAJjCxv__qo087.jpg

Nginx如何实现高并发

  • I/O模型采用异步非阻塞的事件驱动机制,由进程循环处理多个准备好的事件,如epoll机制;

Nginx与Apache对高并发处理上的区别

  • 对于Apache,每个请求都会独占一个工作线程,当并发量增大时,也会产生大量的工作线程,导致内存占用急剧上升,同时线程的上下文切换也会导致CPU开销增大,导致在高并发场景下性能下降严重;

  • 对于Nginx,一个worker进程只有一个主线程,通过事件驱动机制,实现循环处理多个准备好的事件,从而实现轻量级和高并发;


部署配置

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
yum -y groupinstall “Development tools”
yum -y groupinstall “Server Platform Development”
yum  install  gcc openssl-devel pcre-devel zlib-devel
groupadd -r nginx
useradd  -r -g nginx -s  /sbin/nologin  -M nginx
tar  xf nginx-1.4.7. tar .gz
cd  nginx-1.4.7
mkdir  -pv  /var/tmp/nginx
. /configure  \
   --prefix= /usr  \
   --sbin-path= /usr/sbin/nginx  \
   --conf-path= /etc/nginx/nginx .conf \
   --error-log-path= /var/log/nginx/error .log \
   --http-log-path= /var/log/nginx/access .log \
   --pid-path= /var/run/nginx/nginx .pid  \
   --lock-path= /var/lock/nginx .lock \
   --user=nginx \
   --group=nginx \
   --with-http_ssl_module \
   --with-http_flv_module \
   --with-http_stub_status_module \
   --with-http_gzip_static_module \
   --http-client-body-temp-path= /var/tmp/nginx/client/  \
   --http-proxy-temp-path= /var/tmp/nginx/proxy/  \
   --http-fastcgi-temp-path= /var/tmp/nginx/fcgi/  \
   --http-uwsgi-temp-path= /var/tmp/nginx/uwsgi  \
   --http-scgi-temp-path= /var/tmp/nginx/scgi  \
   --with-pcre
make  &&  make  install

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
vi  /etc/init .d /nginx  # 配置服务脚本
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
# Source function library.
/etc/rc .d /init .d /functions
# Source networking configuration.
/etc/sysconfig/network
# Check that networking is up.
"$NETWORKING"  "no"  ] &&  exit  0
nginx= "/usr/sbin/nginx"
prog=$( basename  $nginx)
NGINX_CONF_FILE= "/etc/nginx/nginx.conf"
[ -f  /etc/sysconfig/nginx  ] && .  /etc/sysconfig/nginx
lockfile= /var/lock/subsys/nginx
make_dirs() {
    # make required directories
    user=`nginx -V 2>&1 |  grep  "configure arguments:"  sed  's/[^*]*--user=\([^ ]*\).*/\1/g'  -`
    options=`$nginx -V 2>&1 |  grep  'configure arguments:' `
    for  opt  in  $options;  do
        if  [ ` echo  $opt |  grep  '.*-temp-path' ` ];  then
            value=` echo  $opt |  cut  -d  "="  -f 2`
            if  [ ! -d  "$value"  ];  then
                # echo "creating" $value
                mkdir  -p $value &&  chown  -R $user $value
            fi
        fi
    done
}
start() {
     [ -x $nginx ] ||  exit  5
     [ -f $NGINX_CONF_FILE ] ||  exit  6
     make_dirs
     echo  -n $ "Starting $prog: "
     daemon $nginx -c $NGINX_CONF_FILE
     retval=$?
     echo
     [ $retval - eq  0 ] &&  touch  $lockfile
     return  $retval
}
stop() {
     echo  -n $ "Stopping $prog: "
     killproc $prog -QUIT
     retval=$?
     echo
     [ $retval - eq  0 ] &&  rm  -f $lockfile
     return  $retval
}
restart() {
     configtest ||  return  $?
     stop
     sleep  1
     start
}
reload() {
     configtest ||  return  $?
     echo  -n $ "Reloading $prog: "
     killproc $nginx -HUP
     RETVAL=$?
     echo
}
force_reload() {
     restart
}
configtest() {
   $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
     status $prog
}
rh_status_q() {
     rh_status > /dev/null  2>&1
}
case  "$1"  in
     start)
         rh_status_q &&  exit  0
         $1
         ;;
     stop)
         rh_status_q ||  exit  0
         $1
         ;;
     restart|configtest)
         $1
         ;;
     reload)
         rh_status_q ||  exit  7
         $1
         ;;
     force-reload)
         force_reload
         ;;
     status)
         rh_status
         ;;
     condrestart|try-restart)
         rh_status_q ||  exit  0
             ;;
     *)
         echo  $ "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
         exit  2
esac
chmod  +x  /etc/init .d /nginx  # 复***务脚本执行权限
vi  /etc/nginx/nginx .conf  # 编辑主配置文件
worker_processes  2;
error_log   /var/log/nginx/nginx .error.log;
pid         /var/run/nginx .pid;
events {
     worker_connections  1024;
}
http {
     include       mime.types;
     default_type  application /octet-stream ;
     log_format  main   '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"' ;
     sendfile        on;
     keepalive_timeout  65;
     server {
         listen       80;
         server_name  xxrenzhe.lnmmp.com;
         access_log   /var/log/nginx/nginx .access.log  main;
         location / {
             root    /www/lnmmp .com;
             index  index.php index.html index.htm;
         }
         error_page  404               /404 .html;
         error_page  500 502 503 504   /50x .html;
         location =  /50x .html {
             root    /www/lnmmp .com;
         }
         location ~ \.php$ {
             root            /www/lnmmp .com;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
             include        fastcgi_params;
         }
     }
}
vi  /etc/nginx/fastcgi_params  # 编辑fastcgi参数文件
fastcgi_param  GATEWAY_INTERFACE  CGI /1 .1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

启动服务

1
2
3
4
service nginx configtest  # 服务启动前先验证配置文件是否正确
service nginx start
ps  -ef | grep  nginx  # 检查nginx进程,尤其是worker进程是否与worker_processes值一致
ss -antupl | grep  80  # 检查服务端口是否启动


性能测试

测试说明

  • 每次测试都进行3次,最后数据取平均值;

  • 对比测试中的Apache采用event的MPM机制,最大化提高Apache的并发性能;

  • 每次测试后,都需重新启动服务(httpd或nginx),以防止多次测试数据不准;

测试工具:webbench

  • 优点:比ab能更好的模拟并发请求,最大支持模拟30000并发连接;

测试方法

1
2
3
4
5
6
7
8
# 安装wenbench
wget http: //blog .s135.com /soft/linux/webbench/webbench-1 .5. tar .gz
tar  xf webbench-1.5. tar .gz
cd  webbench-1.5
make  &&  make  install
# 测试
webbench -c 100 -t 30 http: //172 .16.25.112 /nginx .html  # 测试静态文件访问
webbench -c 20 -t 30 http: //172 .16.25.112 /test_mem .php  # 测试动态文件访问

测试数据

wKioL1NhtBiS52YkAASYIFrVNRs148.jpg

wKiom1Nhtt-givVLAAOjJOAAG88376.jpg

分析趋势图

静态文件访问趋势图

wKiom1NhtF3zvg89AAJBFb4zDMI466.jpg

动态文件访问趋势图

wKioL1Nht7bDpQtgAAHlZnJGJrI312.jpg


总结

综合上面测试得出的趋势图可以看出:

  1. 静态文件测试时,低并发(200以下)情况下,Nginx和Apach的处理能力相当(2000pages/sec左右),当并发数超过200后,则Apache的处理能力开始下降,而Nginx保持稳定;同时随着并发量的增大,Apache令人诟病的内存占用和负载开始急剧上升,与此同时,Nginx在内存占用和负载方面的略微提升则可以忽略不计了;

  2. 动态文件测试时,低并发(100以下)情况下,Nginx和Apache的处理能力相当(650pages/sec左右),但Nginx的内存占用和负载峰值只有Apache的50%左右;在高并发情况下(100以上),Apach的动态处理能力开始下滑,当并发达到500时,开始出现失败的请求,说明此时已达到的Apache的处理上限了,而反观Nginx,虽然处理动态请求会消耗更多的内存,但其处理能力随着并发量的上升而上升,即使并发1000动态请求,也未达到其处理能力上限;

  3. 故不管是在静态文件请求还是动态文件请求方面,Nginx的性能都是强势优于Apache的;虽然可以通过系统调优的方式提高Apache的处理性能,但和Nginx相比,还是不足以打动技术狂热份子的吧,哈哈!










本文转自 xxrenzhe11 51CTO博客,原文链接:http://blog.51cto.com/xxrenzhe/1405272,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,它在网络编程技术领域中被广泛应用。本文将详细介绍Nginx的概念和实践,包括其核心原理、功能特点、优势和应用场景等方面。同时,还将深入探讨如何使用Nginx进行高性能网络编程,结合实际案例进行分析。
|
8月前
|
应用服务中间件 Linux nginx
Linux系列——Nginx的安装、测试详解以及关于Nginx的常用命令介绍
Linux系列——Nginx的安装、测试详解以及关于Nginx的常用命令介绍
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
177 0
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
在当今互联网时代,高性能网络编程技术越来越受到重视。Nginx 作为一款高性能、高可靠性的 Web 服务器,拥有广泛的应用和优异的性能表现。本文将介绍 Nginx 的基本概念、架构以及实践技巧,帮助读者更好地理解和使用这一工具。
|
3月前
|
应用服务中间件 nginx
nginx中的定时器源码分析与测试
nginx中的定时器源码分析与测试
17 0
|
5月前
|
应用服务中间件 API nginx
通过 docker 学习 nginx,附全部配置及 API 测试,使用 apifox 直接打开
本篇文章以前端的视角,介绍下 nginx 的常见配置,并通过 docker 的方式学习 nginx,这保证所有实例配置都能正常运行。
|
9月前
|
缓存 负载均衡 算法
Nginx:为什么高性能?Master&worker如何配合?负载均衡算法有哪些?七层和四层负载均衡了解吗?
Nginx:为什么高性能?Master&worker如何配合?负载均衡算法有哪些?七层和四层负载均衡了解吗?
|
10月前
|
存储 人工智能 Cloud Native
高性能存储SIG月度动态:io_uring支持nvme直通,DSMS完成开发测试
Cloud Kernel SIG 月度动态送达,一键了解 5 月各项目进展。
|
应用服务中间件 网络安全 PHP
测试nginx
测试nginx
596 0