性能优化概述
基于Nginx性能优化,那么在性能优化这一章,我们将分为如下几个方面做介绍
- 首先,我们需要了解性能优化要考虑哪些方面。
- 然后我们需要了解性能优化必须要用到的压力测试工具ab。
- 最后我需要了解系统上有哪些注意和优化的点,以及Nginx配置文件做哪些调整。
我们在性能优化工作前,我们重点需要考虑哪些方面,和了解哪些方面
- 首先需要了解我们当前系统结构和瓶颈,了解当前使用的是什么,运行的是什么业务,都有哪些服务,了解每个服务最大能支撑多大的并发,比如Nginx作为静态资源服务的并发是多少,最高的瓶颈在哪里,能支持多少pqs(每秒查询率)的访问请求等,也可以通过日志去分析请求的情况,当然也可以通过我们前面介绍到的stub_status模块查看当前的连接情况,也可以对线上的业务进行压力测试(低峰期),去了解当前这套系统能承担多少的请求和并发,已做好相应的评估,这个是我们做性能优化最先考虑的地方。
- 其次我们需要了解业务模式。虽然我们是做性能优化,但每一个优化都是为了业务所提供服务的,我们需要了解每个业务接口的类型,比如:电商网站中的抢购模式,这种情况下面,平时没什么流量,但到了抢购时间流量会突增。
我们还需要了解系统层次化的结构,比如 : 我们使用Nginx做的是代理,还是动静分离,还是后端直接服务用户,那么这个就需要我们对每一层做好相应的梳理。以便更好的服务业务。 - 最后我们需要考虑性能与安全,往往注重了性能,但是忽略了安全。往往过于注重安全,性能又会产生影响。比如 : 我们在设计防火墙功能时,检查过于严密,这样就会给性能带来影响。那么如果对于性能完全追求,却不顾服务的安全,这个也会造成很大的隐患,所以需要评估好两者的关系,把握好两者的孰重孰轻。以及整体的相关性,权衡好对应的点。
从OSI七层模型去考虑
在系统业务量没有增长之前,我们就要做好相应的准备工作,已防患业务量徒增带来的接口压力,所以对于接口压力测试就显得非常重要了。我们首先要评估好系统压力,然后是由工具检查当前系统情况,是否能满足对压力的需求。
静态资源压力测试
- 创建静态资源数据
- ab工具进行压力测试
动态资源压力测试
了解影响性能指标
- 网络
- 网络的流量
- 网络是否丢包
- 这些会影响http的请求与调用
- 系统
- 硬件有没有磁盘损坏,磁盘速率
- 系统负载、内存、系统稳定性
- 服务
- 连接优化、请求优化
- 根据业务形态做对应的服务设置
- 程序
- 接口性能
- 处理速度
- 程序执行效率
- 数据库
- 每个服务与服务之间都或多或少有一些关联,我们需要将整个架构进行分层,找到对应系统或服务的短板,然后进行优化
文件句柄,linux一切皆文件,文件句柄可以理解为就是一个索引,文件句柄会随着我们进程的调用频繁增加,系统默认文件句柄是有限制的,不能让一个进程无限的调用,所以我们需要限制每一个进程和每个服务使用多大的文件句柄,文件句柄也是必须要调整的优化参数。
文件句柄的设置方式,1.系统全局性修改。 2.用户局部性修改。 3.进程局部性修改。
通常Nginx作为代理服务,负责转发用户的请求,那么在转发的过程中建议开启HTTP长连接,用户减少握手的次数,降低服务器损耗。
1. 配置Nginx代理服务使用长连接方式keepalive connections(应用层面优化)
2. 对于fastcgi服务器,需要设置fastcgi_keep_conn以便保持长连接
注意:
- scgi和uwsgi协议没有保持长连接的概念
- 无论是proxy、fastcgi、uwsgi协议都有cache缓存的功能,开启后可加速网站访问的效率。(考虑硬件)
Nginx作为静态资源web服务器,用于静态资源处理,传输非常的高效。
静态资源指的是,非Web服务器端运行处理而生成的文件
1. 静态资源缓存
浏览器缓存设置用于提高网站性能,尤其是新闻网站,图片一旦发布,改动的可能是非常小的。所以我们希望能否用户访问一次后,图片缓存在用户的浏览器长时间缓存。
浏览器是有自己的缓存机制,它是基于HTTP协议缓存机制来实现的,在HTTP协议中有很多头信息,那么实现浏览器的缓存就需要依赖特殊的头信息来与服务器进行特殊的验证,如:Expires(http/1.0);Cache-control(http/1.1)。
- 浏览器无缓存
- 浏览器有缓存
浏览器缓存过期校验检查机制,原理如下:
- 浏览器请求服务器会先进行Expires、Cache-Control的检查,检查缓存是否过期,如果没有过期则直接从缓存文件中读取。
- 如果缓存过期,首先检查是否存在Etag(类似于md5进行加密的一个值,用于校验数据有没有发生变化),如果存在则会客户端会向web服务器请求If-None-Match,与Etag值进行比对,由服务器决策返回200还是304。
- 如果Etag不存在,则进行Last-Modified(文件最后修改时间)检查,客户端会向Web服务器请求If-Modified-Since,与Last-modified进行比对,由服务器决策返回200还是304。
1.1 设置文件缓存时间(响应码304)
1.2 设置静态文件不被缓存(响应码200)
2. 静态文件资源读取
传统文件读取方式:。
开启sendfile服务后:。
开启sendfile服务
将多个包一次性发送,用户提升网络传输效率,大文件推荐打开,需要先开启sendfile才行
提高网络传输实时性,需要开启keepalive(与tcp_nopush相反,不要同时打开)
3. 静态资源压缩
Nginx将响应报文发送至客户端之前启用压缩功能,然后进行传输,这能够有效的节约宽带,并提高响应至客户端的速度。
gzip压缩传输,传输前压缩,传输后浏览器解压
测试
- 我们在浏览器输入192.168.15.7/40x.jpg,压缩后的文件大小为18.3kb。
4. 防止资源盗链
防盗链,指的是防止资源被其他网站恶意盗用,如图所示:
基础防盗链设置思路:主要是针对客户端请求过程中所携带的一些Header信息来验证请求的合法性,比如客户端在请求的过程中都会携带referer信息(referer会告诉服务器请求从哪一个页面过来的)。优点是规则简单,配合和使用都很方便,缺点是防盗链所依赖的Referer验证信息是可以伪造的(可以通过代码对上一个请求来源页面的域名进行修改),所以通过Referer信息防盗链并非100%可靠,但是它能够限制大部分盗链的情况。
1.在盗链服务器上准备html文件,偷取Web03服务器(nana.com)网站上的图片
2.使用浏览器能正常访问到偷链的资源
3.在web03服务器(nana.com)上配置防盗链(返回403或者是其他图片)
4.设置某些网站能够使用(盗链)资源
5. 允许跨域访问
什么是跨站访问,当我们通过浏览器访问a网站时,同时会利用ajax或其他方式,同时也请求b网站,这样的话就出现了请求一个页面,使用2个域名,这种方式对浏览器来说默认是禁止。
那么Nginx允许跨站访问与浏览器有什么关系呢,因为浏览器会读取的头信息,如果服务端允许,则浏览器不会进行拦截。
1.模拟跨域访问问题
2.设置Nginx服务允许跨域访问
3.跨域访问测试
6. CPU亲和配置
CPU亲和(affinity)减少进程之间不断频繁切换,减少性能损耗,其实现原理是将CPU核心和Nginx工作进程绑定方式,把每个worker进程固定对应的CPU上执行,减少切换CPU和cache miss,获得更好的性能。
1.查看当前CPU物理状态
2.将Nginx worker进程绑至不同的核心上,官方建议与cpu的核心保持一致
3.查看进程绑定至对应的
- cpu亲和、worker进程数、调整每个worker进程打开的文件数
- 使用epool网络模型、调整每个worker进程的最大连接数
- 文件的高效读取sendfile、nopush
- 文件的传输实时性、nodealy
- 开启tcp长链接、以及长链接的超时时间keepalive
- 开启文件传输压缩gzip
- 开启静态文件expires缓存
- 隐藏Nginx的版本号
- 禁止通过IP地址访问,禁止恶意域名解析,只允许域名访问
- 配置防盗链 ,以及跨域访问
- 防DDOS、cc攻击、限制单IP并发连接,以及http请求
- 优雅显示nginx错误页面
- nginx加密传输https优化
- Nginx proxy_cache、fastcgi_cache、uwsgi_cache缓存
1. 环境准备
2. PHP服务优化
- php程序配置管理文件/etc/php.ini,主要调整日志、文件上传、禁止危险函数、关闭版本号显示等
- php-fpm进程管理配置文件/etc/php-fpm.conf
- 开启php状态页面
- 开启php状态页面后,我们在浏览器输入,页面内容如下所示
Nginx
PHP