高并发下的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限流)

1.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中只对单独的location有效
该配置表明:客户端的并发连接数只能是10个

2.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有效
rate=1r/s的意思是每个地址每秒只能请求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,120块令牌发完后,多出来的请求就会返回503

3.ngx_http_upstream_module(推荐)

#提供了我们需要的后端限流功能的
upstream xxx{
    server 127.0.0.1:8080 max_conns=10;
    server 127.0.0.1:8081 max_conns=10;
}

高并发下的nginx安全配置

#版本安全
http{
    server_tokens off;
}

#IP安全
#白名单配置:
location / {
    allow 192.168.1.1;
    deny all;
}

#黑名单配置:
location / {
    deny 192.168.1.1;
    allow all;
}

#文件安全
location /logs{
    autoindex on;
    root /opt/nginx/;
}

location ^/logs~*\.(log|txt)$ {
    add_header Content-Type text/plain;
    root /opt/nginx/;
}

#连接安全
HTTPS开启

nginx配置进程数、并发数、系统优化

#调整nginx的主配置文件,增加并发量
    worker_processes 2;    #调整到与CPU数量一致
    events{
        worker_connection 65535;
    }

#调整内核参数
[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长连接

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

场景:
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压缩

gzip压缩作用:将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节 约带宽,并提⾼响应⾄客户端的速度,压缩会消耗nginx的cpu性能。
gzip压缩可以配置http,server和location模块下

高并发下nginx状态监控

#配置nginx的监控选项(配置文件路径:nginx.conf)
#添加如下代码:
#设定nginx状态访问地址
location /NginxStatus{
    stub_status on;
    access_log off;
}
#插件安装:
./configure --prefix=/opt/nginx/ --with-http_stub_status_module

#配置完成重启nginx
#配置完成后在浏览器中输入
http://192.168.1.1/NginxStatus查看

#参数说明:
#活跃的连接数量 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]}'

#解析: 
CLOSED #无连接是活动的或正在进行 
LISTEN #服务器在等待进入呼叫 
SYN_RECV #一个连接请求已经到达,等待确认 
SYN_SENT #应用已经开始,打开一个连接 
ESTABLISHED #正常数据传输状态/当前并发连接数 
FIN_WAIT1 #应用说它已经完成 
FIN_WAIT2 #另一边已同意释放 
ITMED_WAIT #等待所有分组死掉 
CLOSING #两边同时尝试关闭 
TIME_WAIT #另一边已初始化一个释放 
LAST_ACK #等待所有分组死掉

你可能感兴趣的:(Nginx)