分类
基础配置优化
- CPU亲和性优化
- nginx模型优化
- nginx传输方式优化
- nginx文件压缩优化
缓存配置优化
CPU亲和性
- 让多核CPU做到nginx服务充分的配合使用,从而提高性能。
- nginx运行时会启用一个master进程和多个worker进程,work进程负责处理请求,减少work进程在多核CPU中发生频繁调度。让每个nginx的worker进程都能固定到具体的CPU核心上(这就是nginx的CPU亲核心)
- 配置方式
- 直接将配置项设置成auto(worker_cpu_affinity),即采用了nginx推荐的CPU绑核策略方式。
- 手动绑定,将worker线程数量与CPU核心数一一绑定方式。设置成auto nginx会自动识别并按照推荐策略来分配worker线程和CPU。
IO流事件模型
- nginx的events配置模块中默认设置了use epoll,表示nginx使用了epoll这个IO流事件模型。
- epoll优势:
- linux系统一切皆文件,比如打开一个设备便会产生一个文件描述符;产生一个进程时需要一个进程描述符,这个进程描述符也是一个文件。所以nginx处理请求时每一个请求都会产生处理请求的描述符。
- nginx处理大规模请求的时候,为了提高效率采用非阻塞模型。epoll本身是以异步非阻塞模型来处理请求流中的事件流。(kernel2.6版本以后才可使用epoll;早期内核使用select\poll模型,select模型比epoll模型性能要低很多)
对比epollheselect模型具备的优势:
a、epoll处理事件流模型是线程安全的;
b、epoll跟select模型相比调用fd文件描述符时使用了mmap共享用户和内核的部分空间,提高了效率;
c、epoll是基于事件驱动的,相比select需要扫描整个文件描述符的相关状态,epoll基于事件驱动避免频繁扫描文件描述符,可以直接调用callback回调函数,效率更高。
d、取消了select 模型里面单个进程能够监视的文件描述符的数量存在的最大限制(1024),如果你有使用过早期的Apache版本的,它使用的select 模型,当请求超过1000以后就会出现延迟或者请求错误,而改用 Nginx 的话性能会得到明显的改善。
- events{}配置里worker_connections,这个默认设置成1024,单个worker线程设置成1024有点偏低,建议将worker_connections调大一些。
零拷贝
- 零拷贝是在nginx中的HTTP配置模块中添加一个sendfile on配置项,它便是一个零拷贝。所以零拷贝并不代表不拷贝,而是说它做到了文件的内核态到用户态的零拷贝。对于静态文件不需要流转到用户态中,直接通过内核效率更高,nginx中开启sendfile on这样静态文件就可以通过红色的路径在内核态中完成转发而不用再绕道用户态,提高了效率。
文件压缩
- 期望做到nginx服务端往客户端发送的线程越小占用的延迟越低,从而用户体验越好。主要通过gzip方式进行设置。
- gzip on 负责打开后端的压缩功能
- gzip_buffer 16 8k 表示设置 Nginx在处理文件压缩时的内存空间
- gzip_comp_level 6(一般设置为6比较合适)
- 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 压缩。
缓存优化
- 如果缓存的元素在客户端,那主要有浏览器缓存和HTTPS缓存,这2部分缓存效果都可以用nginx这种代理来进行设置并作为主要优化。
- 代理端的缓存(缓存文件存放在代理服务器的节点中),使用nginx作为反向代理服务的时候可以支持代理缓存设置。
- 将缓存放入后台服务(通过后台服务中程序逻辑来实现),例如将网站中登录状态、连接数等缓存到redis、memcache中,避免直接请求数据库。
浏览器缓存
通常是缓存到客户端(如:浏览器、客户端app),这就是浏览器缓存。
可以把静态元素,比如用户请求的图片、CSS?JS等元素缓存到客户端,通过nginx配置expires设置过期时间。-1永久缓存,max设置最大周期缓存。
HTTPS配置优化
网站启用https后浏览器和服务端交互次数变多
通过nginx中添加ssl_session_cache配置,在处理SSL会话所需要开辟的共享内存的空间。设置为10MB,第二个参数是设置SSL SessionKey的超时时间,这里设置的为10分钟,也就是每隔10分钟需要重新再进行一次建联,这是一个在服务端的超时时间。
打开文件缓存
打开文件缓存设置在nginx端,通常设置一些静态元素(如jpg、css、js)在代理端通过这种方式进行设置。
这里nginx缓存的是静态元素的元数据。