NGINX基础配置优化
CPU亲和性:
现在的CPU通常是多核的,并可以通过超线程来虚拟更多核数
亲和力就是为多核CPU需做到让Nginx服务充分的配合使用,从而提高性能
Nginx运行时会启用1个master进程及多个worker进程, worker进程负责处理请求
如果 worker 进程在多核 CPU 中发生频繁的调度就会损耗性能
在这种情况下,希望减少这种频繁调度让每一个 Nginx 的 worker 线程都能够固定到具体的 CPU 核心上,就需要配置 Nginx 的 CPU 亲和性来解决这个问题
配置方式:
1.推荐直接将配置项设置成auto (worker_cpu_affinity)
即采用了Nginx推荐的CPU绑核策略方式
2. 手动绑定,将 worker 线程数量与 CPU 核心数一一绑定方式设置
设置成 auto Nginx 会自动识别并按照推荐策略来分配 worker 线程和CPU
IO流事件模型:
为什么 Nginx 会选择使用 epoll 呢
Linux 系统下一切皆文件,在 Nginx处理请求时,每一个请求都会产生处理请求的描述符
在Nginx 处理大规模请求的时候,为了提高并发效率需要采用异步非阻塞模型
epoll 本身是以异步非阻塞模型来处理请求流中的事件流
需要注意!!!并不是所有的 Linux 操作系统都可以使用 epoll,它是在 kernel 2.6 版本以后提出的,早期内核使用的select\poll 模型,select 模型比 epoll 模型性能要低很多
epoll相比select的优势:
- epoll 处理事件流模型是线程安全的
- epoll 跟 select 模型相比,调用fd文件描述符时使用了mmap共享用户和内核的部分空间,提高了效率
- epoll 是基于事件驱动的,避免频繁扫描文件描述符,可以直接调用callback回调函数,效率更高
- 取消了select模型里面单个进程能够监视的文件描述符的数量存在的最大限制(1024)
补充:
在 events() 配置中还涉及一个优化的地方就是 worker_connections在处理高并发的场景时,建议你将worker_connections 调大一些,你可以参考业务所需 Nginx 使用最大峰值来优化这个值
零拷贝:
Nginx 会在 HTTP 中默认添加一个 sendfile on,它便是一个零拷贝
所谓零拷贝并不代表不拷贝,而是说它做到了文件的内核态到用户态的零拷贝
文件压缩:
主要通过 gzip 方式进行设置
- gzip on 负责打开后端的压缩功能
- gzip_buffer 16 8k 表示设置 Nginx 在处理文件压缩时的内存空间
- gzip_comp_level 6 表示 Nginx 在处理压缩时的压缩等级,通常等级越高它的压缩比就越大,根据实际情况来选择合适的压缩比
- gzip_http_version 1.1 表示只对 HTTP 1.1 版本的协议进行压缩
- gzip_min_length 256 表示只有大于最小的256 字节长度时才进行压缩,如果小于该长度就不进行压缩
- gzip_proxied any 代表Nginx 作为反向代理时,依据后端服务器时返回信息设置一些gzip压缩策略
- gzip_vary on 表示是否发送 Vary: Accept_Encoding 响应头字段通知接收方响应使用了 gzip压缩
- application/vnd.ms-fontobject image/x-icon gip压缩类型
- gzip_disable “msie6” 关闭IE6的压缩
NGINX缓存配置优化
前言:
用Chrome 开发者工具让我们能够非常清晰的看到一次页面的打开效果
了解它的请求了是什么(请求头),服务端返回了什么(body及返回头信息)
通过这个工具详细的查看数据并对一个页面缓存情况进行分析
缓存优化
缓存元素在客户端:
主要有浏览器缓存和HTTPS缓存
这两部分缓存效果都可以 Nginx 这种代理来进行设置并作主要优化。
代理端缓存:
Nginx作为反向代理服务的时候,可以支持代理缓存设置
缓存文件放入后台服务:
例如将一部分数据通过此方式缓存
比如将用户最长查看的数据(网站中登录状态、连接数等)缓存到Memcache、 Redis中避免直接请求关系型数据库或其他服务
经验分享:
缓存越靠前越好 能放在客户端的就放在客户端,而不要放到后端去频繁请求
缓存的数据越多越好 能在本层级缓存的数据越多,就越可以减少对后端的请求
缓存的命中率越高越好 如果命中率不高,同样还是会造成穿透到后端访问
此时还需要考虑将缓存的命中率设置的越高,这时观察指标,会发现缓存效果越优
浏览器缓存:
浏览器缓存通常是缓存到客户端(如:浏览器、客户端app)
对于浏览器缓存:
- 可以把静态元素缓存到客户端
- 可以通过 Nginx 的 expires 配置菜单进行设置
expires 后面可以加具体的时间,也可以加对应的特定意义的数值,比如-1表示永久缓存, max设置最大缓存(默认缓存周期为10年),需要做具体性质的时间的设置可以写入时间周期,比如一个小时或是一天
HTTPS配置优化:
通过 HTTPS 方式会比 HTTP 请求握手会要增加很多次从而延迟也增加了
这时就需要考虑HTTPS是否有更好的优化方案来减少客户端和服务端请求
配置原理:
当浏览器跟服务端建立第一次加密证书验证的会话后,服务端会给客户端浏览器缓存一个SessionKey,如果客户端跟服务端再次断开连接,这时浏览器就可以拿 SessionKey 直接跟服务端进行交互,只需要进行一次校验,就可以开始数据传输
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
打开文件缓存:
通常而言我们会把一些静态元素(如:JPG、CSS、GS)在代理端通过这种方式进行设置
这里 Nginx 缓存的是静态元素的元数据
元数据的作用就是缓存打开用户所请求的静态元素的文件路径等信息
如果在本地频繁地查找之前请求过的静态元素文件而没有缓存元数据时效率比较低
而如果我们把一部分索引数据缓存到Nginx的Cache下,这种频繁访问就可以很大地提高访问效率
open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;
代理缓存优化:
不局限于通过 http_proxy来作代理缓存
只要 Nginx 支持的代理模式(UWSGI、SGI)都可以设置代理缓存
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60mlocation /{ proxy_cache my_cache; }
proxy_cache_path 表示在本地分配哪个路径来缓存后台文件的元素
cache levels 表示存放文件的分层方式
my_cache:10m max_size是缓存的单个文件的最大大小,还有时效等
另外一块的设置表示在proxy_cache的时候,通过location引用到cache的名称
代理缓存的特性
- 首先通过 Nginx 作代理,可以实现一个动静态的分离
- 静态元素直接交给Nginx来处理,再把后端动态数据适当作一些缓存
- 通常做这种代理+缓存的架构,能有效的提高整体网站的访问并发性能
缓存使用注意问题:
- 文件信息更新策略问题:要考虑缓存的删除策略、更新策略,怎么保证发生更新以后,用户能够及时的感知
- 缓存命中率失败给后端造成的瞬间压力:怎么去避免缓存失效,一旦前端缓存失效,怎么保证后端服务的高可用而不受影响
- 多节点缓存一致性:怎么保证这些数据是能够达到一致性,缓存架构的设计,前端的缓存节点的更新策略也是应该注意的问题