Nginx相关性能优化
Posted 小白的成功进阶之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx相关性能优化相关的知识,希望对你有一定的参考价值。
一、考虑方面:
- 【1】硬件方面:CPU、磁盘、IO、内存(负载、内存、系统稳定性、使用率、是否有损坏)
- 【2】网络方面:网络流量是否有延迟、是否丢包
- 【3】系统方面:文件描述符(文件句柄)【默认读取文件的时候都会占用文件描述符,系统默认是1024个,可进行调整】
- 【4】应用方面:保持长链接http协议和time_wait
- 【5】服务方面:静态资源服务优化
二、压力测试工具 ab ——评估服务能承载的并发
ab -n 1000 -c 100 https://www.lucien.com/
-n为指定总共发送多少个请求
-c指定每次发送多少个请求
三、系统性能优化
1、文件句柄
- linux中一切皆文件,文件句柄就像是数据库中的索引一样,会随着我们进程的调用频繁增加,默认是有上限的,不能让一个进程无限制使用,所以我们需要限制每个进程和服务的最大文件句柄数量。
2、文件句柄的设置方式:
①、系统全局设置(针对root用户)
root soft nofile 25535
root hard nofile 65535
②、用户局部修改(针对有所用户)
* soft nofile 65535
* hard nofile 65535
③、进程局部性修改(核心模块,针对nginx进程:在nginx配置文件中添加[/etc/nginx/nginx.conf])
worker_rlimit_nofile 65535
umilit -n 可进行查看文件句柄数
Vim /etc/security/limits.conf
有个 nofile -----》即为文件句柄数
当文件句柄不足时,系统会进行提示:Too many open files
④、调整内核参数:让time_wait状态重用
vim /etc/sysctl.conf
#如果没有启用,则只有等到time_wait状态端口释放后,才能重新使用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1 (时间戳)
[root@node1 ~]# sysctl -p 进行查看我们自己添加的参数
[root@node1 ~]# sysctl -a 查看所有的内核参数
四、代理服务优化
- 通常nginx作为代理服务,负责转发用户请求,那么在转发的过程中建议开启HTTP长连接,用于减少握手次数,降低服务器消耗。
vim /usr/local/nginx/conf/nginx.conf
http {
#配置负载均衡的服务器列表
upstream tomcat_server {
server 192.168.184.60:8080 ;
Keepalive 16; #长连接
}
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
location ~ .*\\.jsp$ {
proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
#设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认host的值为proxy_pass指令设置的主机名
proxy_set_header HOST $host;
#把$remote_addr赋值给X-Real-IP,来获取源IP
proxy_set_header X-Real-IP $remote_addr;
#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1、可加项:
#设置连接web超时时间
proxy_connect_timeout 30s;
#代理等待web响应超时时间
proxy_read_timeout 30s;
#web回传数据至代理超时时间
proxy_send_timeout 30s;
#开启代理缓冲区,web回传数据至缓冲区,代理边收边传返回给客户端
proxy_buffering on;
#代理接收web响应的头信息的缓冲区大小
proxy_buffer_size 32k;
#缓冲代理接收单个长连接内包含的web响应的数量和大小
proxy_buffers 4 128k;
2、Keepalive_requests
- Keepalive_requests设置通过一个keepalive连接提供的最大请求数,在发出最大请求后,将关闭连接
3、Keepalive_timeout
- Keepalive_timeout设置超时时间,在此期间与代理服务器的空闲keepalive连接将保持打开状态
五、静态资源优化
- Nginx作为静态资源web服务器,用于静态资源处理,传输很高效
静态资源类型 | 种类 |
---|---|
浏览器渲染 | html、CSS、JS |
图片文件 | JPEG、GIF、PNG |
视频文件 | FLV、Mp4、AVI |
其他文件 | TXT、DOC、PDC |
5.1、静态资源缓存
①、开启浏览器缓存:
server {
Listen 80;
server_name www.lucien.com;
Location ~ .*\\.(jpg|gif|png)$ {
expires 7d;
}
}
②、关闭浏览器缓存:
Location ~ .*\\.(jpg|gif|png)$ {
add_header Cache-Control no-store;
add_header Pragma no-cache;
}
5.2、静态资源高效读取
①、sendfile(默认开启)
- 传统文件读取过程:
file --> 内核空间调取 --> 应用程序(用户空间) --> 程序用户空间 -->内核空间 --> socket服务 - Sendfile读取方式:
file --> 内核空间调取 --> socket服务
②、tcp_nopush(默认关闭)
- 将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile才能使用(就像送快递一样,大量的同地区的快递,可进行一起运输,达到高效送货目的)
③、提高网络的实时性,需要开启keepalive
- 就像宅急送一样,你不能像送其他外卖一样,顺路接了其他单子再送我的外卖,而是拿到我的外卖就直接给我送过来,这就是实时性。
5.3、静态资源压缩
- Nginx将响应报文发送至客户端之间启用压缩功能,然后进行传输,这能够有效的节约带宽,并提高响应至客户端的速度。
- ①、gzip传输压缩,传输前压缩,传输后解压
- ②、gzip压缩哪些类型的文件
- 可在nginx目录下的mime.types 里查找你需要压缩的类型,然后在nginx.conf配置文件进行添加
- ③、gzip压缩比率,加快传输,但压缩本身比较耗费服务端性能
- ④、gzip压缩协议版本,压缩使用在http哪个协议,主流1.1版本
5.4、防止资源盗链
- 防盗链,指的是防止资源被其他网站恶意盗用。
- 基础防盗链设置思路:针对客户端请求中携带的header信息来验证请求的合法性,比如客户端请求中携带referer信息。
- 优点是:规则简单,配置和使用都很方便。
- 缺点是:防盗链所依赖的referer验证信息是可以伪造的,所以通过referer信息防盗链并非100%可靠,但是能限制大部分盗链情况。
5.5、允许跨域访问(多路复用)
①、什么是跨域访问?
- 当我们通过浏览器访问a网站时,同时会利用到ajax或其他方式,同时也请求b网站,这样就出现了请求一个界面,使用了2个域名,这种方式对浏览器来说默认是禁止。
②、Nginx允许跨站访问与浏览器的关系:
- 浏览器会读取Access-Control-Origin的头信息,如果服务端允许,则浏览器不会进行拦截。
5.6、CPU亲和配置
- CPU亲和:减少进程之间不断的频繁切换,减少性能的损耗,其实现原理是将CPU核心和Nginx工作进程绑定方式,把每个worker进程固定对应的cpu上执行,减少切换cpu的cache miss,获得更好的性能。
- ①、查看CPU物理状态:lscpu,进行建议查看
- ②、将Nginx worker进程绑定不同核心(官方建议与cpu核心保持一致)
- 方式一:
worker_processes 24;
worker_cpu_affinity 000000000001 000000000002 000000000003 000000000004; - 方式二:(使用较少)
worker_processes 2;
worker_cpu_affinity 101010101010 010101010101; - 方式三:(最佳绑定方式)
worker_processes auto;
worker_cpu_affinity auto;
- 方式一:
- ③、查看nginx worker 进程绑定至对应cpu
ps -eo pid,args,psr | grep [n]ginx
Nginx安全与优化总结
- 【1】、cpu亲和、worker进程数、调整每个worker进程打开的文件数
- 【2】、使用epoll网络模型、调整每个worker进程的最大连接数
- 【3】、文件的高效读取sendfile、nopush
- 【4】、文件的传输实时性、nodealy
- 【5】、开启tcp长连接/以及长连接超时时间keepalived
- 【6】、开启文件传输压缩
- 【7】、开启静态文件expires缓存
- 【8】、隐藏nginx版本号
- 【9】、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问
- 【10】、配置防盗链以及跨域访问
- 【11】、防DDOS、CC攻击,限制单IP并发连接以及http请求
- 【12】、优雅限制nginx错误页面
- 【13】、Nginx加密传输https优化
- 【14】、Nginx proxy_cache、fastcgi_cache、uwsgi_cache缓存
以上是关于Nginx相关性能优化的主要内容,如果未能解决你的问题,请参考以下文章