nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存

nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存

一、Nginx优化目的

标准情况下,软件默认的参数都是对安装软件的硬件标准来设置的,目前我们服务器的硬件资源远远大于要求的标准,所以为了让服务器性能更加出众,充分利用服务器的硬件资源,我们一般需要优化APP的并发数来提升服务器器的性能。

总结来说:1.服务器大并发实现;2.提升用户体验;3.为公司省钱。

二、工作进程优化

1) worker_processes

worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_processes的值直接修改为CPU的核数。

 

Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l

worker_processes 4;

  

 

2)worker_cpu_affinity

为每个进程分配cpu,一般是一个cpu一个进程

双核配置

worker_processes 2;worker_cpu_affinity 0101 1010;

  

比如4核配置:

worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;

  

比如8核配置:

worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;

  

worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。

 

通过

ps -eo psr,pid,args |grep 'nginx'

  

命令查看nginx进程在cpu的分配情况

3)worker_connections

Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数

总并发= worker_processes* worker_connections

为了最大化Nginx的全部潜力,应将工作者连接设置为核心一次可以运行的允许的最大进程数1024。

 

放置位置:events 标签  

events {
    worker_connections  1024;    #一个worker进程的并发
}
 

  

 

三、长连接设置

什么是长连接,为什么要使用长连接?

设置长连接是为了减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销,主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。

而http协议是一个无状态协议, 每次进行通讯都要三次握手四次挥手,那服务器就需要经常去维护握手和断开。 服务器压力过大、浪费的资源也过多。   因此一般都需要开启长连接,在第一个请求结束后,等一段时间,如果这个时间内,再有请求过来,则不断开连接,直接将数据发送给客户端。这样就降低了握手和挥手的次数和频率。

 

长连接配置方法

# 关闭长连接:0代表关闭 
keepalive_timeout 0; 

# 开启长连接
# keepalive_timeout 65;

# 一个长连接处理最大请求数(定期释放内存,防止内存溢出)
# keepalive_requests 8192;

  

长连接状态查看

关闭长连接时:

# 浏览器访问完立刻进入TIME_WAIT状态(主动关闭)
[root@localhost nginx]# netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5999/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      885/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1057/master         
tcp        0      0 192.168.199.228:80      192.168.199.168:5589    ESTABLISHED 6000/nginx: worker  
tcp        0      0 192.168.199.228:80      192.168.199.168:5583    TIME_WAIT   -                   
tcp        0      0 192.168.199.228:80      192.168.199.168:5584    TIME_WAIT   -                   
tcp        0      0 192.168.199.228:22      192.168.199.168:7834    ESTABLISHED 5531/sshd: root@pts 
tcp        0     36 192.168.199.228:22      192.168.199.168:5530    ESTABLISHED 5942/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      885/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1057/master         
[root@localhost nginx]# 

# 一段时间后连接消息消失
[root@localhost nginx]# netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5999/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      885/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1057/master         
tcp        0      0 192.168.199.228:80      192.168.199.168:5589    FIN_WAIT2   -                   
tcp        0      0 192.168.199.228:22      192.168.199.168:7834    ESTABLISHED 5531/sshd: root@pts 
tcp        0     36 192.168.199.228:22      192.168.199.168:5530    ESTABLISHED 5942/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      885/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1057/master         
[root@localhost nginx]# 

  开启长连接时:

# 由于前面设置长连接超时时间是65秒,这段时间内一直保持在ESTABLISHED状态:
[root@localhost nginx]# netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6010/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      885/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1057/master         
tcp        0      0 192.168.199.228:80      192.168.199.168:5875    TIME_WAIT   -                   
tcp        0      0 192.168.199.228:22      192.168.199.168:7834    ESTABLISHED 5531/sshd: root@pts 
tcp        0      0 192.168.199.228:80      192.168.199.168:5876    FIN_WAIT2   -                   
tcp        0      0 192.168.199.228:80      192.168.199.168:5915    ESTABLISHED 6011/nginx: worker  
tcp        0      0 192.168.199.228:22      192.168.199.168:5530    ESTABLISHED 5942/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      885/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1057/master         
[root@localhost nginx]# 

# 时间超时长连接断开
[root@localhost nginx]# netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6010/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      885/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1057/master         
tcp        0      0 192.168.199.228:22      192.168.199.168:7834    ESTABLISHED 5531/sshd: root@pts 
tcp        0     36 192.168.199.228:22      192.168.199.168:5530    ESTABLISHED 5942/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      885/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1057/master         
[root@localhost nginx]# 

  

keepalived_timeout :客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。值为0会禁用keep-alive客户端连接。

keepalive_requests指令用于设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。这个参数的真实含义,是指一个keep alive建立之后,nginx就会为这个连接设置一个计数器,记录这个keep alive的长连接上已经接收并处理的客户端请求的数量。如果达到这个参数设置的最大值时,则nginx会强行关闭这个长连接,逼迫客户端不得不重新建立新的长连接。

大多数情况下当QPS(每秒请求数)不是很高时,默认值100凑合够用。但是,对于一些QPS比较高(比如超过10000QPS,甚至达到30000,50000甚至更高) 的场景,默认的100就显得太低。 简单计算一下,QPS=10000时,客户端每秒发送10000个请求(通常建立有多个长连接),每个连接只能最多跑100次请求,意味着平均每秒钟就会有100个长连接因此被nginx关闭。同样意味着为了保持QPS,客户端不得不每秒中重新新建100个连接。因此,就会发现有大量的TIME_WAIT的socket连接(即使此时keep alive已经在client和nginx之间生效)。因此对于QPS较高的场景,非常有必要加大这个参数,以避免出现大量连接被生成再抛弃的情况,减少TIME_WAIT。

浏览器上查看连接状态

关闭长连接时:

  

开启长连接时:

四、数据压缩

nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。

一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了

节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源

 

gzip on;                            #表示开启压缩功能
​
gzip_proxied any;                             #(nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
​
gzip_min_length  1k;                  #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大
​
gzip_buffers     4 32k;                 #压缩缓存区大小,设置压缩所需要的缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 
​
gzip_http_version 1.1;                #压缩版本,设置gzip压缩针对的HTTP协议版本
​
gzip_comp_level 6;                  #压缩比率, gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,
​
gzip_disable "MSIE [1-6].";                  #IE6及以下禁止压缩 
​
gzip_types  text/css text/xml application/javascript;  #指定压缩的类型,进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
​
gzip_vary on;                   #vary header支持, 是否在http header中添加Vary: Accept-Encoding,建议开启

  

其中

gzip_proxied expired/no-cache/no-store/private/auth/any; (选择一个)
# Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。  
# off - 关闭所有的代理结果数据的压缩  
# expired - 启用压缩,如果header头中包含 "Expires" 头信息  
# no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息  
# no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息  
# private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息  
# no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息  
# no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息  
# auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息  
# any - 无条件启用压缩  

  

五、客户端缓存

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires缓存配置在server字段里面。

 

将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。

 

缓存图片

expires指令:开启缓存并指定静态缓存时间

location ~*  .(png|gif)$ {
              expires 1h;
         }

  

缓存图片、css、js等

location ~*  .(jpg|jpeg|png|gif|ico|css|js)$ {
   expires 1d;
}
 

  

原文地址:https://www.cnblogs.com/Nicholas0707/p/12216121.html