基础配置优化
CPU亲和性优化
# 通常CPU是多核处理,并且可以通过超线程来虚拟更多核数。
# nginx运行时会运行一个master进程和多个worker进程。master进程负责分发请求。worker进程负责处理请求。
# 如果多个worder进程在多核CPU中频繁发生调度就会损耗性能。
# 让每一个nginx的worker线程都能够固定到具体的CPU核心上
# 将 worker 线程数量与 CPU 核心数一一绑定方式设置
# nginx线程数,建议设备为CPU的总核数
worker_processes auto;
# 为每个线程绑定一个CPU,手动绑定方式为2核(01 10),4核(0001 0010 0100 1000)。依次类推
worker_cpu_affinity auto;
Nginx模型优化
# events配置模块中默认设置了 use epoll,表示Nginx 使用 epoll 这个 IO 流事件模型
# Linux下一切皆文件。比如我们打开一个设备,它便会产生一个文件描述符。在产生一个进程时,这个进程需要一个进程描述符
# 所以Nginx在处理请求的时候,每个请求都会产生处理请求的描述符。为了提升并发效率,需要采用异步非阻塞模型。epoll就是此模型
# 当然并不是所有的Linux系统都支持epoll。内核版本要求kernel 2.6以上。早期还是使用select\poll模型。相比之下性能要低的多
# epoll优势
(1):epoll处理事件流模型线程是安全的;
(2): 调用fd文件描述符时使用了mmap共享用户和内核的部分空间。提高了效率;
(3): 基于事件驱动,相比于select需要扫描整个文件描述符的状态。epoll基于事件驱动避免频繁扫描文件描述符,直接调用callback回调参数,效率颇高;
(4): 取消了select模型里面单个进程最大监视文件描述符的数量限制(1024)
events {
worker_connections 1024;
}
Nginx传输方式优化
# 首先Nginx在处理文件时,会将文件传入操作系统内核态的BufferCache,
# 然后传递到操作系统上层的用户态,经用户态的BufferCache再传回内核态中,最后通过Socket转发出去
# 对于静态文件并不需要流转到用户态中,直接通过内核效率更高
http {
sendfile on
}
Nginx文件压缩优化
# 我们希望做到Nginx服务端往客户端发送的数据越小,占用的延迟越低用户体验便会越好
# 所以往往在代理或 Nginx 中会设置文件压缩,我们主要通过 gzip 方式进行设置
http {
gzip on # 负责打开后端压缩功能
gzip_buffer 16 8k # 表示设置处理文件压缩时的内存空间
gzip_comp_level 6 # 处理压缩等级。等级越高压缩比越大。一般设置为6比较合适
gzip_http_version 1.1 # 表示只对http1.1版本协议进行压缩
gzip_min_length 256 # 只有高于256字节长度时才进行压缩,否则不压缩
gzip_proxied any # 表示Nginx作为反向代理时依据后端服务器时返回信息设置压缩策略
gzip_vary on # 表示是否发送vary。实现通知接收方服务端作了gzip压缩
application/vnd.ms-fontobject image/x-icon # gzip压缩类型
gzip_disable "msie6" # 关闭IE6的压缩
缓存配置优化
# 缓存越靠前越好: 能放在客户端的尽量放在客户端,而不要放在后端去做频繁请求
# 缓存数据越多越好: 能在本层级缓存的数据越多越好,越可以减少对后端的请求
# 缓存命中率越高越好: 如果设置了很多缓存,但是命中率不高。同样会造成穿透到后端访问。
浏览器缓存优化
通常可以把静态元素,比如用户请求的图片、CSS 、JS 等元素缓存到客户端
这种缓存可以通过Nginx配置中的expires配置项进行设置,expires后面可以加具体的时间,也可以加对应的特定意义的数值
比如-1表示永久缓存,max设置最大周期缓存(默认缓存周期为10年)需要做具体的时间周期,比如一小时或者一天
# 将php页面缓存24小时
location ~ [^/]\.php(/|$) {
expires 24h;
}
代理缓存优化
# 不局限于通过http_proxy来做代理缓存,只要nginx支持的代理模式(UWSGI,SGI)都可以设置代理缓存
# 代理缓存特性是,可以支持实现动静态分离,静态直接交给nginx处理,再把后端动态数据适当做缓存
HTTPS缓存优化
# 当开启https后客户端访问服务端打开一次浏览器,请求握手会增加很多导致延迟也会增加。
# http建联过程增加了部分证书加密的协商(客户端发送hello报文,服务端发送证书,客户端进行加密,服务端验证加密)
# 多次连接对于用户及服务端而言,性能和延迟会增加很多。
# 消耗一部分内存,1m可以同时保存4000个会话,内存空间不足时会自动清理老的会话
ssl_session_cache 10m;
# 证书有效时间
ssl_session_timeout 10m;
打开文件缓存
# 通常我们会把一些静态元素(jpg,CSS,GS)在代理端缓存其元数据
# 元数据的作用就是缓存打开用户所请求的静态元素文件路径等信息
# 把一部分索引数据缓存到NGINX的cache下,这种频繁访问就可以大可以提高访问效率
# max表示最大能够缓存的文件个数,inactive表示最少的用户使用次数。表示20s内最小需要使用两次,否则就删除元数据。也就是淘汰元数据的策略
open_file_cache max=1000 inactive=20s;
# 设置主动更新和检查的时间,表示每隔30S检查元数据有没有对应的更新。元数据更新策略
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
#