Software Development •
软件开发
Electronic Technology & Software Engineering 电子技术与软件工程• 47
【关键词】Windows 服务器 Nginx 反向代理 高并发
1 引言
Nginx 是高性能的Http 和反向代理服务器,在Linux 环境下,其可以采用epoll 作为网络I/O 模型。在高并发连接的情况下,其是Apache 服务器不错的替代品。Nginx 具有高并
Windows 环境下的Nginx 高并发实现
文/岳晋 温宇 黄旻亮
发连接、内存占用低、成本低等特点。
Nginx 运行时,会存在一个主进程和多个工作进程。工作进程的数目可以在配置文件中进行指定,通常设置为CPU 的核数。主进程用于管理工作进程的运行,并处置工作进程的异常情况。借助于主进程和工作进程的模式,Nginx 可以实现平滑升级、配置即时生效等功能。而工作进程的任务相对单一,主要用于处理业务请求,它们彼此独立,互不影响。此外,借助于异步非阻塞的工作机制,Nginx 可以处理上万的并发请求。
反向代理是Nginx 的主要应用场景之一。
反向代理是相对于正向代理来说,一般情况下,内网的客户机通过代理服务器访问公网上服务的这种模式是正向代理。与此相反,当代理服务器的作用是将后台服务器隐藏起来,并根据客户机的请求,分发给后台服务器的这种方式是反向代理。Nginx 反向代理的原理如图1所示。
图1中,Nginx 代理服务器接收到来自客户端的请求,根据自己的配置,决定将该请求转发给哪个业务服务器。当业务服务器处理完
该请求后,将响应结果交给Nginx 代理服务器,Nginx 代理服务器再将响应内容返回给客户机。
反向代理可以保护后端服务器,此外,还可以用作负载均衡,来平衡后端服务器的性能压力。Nginx 通过proxy_pass 命令和upstream 模块,就可以实现反向代理。如果后台服务和Nginx 在同一机器上,但运行在不同的端口上,Nginx 可以将请求转发到后台服务运行的端口上。通常情况下,后台服务和Nginx 不在一台服务器上,这时候Nginx 可以将请求发送给upstream 模块,再通过upstream 模块转发给后台服务器。而且在upstream 模块中,也可以进行负载均衡相关的配置。
Nginx 的另一主要应用场景是负载均衡。负载均衡是在各服务器之间均衡业务压力,Nginx 的负载均衡策略包括轮询、指定权重、fair 、ip_hash 和url_hash 等。
2 Nginx性能调优相关配置
2.1 stub_status监控模块
得以提高。随着大量产品的借用,构件会趋于成熟,软件BOM 表也随之趋于成熟。这有利于同领域的其他产品借用或者部分借用。
对生产率的影响:一般来说,大约80%~90%的复用可使软件生产率提高25%~40%。
对成本的影响:软件复用率越高时,新研构件越少,耗费的人力成本和时间成本都会大大降低。
对管理的影响:在PDS 等系统中归档了的软件BOM 表,记录了关于该产品所用的所有软件构件的数据信息,如构件的名称、版本、基本内容、复用/新研等信息,以及构件与构件之间的嵌套关系。它对于质量管理中从最终产品追溯零件、组件起到关键作用。软件BOM 表以信息共享为基础,是综合管理、资源调度的重要依据。另外,软件BOM 表中复用/新研的数据也可作为安排软件开发计划的依据。
6 结束语
本文针对基于软件BOM 的构件化开发过
<<;上接46页
程,阐述了软件BOM 的设计流程、设计形式及其应用价值。可以看出在构件化软件开发过程中,软件BOM 设计是不可缺少的重要环节。软件BOM 在“工厂”式的软件加工过程中起着连接设计与制造的纽带作用,对提高软件生产率和软件质量、降低软件开发成本都起着至关重要的作用。因此,做好软件需求分析、软件BOM 设计、构件设计、构件测试等,且每个环节都进行专家审核和评审,才能有效地提高软件开发的质量,推动软件工程的发展。
参考文献
[1]史济民.软件工程原理、方法与应用[M].
北京:高等教育出版社,1990.
[2]李航.基于通用试验体系结构支撑
平台的组件框架设计模式[J].软件,2013,34(5):85-87.
[3]刘凤.基于软件构件技术的阮建华雷达
[J].现代雷达,2016(2).
[4]STEPHEN M, WELBY P. Modular open
s y s t e m s a r c h i t e c t u r e i n D o D acquisition[R]. Washington: DOPSR,
2014.
[5]NELSON J A. Radar open system
a r c h i t e c t u r e p r o v i d e s n e t centricity[J]. IEEE Aerospace and Electronic Systems Magazine, 2010, 25(10):17-20.
[6]Wang Yongliang, Ding Qianjun,
L i R o n g f e n g. A d a p t i v e A r r a y Processing[M]. Bejing: Tsinghua University Press, 2009.
[7]Karl Wiegers, Joy Beatty.软件需求[M]
北京:清华大学出版社,2016,8-12.[8]莱芬韦尔,威德里格.软件需求管理:
统一化方法[M].北京:高等教育出版社,2002:18-21.
作者简介
王艳丽(1981-),女,硕士研究生。工程师。研究方向为雷达信号处理。
作者单位
南京电子技术研究所 江苏省南京市 210039
软件开发 •Software Development
Windows版本的Nginx默认开启了stub_ status模块来查看Nginx的一些状态信息。此
外,还需要在f(Nginx的主要配置
文件)中增加如下配置。
location /nginx_status{
stub_status;
allow 127.0.0.1;
}
这样,通过访问对应的url就可以打开监
控页面。监控页面上的监控数据如下所示:Active connections: 6
Server accepts handled requests:
12053 12053 17528
如何设置代理服务器Reading: 0 Writing: 2 Waiting: 4
其中,active connection 6; 对上游服务发
起的连接数,需要注意的是,如果reading或
者writing的值很高,说明正在处理的数据量
较大,可能是因为后台服务处理慢,这个时候
需要对后台进行优化。
在使用长连接的情况下,waiting的值代表有多少个连接在等待新的请求。waiting表明Nginx已经将请求处理完毕,并且把数据返回给了客户端,该连接已经闲置,正在等待下一次请求。因此,这个值比较高说明请求处理得很快。一般应是writing和reading越小越好,而waiting越高越高。
2.2 优化性能相关的配置参数
为获取较高的并发性能,需要对Nginx的主要配置参数进行调优。主要的配置参数及调优如下。
2.2.1 multi_accept on
如果multi_accept被禁止了,Nginx的一个工作进程只能同时接受一个新的连接,否则,一个工作进程
可以接受所有的新连接。这个时候在监控页面上看到的active connections通常是很低的,因此,需要开启该参数,该配置对于提高Nginx的并发至为关键。
2.2.2 worker_processes
worker_processes后面的数值一般设置为CPU的核数,代表Nginx开启的工作进程的数目。例如,worker_processes 8代表开启8个工作进程。
2.2.3 worker_connections
配置一个工作进程能够处理的并发连接请求的数目。考虑高并发场景,将其设置为一个比较大的值。例如,worker_connections 40960,在Windows服务器下,该参数一般不超过65535。
2.2.4 worker_rlimit_nofile
配置一个工作进程能够打开的文件句柄数上限。在高并发场景下,也需要设置为比较大的值,例如,worker_limit_nofile 40960。2.2.5 sendfile
将该参数打开可以提高发送文件的效率,采用如下配置打开此参数,sendfile on。2.2.6 tcp_nopush
打开tcp_nopush后,将会在发送响应时,
把整个响应头放在一个tcp包中发送,能够达
到优化吞吐的效果,建议打开。
2.2.7 tcp_nodelay
该参数打开后,会关闭Nagle算法,保证
高频发送小数据报文的实时性,建议打开。
2.2.8 access_log
设置为on时,会保存Nginx代理的访问
请求。将这个设置关闭,会降低磁盘IO而提
升速度。在生产环境,当确保Nginx不会出现
问题后,可以将该参数设置为off。
2.2.9 gzip
该参数设置是否压缩发送数据,建议打
开。gzip_comp_level 数据压缩的等级,可以
是1~9的任意一个值,9表示最慢但最高比例
的压缩。gzip_types 设置gzip的类型。
2.2.10 open_file_cache
open_file_cache 缓存最大数目及超时时
间。 open_file_cache_vaild 用于设置检测缓存
源文件是否超时的时间间隔。open_file_cache_
min_uses设置缓存文件最小访问次数。open_
file_cache_errors设置是否保存缓存文件的错
误信息。
2.2.11 proxy_buffering
proxy_buffering该参数用于设置是否开
启响应内容的缓冲。如果关闭该参数,那么
proxy_buffers和proxy_busy_buffers_size的配
置将无效。但是,proxy_buffer_size是否生效
与proxy_buffering参数的设置无关。如果开启
proxy_buffering下,响应内容会被Nginx先存
入缓冲区中,之后再传递给客户端。缓存区的
临时文件由proxy_max_temp_file_size
和proxy_temp_file_write_size决定。当内
存中的无非存储响应内容时,会在磁盘中存储
部分响应内容。
当关闭proxy_buffering后,Nginx不再
缓存后端返回的响应内容,而是直接传递给
客户端。proxy_buffers配置接收一次响应的
buffer个数和每个buffer的大小。proxy_busy_
buffers_size 如果系统很忙的时候,可以申请
更大的proxy_buffers,官方推荐乘2。proxy_
temp_path path配置临时文件目录,proxy_
temp_file_write_size缓存临时文件的大小,
proxy_max_temp_file_size 配置所有临时文件
的总大小。配置实例如下,
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; proxy_temp_
file_write_size 64k; proxy_max_temp_file_size
1024m;
2.2.12 keepalive
为提高并发能力,需要对长连接进行优
化。主要包括keepalive_timeout和keepalive_
requests,keepalive_timeout表示keepAlive的
超时时间,也就是在超时时间内,如果客户端
没有后续请求过来,Nginx就会断掉这个Tcp
连接。如果设置为0,表示禁用keepAlive。
keepalive_timeout表示一个长连接,Nginx处
理的请求上限,keepalive_timeout可以根据实
际情况设置为一个较大的值。
3 Windows服务器下实现Nginx高并发的
关键操作
3.1 采用Windows专用版本的Nginx
在实际压测并发能力的过程中,发现当
并发超过1023后,Nginx会拒绝连接,并打
印错误日志“maximum number of descriptors
supported by select() is 1024 while waiting for
request”。主要原因是在Windows
环境下,
图1:Nginx反向代理处理流程
48 •电子技术与软件工程 Electronic Technology & Software Engineering
Software Development •
软件开发
Electronic Technology & Software Engineering 电子技术与软件工程• 49
尽管修改了worker_connections ,但无法生效。为解决此问题,可以在网站/en/download.html 上获取修改了最大文件描述符限制的Nginx 版本,该版本的Nginx 尽管无非使用epoll 机制,但该专用版本已经提供了尽可能多的功能,并针对Windows 环境做了优化,其可以支持每秒几千到几万的并发请求。并且,其商业版本也可以提供付费的技术支持服务。因此,在Windows 环境下,为提高并发能力,需使用Windows 专用版本的Nginx 。
3.2 解决高并发情形下的Windows服务器TCP连接端口耗尽问题
在每秒创建的新连接比较多且持续创建的情况下,运行一段时间后,Nginx 会拒绝连接,并打印错误日志。“An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue is full while connecting to upstream ”,该报错的原因主要有两种情况,第一种就是TCP 连接端口耗尽,第二种是超过了socket 队列能够处理的最大连接。其中,第二种情况可以通过配置backlog 解决,如,listen 8080 backlog=40960。
第一种TCP 连接端口耗尽的情况,在Windows 环境下比较难处理。Windows server 2008在默认情况下,给TCP 连接提供的端口只有16384个,可以通过在命令行输入“netsh int ipv4 show dynamicport tcp ”查看。对于每个新的客户端连接,Nginx 除了和客户端建立连接外,和后端服务器也建立了一个
临时的TCP 连接。这个临时的TCP 连接就是端口耗
尽的根源
根据TCP/IP 原理,TCP 连接在进行“四次挥手”断开连接时,首先断开连接的一方会进入“timewait ”状态,在timewait 状态内,由(源ip ,源端口,目的ip ,目的端口)组成的四元组是不允许被重用的。
针对TCP 连接端口耗尽问题,在Windows 服务器上,可以通过多种方式改善该问题,第一种是通过“netsh int ipv4 set dynamicport tcp start=5000 num=60000”,增加TCP 连接的可用端口数。第二种是通过在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\service\Tcpip\Parameters 增加TcpTimedWaitDelay 的REG_DWORD 参数,并将其设置为30。这种方法是将TCP 连接timewait 的时间(范围为30秒到240秒)降低为30秒,修改完成后,重启机器生效。
此外,还可以对客户端请求进行限速,对单个ip 短时间内多个TCP 连接排队处理。
另外,可以在upstream 中配置keepalive xxx ,其中xxx 可以设置为1000。原因是nginx 和后端服务器之间的连接为短连接,且无连接复用,这样在高并发场景下,会造成端口的耗尽。通过以上配置,并配合proxy_http_version 1.1和proxy_set_header Connection "",就可以较好地解决端口耗尽问题。
通过对配置的调优,在Windows 环境下,也达到了上万的活跃连接数,如下监控数据所
示。
Active connections: 10003Server accepts handled requests: 559064 559064 7196725Reading: 0 Writing: 6678 Waiting: 3324使用Nginx 反向代理某一Web 服务,并使用LoadRunner 进行压力测试,模拟5000用户并发访问该服务,其测试结果如图2所示。
图2中,第一行的图代表用户的并发数,其是从0逐渐增加到5000,然后再下降到0。第二行的图是HPS (hits per second )的结果图,图中瞬时HPS 可以达到2500以上,说明该方案在Windows 环境下可以提供较高的并发能力。
4 结论
Windows 环境下,Nginx 的并发性能会存在一定的瓶颈。本文通过对Nginx 的主要配置进行调优,并采用Windows 专用版本的Nginx ,较好地解决了高并发情形下TCP 连接端口耗尽等性能瓶颈,并实现了Windows 生产环境下的Nginx 高并发处理。
参考文献
[1]张宴.实战Nginx:取代Apache 的高性能
Web 服务器[M].电子工业出版社,2010.[2]曹辉,孙麒.基于Nginx 的智慧社区家政
服务系统的设计和研究[J].工业控制计算机,2017(30):57-59.
[3]冯贵兰,李正楠.Nginx 反向代理在高校
网站系统中的应用研究[J].网络安全技术与应用,2017(6):111-111.
[4]张岚.空中交通管理信息系统高可
用性技术[J].指挥信息系统与技术,2014,5(2):41-44.
[5]戴华.基于Nginx 和Memcached 的高并发
Web 服务器设计[D].复旦大学,2013.[6]金刚,郑志荣.面向云计算环境的安
全服务平台[J].指挥信息系统与技术,2016,7(6):81-86.
[7]Butler T. NGINX Cookbook[M]. Packt
Publishing Ltd, 2017.
[8]吴阳波,梁树刚.基于Nginx 与Http2.0
技术的Web 服务器性能优化研究[J].新余学院学报,2017,22(4):6-8.
[9]姚兆凡.轻量级Web 服务器Nginx 的研究
与优化[D].南京邮电大学,2017.
作者简介
岳晋,现为中国电子科技集团公司第二十八研究所软件开发工程师。
温宇,现为中国电子科技集团公司第二十八研究所软件开发工程师。
黄旻亮,现为中国电子科技集团公司第二十八研究所软件开发工程师。
作者单位
中国电子科技集团第二十八研究所 江苏省南
京市 210007
图2:10秒思考时间下,LoadRunner 模拟5000用户并发压测某业务结果
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论