网站首页 文章专栏 nginx优化配置及方法论
nginx优化配置及方法论
编辑时间:2020-09-14 14:35 作者:小铨 浏览量:71

nginx优化配置及方法论

一 、从软件层面提升硬件使用效率

1.从软件层面提升硬件使用效率
   -增大CPU的利用率 
   -增大内存的利用率 
   -增大磁盘IO的利用率 
   -增大网络带宽的利用率
2.提升硬件规格
   -网卡:万兆网卡,例如10G、25G、40G等 
   -磁盘:固态硬盘 
   -CPU :更快的主频,更多的核心,更大的缓存,更优的架构 
   -内存:更快的访问速度

二 、Nginx相关优化配置-进程相关

1.增大Nginx使用CPU的有效时长

    -能够使用全部CPU资源:
        1)master-worker多进程架构  worker进程数量应当大于等于CPU核数
    -Nginx进程间不做无用功浪费CPU资源  
        1)worker进程不应在繁忙时,主动让出CPU
    -不被其他进程争抢资源
        1)提升优先级占用CPU更长的时间
        2)减少操作系统上耗资源的非Nginx进程

2.减入进程间切换
    何为进程间切换 
    • 是指CPU从一个进程或线程切换到另一个进程或线程 
    • 类别
        • 主动切换 
        • 被动切换:时间片耗尽
            • 减少被动切换,增大进程优先级
    
    -减入被动进程间切换的配置-设置worker进程优先级
        增大worker进程的时间片,通过设置优先级赖减入被动切换
        什么决定CPU时间片的大小? 在默认情况下,最小时间片是5ms,最大则有800ms 进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长
        设置worker进程的静态优先级 
        Syntax: worker_priority number; 
        Default: worker_priority 0; 
        Context: main
    -减入被动进程间切换的配置-为进程绑定cpu
        nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu
        
        当CPU在运行的时候,如果一颗CPU始终固定的去运行同一个进程,当用户连接到进程的时候,用固定的CPU响应用户的请求,CPU中有缓存,就可以重复的使 用CPU中缓存的数据。如果进程一开始运行在第一颗CPU上,运行一会跑到第二颗CPU上,就意味着原来的缓存信息在第二颗CPU上无法使用,还需要重新加 载,带来资源的浪费,影响效率
            绑定Nginx worker进程到指定的CPU内核
            Syntax: worker_cpu_affinity cpumask 
            worker_cpu_affinity auto [cpumask]; 
            Default: -;
            Context: main

3.Nginx 事件处理模型优化
    Nginx 的连接处理机制在不同的操作系统中会采用不同的 I/O 模型,在 linux 下,Nginx 使用 epoll 的 I/O 多路复用模型,在 Freebsd 中使用 kqueue 的 I/O 多 路复用模型 不过这个选项没必要设置,因为nginx会自动选择最有效的方法作为默认项
    Syntax: worker_connections number; 
    Default: 1024 
    Context: events

4.单个进程允许的客户端最大连接数
    通过调整控制连接数的参数来调整 Nginx 单个进程允许的客户端最大连接数,更多的worker的connection数量对会占用更多的内存,一般一个connection约232字 节,而且event也约96字节,一个连接就是232+96*2

5.配置Nginx worker进程最大打开文件数
    Syntax: worker_rlimit_nofile number; 
    Default: - 
    Context: events

    file-max是内核可分配的最大文件数可通过 cat /proc/sys/fs/file-max 查看 
    nr_open是单个进程可分配的最大文件数 可通过 cat /proc/sys/fs/nr_open 查看
    但是也不是不可修改可通过编辑/proc/sys/fs/file-max 修改 echo 30296 > /proc/sys/fs/file-max 单个进程分配文件数如上操作
    
6.Nginx web缓存设置
    一般针对于图片等 nginx 提供了 expires、etag、if-modified-since 指令来进行浏览器缓存控制。
    语法: expires [modified] time; 
    默认值: expires off; 
    上下文: http, server, location, if in location
    假设我们使用 nginx 作为静态资源服务器,此时可以使用 expires 进行缓存控制。 
        location /img { 
            alias /export/img/; 
            expires 10s; 
        }
   expires 30s;#30秒 
   expires 30m;#30分钟 
   expires 2h;#2个小时 
   expires 30d;#30天

三、Nginx相关优化配置-网络相关

什么是SYN攻击?
    攻击者短时间伪造不同IP地址的SYN报文,快速占满backlog队列,使服务器不能为正常用户服务,SYN攻击是所有黑客攻击事件中最常见又最容易被利用的一 种攻击手法,由来已久,破坏威力巨大。SYN攻击属于DOS攻击的一种, 它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源
    TCP连接握手示意图:

image.png

    • net.ipv4.tcp_syn_retries = 6 
        -主动建立连接时,发SYN的重试次数 
    • net.ipv4.ip_local_port_range = 32768 60999 
        -建立连接时本地口可用范围

SYN_RCVD 状态
    • net.ipv4.tcp_max_syn_backlog 
        -SYN_RCVD状态连接的最大数 
    • net.ipv4.tcp_synack_retries 
        -被动建立连接时,发SYN/ACK的重试次数
        
服务器端处理三次握手:

image.png

如何应对SYN攻击?
    SYN攻击的原理就是向服务器发送SYN数据包,并伪造源IP地址。服务器在收到SYN数据包时,会将连接加入backlog队列,并向源IP发送SYN-ACK数据包,并 等待ACK数据包,以完成三次握手建立连接。 由于源IP地址是伪造的不存在主机IP,所以服务器无法收到ACK数据包,并会不断重发,同时backlog队列被不断被 攻击的SYN连接占满,导致无法处理正常的连接小号cpu资源。
    1、减少SYN-ACK数据包的重发次数(默认是5次) 
        sysctl -w net.ipv4.tcp_synack_retries=3 
        sysctl -w net.ipv4.tcp_syn_retries=3
    2、增大backlog队列(默认是1024) • net.core.netdev_max_backlog -接收自网卡、但未被内核协议栈处理的报文队列长度 • net.ipv4.tcp_max_syn_backlog -SYN_RCVD状态连接的最大个数
        • net.core.netdev_max_backlog 
            -接收自网卡、但未被内核协议栈处理的报文队列长度 
        • net.ipv4.tcp_max_syn_backlog 
            -SYN_RCVD状态连接的最大个数 :sysctl -w net.ipv4.tcp_max_syn_backlog=2048
    3、超出处理能力时,对新来的SYN丢弃连接
        • net.ipv4.tcp_abort_on_overflow

三、Nginx相关优化配置-网络相关

Nagle算法:
    避免一个连接上同时存在大量小报文 . 最多只存在要给小报文 . 合并多个小报文一起发送
    1) 吞吐量优先:启用Nagle算法,tcp_nodelay off 
    2) 低时延优先:禁用Nagle算法,tcp_nodelay on

Gzip指令:

    1)nginx中gzip的主要作用就是用来减轻服务器的带宽问题,经过gzip压缩后的页面大小可以变为原来的30%甚至更小,这样用户浏览页面时的速度会快很 多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压缩并解析。目前的大多数浏览器都支持解析 gzip压缩过的页面。
        参数说明:
        语法:gzip on | off; 
        默认值:gzip off; 
        作用域:http, server, location, if in location 
        语法:gzip_min_length length; 
        默认值:gzip_min_length 20; 
        作用域:http, server, location 
        说明: 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。因为过小的文件内容压缩之后效果不明显,甚至会比不压缩时 更大,所以一般建议长度不小于1000或1k。
        gzip on为开关,后面的搭配使用
    2)gzip_buffers:
        语法: gzip_buffers number size; 
        默认值: gzip_buffers 32 4k|16 8k; 
        作用域: http, server, location 
        说明: 设置response响应的缓冲区大小。32 4k代表以4k为单位将响应数据以4k的32倍(128k)的大小申请内存。如果没有设置,缓冲区的大小默认为整个响应页 面的大小。

    3)gzip_comp_level:
        语法:gzip_comp_level level; 
        默认值:gzip_comp_level 1; 
        作用域:http, server, location 
        说明: 设置gzip的压缩级别,可接受的范围是从1到9,数字越大压缩率越高,但更消耗CPU,一般设置6即可

    4)gzip_types:
      语法:gzip_types mime-type ...; 
      默认值:gzip_types text/html; 
      作用域:http, server, location 
      说明:指定哪些类型的相应才启用gzip压缩,多个用空格分隔。通配符”*”可以匹配任意类型。 不管是否指定”text/html”类型,该类型的响应总是启用压缩。 一般js、css等文本文件都启用压缩,如application/x-javascript text/css application/xml 等。 具体的文件类型对应的mimi-type可以参考conf/mime.types文件。  
        
      注意,不是request说自己支持解压,Nginx返回response数据的时候就一定会压缩。这还要看本次Nginx返回数据的格式是什么,如果返回数据的原始数据 格式,和设置的gzip_types相符合,这时Nginx才会进行压缩。
    5)gzip_http_version:
        语法:gzip_http_version 1.0 | 1.1; 
        默认值:gzip_http_version 1.1; 
        作用域:http, server, location
        说明: 设置gzip压缩所需要的请求的最小HTTP版本,低于该版本不使用gzip压缩。一般不用修改,默认即可。

    6)gzip_disable:
        语法:gzip_disable regex ...; 
        默认值:— 作用域:http, server, location 
        说明: 这个指令是在0.6.23版本增加的。 如果请求的”User-Agent”头信息能被指定的正则表达式匹配,则对响应禁用gzip压缩功能。主要是为了兼容不支持gzip压缩的浏览器,比如IE6,不过IE6 早就废弃了

减少磁盘IO
    优化读取 
    Sendfile 零拷贝 
    内存盘、SSD盘 
    减少写入 
    AIO 异步IO
    增大 error_log级别 ,这样保存的日志就少,就少干了很多保存日志的事
    关闭 access_log ,原理同上
    压缩 access_log , 节约了磁盘空间
    线程池thread pool, 异步读IO线程池,线程池增加线程复用

    解释:
    - Sendfile 零拷贝 :直接IO绕开磁盘高速缓存
    先看下概念:[object Object]

image.png

适用于大文件::直接IO
        当磁盘上的文件大小超过size后,启用directIO功能,避免Buffered IO模式下磁盘页缓存中的拷贝消耗
        Syntax: directio size | off; 
        Default: directio off; 
        Context: http, server, location 
        Syntax: directioaligiunent 512; 
        Default: directioalignment size; 
        Context: http, server, location

    - 异步IO    
        Syntax: aio on | off | threads[=pool]; 
        Default: aio off; 
        Context: http, server, location
    
    - 异步IO线程池 
        编译时需要加上 --with-threads



    出自:铨程互动

    地址:www.wuhequan.cn

    转载请注明出处!


来说两句吧
最新评论
0.077539s