Nginx 性能优化

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 性能优化相关的知识,希望对你有一定的参考价值。

一、资源压缩

如果一个静态资源的过大,传输起来肯定越慢,并且会占用大量带宽,因此在项目部署时可以通过nginx对于静态资源实现压缩传输。Nginx 提供了三个支持资源压缩的模块ngx_http_gzip_module、ngx_http_gzip_static_module、ngx_http_gunzip_module,其中ngx_http_gzip_module属于内置模块。

开启资源压缩:

http
    # 开启压缩机制
    gzip on;
    # 指定会被压缩的文件类型(也可自己配置其他类型)
    gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
    # 设置压缩级别,越高资源消耗越大,但压缩效果越好
    gzip_comp_level 5;
    # 在头部中添加Vary: Accept-Encoding(建议开启)
    gzip_vary on;
    # 处理压缩请求的缓冲区数量和大小
    gzip_buffers 16 8k;
    # 对于不支持压缩功能的客户端请求不开启压缩机制
    gzip_disable "MSIE [1-6]\\."; # 低版本的IE浏览器不支持压缩
    # 设置压缩响应所支持的HTTP最低版本
    gzip_http_version 1.1;
    # 设置触发压缩的最小阈值
    gzip_min_length 2k;
    # 关闭对后端服务器的响应结果进行压缩
    gzip_proxied off;

二、使用epoll网络模型

Nginx 是基于多路复用模型实现的,但默认的多路复用模型 select/poll 最大只能监听1024个连接,而epoll则属于 select/poll 接口的增强版,因此切换为epoll 模式能够大程度上提升单个Worker的性能:

events   
    # 使用epoll网络模型  
    use epoll;  
    # 调整每个Worker能够处理的连接数上限  
    worker_connections  10240;  
  

三、开启CPU亲和机制

在实际项目中进程或线程数往往都会远超出系统CPU的核心数,操作系统执行原理本质上是采用时间片切换机制,也就是一个CPU核心会在多个进程之间不断频繁切换,造成很大的性能损耗。而CPU亲和机制则是指将每个Nginx的工作进程,绑定在固定的CPU核心上,从而减小CPU切换带来的时间开销和资源损耗:

worker_cpu_affinity auto;  

四、调整Worker工作进程

Nginx启动后默认只会开启一个Worker工作进程处理客户端请求,而我们可以根据机器的CPU核数开启对应数量的工作进程,以此来提升整体的并发量:

worker_processes auto;  # 自动根据CPU核心数调整Worker进程数量  

同时也调整每个工作进程能够打开的文件句柄数:

worker_rlimit_nofile 20000;  # 每个Worker能打开的文件描述符,最少调整至1W以上,负荷较高建议2-3W  

五、长连接配置

建议开启HTTP长连接,用户减少握手的次数,降低服务器损耗:

upstream xxx   
    # 长连接数  
    keepalive 32;  
    # 每个长连接提供的最大请求数  
    keepalived_requests 100;  
    # 每个长连接没有新的请求时,保持的最长时间  
    keepalive_timeout 60s;  
  

六、使用零拷贝技术

零拷贝读取机制与传统资源读取机制的区别:

  • 传统方式:硬件–>内核–>用户空间–>程序空间–>程序内核空间–>网络套接字
  • 零拷贝方式:硬件–>内核–>程序内核空间–>网络套接字
sendfile on; # 开启零拷贝机制  

以上是关于Nginx 性能优化的主要内容,如果未能解决你的问题,请参考以下文章

Nginx性能优化

Nginx安全优化与性能调优

Nginx 性能优化

Nginx 性能优化

Nginx性能优化

nginx高并发优化之文件描述符设置