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; }
posted on 2020-01-20 00:39 Nicholas-- 阅读(589) 评论(0) 编辑 收藏 举报