如何测试Nginx的高性能

简介

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

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

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

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

  重要特点

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

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

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

  基础架构

  Nginx如何实现高并发:

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

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

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

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

  部署配置

  安装


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

配置:


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;

  启动服务:

  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并发连接;

 测试方法


# 安装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 # 测试动态文件访问

  测试数据

  分析趋势图

  静态文件访问趋势图

  动态文件访问趋势图

  

  总结

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

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

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

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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-04 04:51:43

如何测试Nginx的高性能的相关文章

测试Nginx的高性能

简介 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器: 作为一款轻量级的Web服务器,具有占有内存少,并发能力强等优势,是高连接并发场景下Apache的不错的替代品: 本篇主要介绍Nginx作为Web服务器时,相对于Apache的性能优势: 下一篇将会介绍Nginx作为方向代理服务器的实现: 重要特点 非阻塞:数据复制时,磁盘I/O的第一阶段是非阻塞的: 事件驱动:通信机制采用epoll模型,支持更大的并发连

Nginx服务器高性能优化的配置方法小结_nginx

通常来说,一个优化良好的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,然而我的 Nginx 服务器可以稳定地达到 904,000 次/秒 的处理性能,并且我以此高负载测试超过 12 小时,服务器工作稳定. 这里需要特别说明的是,本文中所有列出来的配置都是在我的测试环境验证的,而你需要根据你服务器的情况进行配置: 从 EPEL 源安装 Nginx: yum -y install nginx 备份配置文件,然后根据你的需要进行配置: cp /e

nginx实现高性能和可扩展性设计模式

NGINX的整体架构的特点是由一组进程协同工作: 主进程:负责执行特权操作,如阅读配置文件.绑定套接字.创建/通知协调(Signalling)子进程.工作进程:负责接收和处理连接请求,读取和写入磁盘,并与上游服务器通信.当NGINX处于活跃状态时,只有工作进程是忙碌的.缓存加载器进程:负责将磁盘高速缓存加载到内存中.这个进程在启动时运行后随即退出.缓存管理器进程:负责整理磁盘缓存的数据保证其不越界.这个进程会间歇性运行. NGINX能够实现高性能和可扩展性的关键取决于两个基本的设计选型: 尽可能

【nginx+lua高性能web应用开发(一):环境搭建】

1,官方网站: http://openresty.org/ 作者很NB,国人开发的. 2,安装nginx+lua环境 直接从openresty下载源代码进行编译安装,已经包括了一个最新的nginx代码. 我使用的是64bit的centos搭建环境的. 首先按照所需要的lib库.(lib必须安装否则编译出现问题) yum -y install gcc gcc-c++ autoconf make pcre-devel openssl openssl-devel wget http://openres

用Nginx + Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高;如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀;目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行;而目前市面上

【转】使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行:而目前市面上

《高性能Linux服务器构建实战》——1.7节实战Nginx与PHP(FastCGI)的安装、配置与优化

1.7 实战Nginx与PHP(FastCGI)的安装.配置与优化 1.7.1 什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTTP server都支持FastCGI,包括Apache.Nginx和lighttpd等.同时,FastCGI也被许多脚本语言支持,其中就有PHP. FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执

《高性能Linux服务器构建实战》——1.8节实战Nginx与Perl、Java的安装与配置

1.8 实战Nginx与Perl.Java的安装与配置 通过前面的介绍,可以对Nginx有了一个比较全面的认识:Nginx本身是一个静态的HTTP服务器和反向代理服务器,它不支持动态页面,所谓的Nginx对动态程序的支持都是通过反向代理功能实现的.下面要讲述的Nginx对Perl和JSP的支持,就是通过Nginx的反向代理功能来完成的.Nginx对Perl和JSP的支持在实现细节上可能有一定差别,但是实现原理是完全一样的. Nginx的安装这里不再讲述,假定Nginx的安装路径为/usr/loc

Ubuntu中Nginx服务器安装配置教程

  Nginx是一个非常轻量级的HTTP服务器,也是一个高性能的HTTP和反向代理服务器,同时还是一个IMAP/POP3/SMTP 代理服务器. 1.对PHP支持 目前各种web 服务器对PHP的支持一共有三种: (1)通过web 服务器内置的模块来实现,例如Apache的mod_php5,类似的Apache内置的mod_perl可以对perl支持. (2)通过CGI来实现,这个就好比之前perl的CGI,该种方式的缺点是性能差,因为每次服务器遇到这些脚本都需要重新启动脚本解析器来执行脚本然后将