3高并发下Nginx优化

Posted 乘风归来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3高并发下Nginx优化相关的知识,希望对你有一定的参考价值。

  1. 高并发架构分析
  2. 高并发下nginx配置限流
  3. 高并发下Nginx安全配置
  4. Nginx配置优化之进程数、并发连接数、系统优化 
  5. Nginx配置优化之长连接
  6. Nginx配置优化之压缩
  7. Nginx配置优化之状态监控
  8. Nginx与其它解决方案搭配组合


高并发架构分析

什么是高并发? 

  • 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是 指,通过设计保证系统能够同时并行处理很多请求。 

  • 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查 询率QPS(Query Per Second),并发用户数等

  • •  响应时间:系统对请求做出响应的时间

  • • 吞吐量:单位时间内处理的请求数量。

  • • QPS:每秒响应请求数


如何提升系统的并发能力? 

互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。 

 垂直扩展:提升单机处理能力。垂直扩展的方式又有两种。 

• 增强单机硬件性能 • 提升单机架构性能 

水平扩展:只要增加服务器数量,就能线性扩充系统性能。


高并发下Nginx配置限流

三种方式实现: 

• limit_conn_zone 

• limit_req_zone 

• ngx_http_upstream_module

前两种只能对客户端(即单一ip限流)

Ab工具:

• Centos安装:yum install httpd-tools –y 

• 测试:ab -c 10 -n 1000 http://www.test.com/

• limit_conn_zone

http{  limit_conn_zone $binary_remote_addr zone=one:10m;  server {  ......  limit_conn one 10; ......  }  }

• 其中“limit_conn one 10”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效

• 该配置表明:客户端的并发连接数只能是10个。

• limit_req_zone


http{  limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; server {  ......  limit_req zone=req_one burst=120; ......  }  }

• 其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,也可以放在location中只对单独的location有效


• ngx_http_upstream_module(推荐)

• 该模块是提供了我们需要的后端限流功能的

• 该模块有一个参数:max_conns可以对服务端进行限流,可惜在商业版nginx中才能使用

• 在nginx1.11.5版本以后,官方已经将该参数从商业版中脱离出来了,也就是说只要我们将生产 上广泛使用的nginx1.9.12版本和1.10版本升级即可使用

upstream xxxx{ server 127.0.0.1:8080 max_conns=10; s erver 127.0.0.1:8081 max_conns=10;  }  

高并发下Nginx安全配置

Nginx配置优化之进程数、并发连接数、系统优化 

 调整Nginx的主配置文件,增加并发量 


worker_processes 2;#调整到与CPU数量一致 events { worker_connection 65535; #每个worker最大并发连接数 }

调整内核参数 

[root@proxy ~]# ulimit -a #查看所有的属性值 [root@proxy ~]# ulimit -Hn 100000 #临时设置硬限制 [root@proxy ~]# ulimit -Sn 100000 #设置软限制 [root@proxy ~]# vim /etc/security/limits.conf ... * soft nofile 100000 * hard nofile 100000用户/组 软/硬限制 需要限制的项目 限制的值

验证

[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.136.131/ #自己访问自己,测试一下配置效果

Nginx配置优化之长连接

lnginx长连接短连接,可以增强服务器的容灾能力 

场景

HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应, 减少了建立和关闭连接的消耗和延迟。如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被转换 成短连接发送给服务器端,为了支持长连接,我们需要在nginx服务器上做一些配置 

要求: 

使用nginx时,想要做到长连接,我们必须做到以下两点: 

1:从client到nginx是长连接 

2:从nginx到server是长连接 

对于客户端而言,nginx其实扮演着server的角色,反之,之于server,nginx就是一个client

配置: 

我们要想做到Client与Nginx之间保持长连接,需要:

1:Client发送过来的请求携带"keep-alive"header。

2:Nginx设置支持keep-alive

Nginx配置优化之压缩

  • lgzip压缩作用:将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节 约带宽,并提⾼响应⾄客户端的速度,压缩会消耗nginx的cpu性能。 

  • gzip压缩可以配置http,server和location模块下

Nginx配置优化之状态监控
配置Nginx的监控选项(配置文件路径:nginx.conf) 

添加如下代码: 

location /NginxStatus { stub_status on; access_log off; }
插件安装:./configure --prefix=/opt/nginx/ --with-http_stub_status_module

配置完成重启Nginx 

配置完成后在浏览器中输入http://192.168.136.131/NginxStatus查看


Nginx与其它解决方案搭配组合

参数说明:

  • #活跃的连接数量 

  • active connections 

  • #总共处理了n个连接 , 成功创建n次握手, 总共处理了n个请求 

  • server accepts handled requests 

  • #每个连接有三种状态waiting、reading、writing

  • reading —读取客户端的Header信息数.这个操作只是读取头部信息,读取完后马上进入

  • writing状态,因此时间很短 writing — 响应数据到客户端的Header信息数.这个操作不仅读取头部,还要等待服务响应,因此时间比较长。

  • waiting — 开启keep-alive后等候下一次请求指令的驻留连接. 

  • 正常情况下waiting数量是比较多的,并不能说明性能差。反而如果reading+writing数量比较多说明服务并发有问题。


查看Nginx并发进程数:ps -ef|grep nginx | wc -l 查看Web服务器TCP连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
查看Web服务器TCP连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'



以上是关于3高并发下Nginx优化的主要内容,如果未能解决你的问题,请参考以下文章

1. 网站高并发下的测试指标及优化泛谈

HttpClient高并发下性能优化-http连接池

Netty高并发下数据丢失问题与性能优化配置

再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化

高并发下减少锁竞争

高性能可扩展MySQL数据库Mysql优化性能提升高并发下的数据库设计