Nginx(十八) 性能调优

2024-01-08 21:46:29

Nginx三大优势,动静分离、反向代理、负载均衡

本篇文章主要讲Nginx优化,各指令的具体用法请参考以下几篇文章

Nginx(三) 配置文件详解 - 基础模块(超详细)

Nginx(十三) 配置文件详解 - 反向代理(超详细)

Nginx(十四) 配置文件详解 - 负载均衡(超详细)

Nginx(十六) 配置文件详解 - server stream服务流

1、进程优化

  • worker_processes:设置开启几个工作进程,默认是1。建议设置成CPU的核数;
  • worker_cpu_affinity:如果开启了多进程模式,可通过该指令将工作进程与CPU绑定,避免工作进程在不同CPU间来回切换;
  • thread_pool:定义线程池,并设置线程数量threads和最多等待请求数量max_queue。max_queue默认等于内核参数open files。linux默认是65535;
  • worker_rlimit_nofile:设置所有工作进程可打开的文件数量上限,默认等于等于内核参数open files。linux默认是65535;
  • worker_priority:设置工作进程优先级,默认是0,允许取值范围是-20 ~ +19,值越小优先级越高,获得的 CPU 时间就越多;
  • worker_shutdown_timeout设置worker process优雅退出时的超时时间,无默认值;

2、连接优化

2.1 连接池

  • worker_connections:定义每个工作进程可处理的最大并发连接数,默认是512。不要超过worker_rlimit_nofile设置的值;
  • accept_mutex:如果开启了多进程模式,设置是否开启互斥锁,默认关闭。网络吞吐量较大时建议关闭;
  • accept_mutex_delay:设置互斥锁等待时间,默认是500ms;
  • multi_accept:设置是否开启多网络连接,即允许一个工作进程同时接收多个网络连接,默认关闭。

2.2 连接队列

  • listen:?[backlog=number],通过配置backlog参数来设置TCP全连接队列最大值;

2.3 连接管理

  • listen:[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]],通过配置so_keepalive参数来设置是否开启TCP保活机制;
  • tcp_nopush:设置是否开启tcp_nopush机制,等响应数据累计到一个MSS后再发送给客户端,提高传输效率。默认关闭;
  • tcp_nodelay:设置是否开启tcp_nodelay机制,有响应数据就立即发送给客户端,默认开启。如需使用代理响应缓冲,需关闭tcp_nodelay;
  • keepalive_timeout:设置http长连接空闲等待超时时间,默认是75秒,可压缩超时时间,及时释放资源;
  • keepalive_requests:设置一个http长连接可处理的最大请求数,默认是1000次,1.19.10版本之前默认是100,QPS较高时可适当增大该值;
  • keepalive_time:设置一个http长连接可处理请求的最长时间,默认是1小时;
  • lingering_close:设置是否开启延迟关闭,默认开启,主要针对的是异常关闭的连接;
  • lingering_time:设置延迟关闭总的超时时间,默认是30秒;
  • lingering_timeout:设置每轮延迟关闭等待超时时间,默认是5秒;
  • client_max_body_size:设置客户端请求体的最大允许值,默认是1M;
  • client_body_in_single_buffer:设置是否要将客户端请求体数据保存在单个缓冲区中,默认关闭;

2.4 限流

  • limit_rate:限制向客户端传输响应的速率,默认是0,即不做限制;
  • limit_rate_after:设置发送数据量超过多少时开始限制发送速率,默认是0,即不做限制;
  • max_ranges:限制range请求头中的Range最大范围,单位是字节,无默认值。

3、缓冲优化

  • client_header_buffer_size:设置读取客户端请求头的缓冲区大小,默认是1k。如果请求头较大,缓冲区大小由large_client_header_buffers指令限制;
  • large_client_header_buffers:设置读取较大的请求头的缓冲区number和size,默认是4×8k;
  • client_body_buffer_size:设置读取客户端请求体的缓冲区大小,linux系统中默认是8k,超出缓冲区的请求体会被写入临时文件,可适当调大该参数;
  • client_max_body_size:限制客户端请求体的最大值,默认是1m,请求体超过该值时会给客户端返回413响应。设为0表示不做限制;
  • subrequest_output_buffer_size:设置读取子请求响应体的缓冲区大小,linux系统默认是4k;
  • output_buffers:设置用于从磁盘读取响应的缓冲区number和size。

4、缓存优化

4.1 Nginx(服务端)缓存

  • open_file_cache:设置是否缓存已打开过的文件的信息(文件描述符),默认关闭。可设置缓存多少个文件,每个文件的失效时间。
  • open_file_cache_errors:设置是否缓存文件打开/查找错误的信息,默认关闭。
  • open_file_cache_min_uses:设置缓存至少访问多少次后才被标记为活跃文件,默认是1;
  • open_file_cache_valid:设置缓存有效时间,默认是60秒;

4.2 客户端缓存

  • expires:设置缓存过期策略,默认关闭。该指令会设置响应头中的 Expires 和 Cache-Control 两个字段,客户端会根据这两个字段的值来校验本地缓存是否仍有效。expires 可设置成相对时间、绝对时间、无有效期和最大值等。
  • etag:设置静态资源的Etag标识(最后修改时间+文件大小),默认开启;
  • if_modified_since:与静态资源的最后修改时间进行比较用以验证缓存是否有效,默认是精确匹配(exact);

5、超时时间优化

  • client_body_timeout:设置接收客户端请求体的等待超时时间,从连接建立后开始计算,默认是60秒;
  • client_header_timeout:设置接收客户端请求头的等待超时时间,从连接建立后开始计算,默认是60秒;
  • send_timeout:设置服务端向客户端传输响应的空闲等待超时时间,从上一次响应数据传输结束后开始计算,默认是60秒;
  • keepalive_timeout:设置长连接空闲等待超时时间,从上一个请求处理结束后开始计算,默认是75秒;
  • lingering_timeout:设置每一轮延迟关闭连接的等待时间,默认是5秒;
  • resolver_timeout:设置DNS解析超时时间,默认是30秒;
  • worker_shutdown_timeout:设置worker process优雅退出时的超时时间,无默认值;

6、日志优化

  • access_log:开启日志缓冲区buffergzip压缩,避免频繁I/O。如果仅作为代理服务器时可关闭access日志记录,access_log off;
  • log_not_found:不记录404错误到error.log,log_not_found on;
  • open_log_file_cache:开启打开日志文件描述符缓存,提升日志写入效率,默认关闭。如果使用日志缓冲区,打开文件描述符的缓存有效期需大于日志缓冲区的刷新时间flush。
  • rewrite_log:设置是否记录请求重写结果日志,默认关闭;
  • log_subrequest:设置是否记录子请求日志,默认关闭;
  • 生产环境中,要尽量提高error log和access log的日志级别;
  • 日志轮询/切割。Nginx(十七) 日志轮询/切割

7、优化传输效率

  • tcp_nopush:设置是否开启tcp_nopush机制,等响应数据累计到一个MSS后再发送给客户端,提高传输效率。默认关闭;
  • tcp_nodelay:设置是否开启tcp_nodelay机制,有响应数据就立即发送给客户端,默认开启。如需使用代理响应缓冲,需关闭tcp_nodelay;

7.1 异步I/O aio

  • aio:设置是否启用文件异步I/O功能,默认关闭。linux内核版本不能低于2.6.22,且需开启directio。aio配合thread_pool一起使用,可大大提高响应速率;
  • directio:设置是否开启直接I/O功能,主要用于读取大文件,可直接从磁盘读取大文件,默认关闭;
  • directio_alignment:设置directio的对齐方式,默认是512k;
  • aio_write:设置写入文件时是否开启异步I/O功能,默认关闭。仅在配置了aio threads时该功能才有效,而且仅限于将从代理服务器接收到的数据写入临时文件。

7.2 零拷贝 sendfile

  • sendfile:设置是否启用sendfile()系统调用来发送文件,默认关闭。开启后读取文件时文件内容不需要写入用户缓冲区,可降低CPU负载;
  • sendfile_max_chunk:限制每次 sendfile() 调用可传输的最大数据值,默认是2m。如果不限制的话,一个快速连接将独占整个工作进程。

7.3 gzip压缩

  • gzip:设置是否开启gzip动态压缩,默认关闭。开启gzip压缩服务可缩短传输时间,提高访问速度,相应的会增加cpu开销。gzip配合gzip_static一起使用会更高效;
  • gzip_types:设置对哪些MIME类型的文件启用gzip压缩,Nginx始终压缩满足压缩条件的"text/html"文件,配置为"*"时,表示对所有MIME类型文件都启用gzip压缩;
  • gzip_http_version设置启用gzip压缩所需的http协议最低版本,默认是1.1;
  • gzip_comp_level:设置gzip压缩级别,level取值范围是[1-9],默认值是1。level越大压缩率越高,传输效率越高,压缩时间越长,但更消耗CPU资源。建议值3~5;
  • gzip_min_length:设置启用gzip压缩时的文件最小长度,默认是20K;
  • gzip_buffers:设置压缩响应缓冲区的number和size,linux系统中默认是32×4k;
  • gzip_disable:禁用指定UA的gzip功能;
  • gzip_proxied:设置是否对代理响应进行gzip压缩,默认关闭;
  • gzip_static:设置是否开启静态压缩,默认关闭。开启静态压缩后,如果有预压缩文件,则直接读取预压缩文件;
  • chunked_transfer_encoding:设置是否开启分块传输编码(Transfer-Encoding: chunked),默认开启。

8、反向代理

8.1 代理请求

  • proxy_http_version:设置代理请求的http协议版本,建议设置为1.1。
  • proxy_timeout:类似于keepalive_timeout,设置连接空闲等待超时时间,默认是10分钟;
  • proxy_connect_timeout设置尝试与被代理服务器建立连接的超时时间,默认是60秒,可调小,但不要调大,如果非要调大,尽量不超过75秒;
  • proxy_read_timeout:设置接收上游服务器响应的空闲等待超时时间,默认是60秒;
  • proxy_send_timeout:设置向上游服务器发送请求的空闲等待超时时间,默认是60秒;
  • proxy_protocol_timeout:设置代理协议超时时间,默认是30秒;

8.2 代理请求缓冲

  • proxy_request_buffering:设置是否开启客户端请求体缓冲,默认开启。即接收到完整的客户端请求体后再转发给代理服务器;

8.3 代理响应缓冲

  • proxy_buffering:设置是否开启代理响应缓冲,默认开启;
  • proxy_buffers:设置每个连接的代理响应缓冲区的number和size,linux系统中number默认是8,size默认是4k;
  • proxy_buffer_size:设置读取代理响应头部分的缓冲区大小,linux系统默认是4k;
  • proxy_busy_buffers_size:设置忙于发送响应数据的缓冲区大小,并不是独立的缓冲区,它属于proxy_buffers和proxy_buffer_size一部分,linux系统默认是8k;
  • proxy_temp_file_write_size:当代理响应数据超出缓冲区大小时,会将部分数据写入临时文件,该指令限制每次将响应数据写入临时文件的最大值,linux系统默认是8k;
  • proxy_max_temp_file_size:该指令用于限制存放响应数据的临时文件的最大值,默认是1024M。

8.4 代理响应缓存

  • proxy_cache:设置是否缓存代理响应,默认关闭;
  • proxy_cache_path:设置代理响应缓存的存储路径、目录级别、临时文件、共享内存区及失效时间等配置信息,无默认值。如需开启,建立关闭临时文件目录,use_temp_path=off。
  • proxy_cache_valid:设置缓存有效期,无默认值;
  • proxy_cache_methods:设置哪些请求方法的响应会被缓存,默认为GET、HEAD,可再增加POST方法;
  • proxy_no_cache:设置哪些请求的响应不被缓存,无默认值;
  • proxy_cache_bypass:设置哪些请求不读取缓存文件,无默认值;
  • proxy_cache_min_uses:设置需要缓存的代理请求的最少请求次数,默认为1;
  • proxy_cache_purge:清除指定请求的缓存,无默认值;
  • proxy_cache_lock:设置是否启用代理缓存锁,默认关闭。开启缓存锁可有效提升缓存利用率,降低被代理服务器的负载;
  • proxy_cache_lock_age:设置代理缓存锁有效时间,默认是5秒;
  • proxy_cache_lock_timeout:设置等待代理缓存锁的超时时间,默认是5秒;
  • proxy_cache_use_stale:设置什么情况下可使用旧缓存,默认关闭。当后端服务器因异常而无法返回响应时,仍返回旧缓存给客户端,可提升用户体验;
  • proxy_cache_background_update:允许使用旧缓存时,设置是否需要后台更新旧缓存,默认关闭;
  • proxy_cache_revalidate:允许使用旧缓存时,设置是否重新验证旧缓存,默认关闭;
  • proxy_store:持久保存文件/镜像文件,默认关闭。开启后可提高相应速度,降低被代理服务器的负载。同一配置域不可与proxy_cache同时使用。

8.5 开启next_upstream

  • proxy_next_upstream:设置什么情况下尝试转发请求给下一台服务器,默认是error和timeout;
  • proxy_next_upstream_timeout:设置向下一台代理服务器转发请求的总耗时,默认是0,即不受时间限制;
  • proxy_next_upstream_tries:设置尝试转发请求给下一台服务器的总尝试次数,默认是0,即不受次数限制;

8.6 限速 limit_rate

  • proxy_limit_rate:?限制每个连接从代理服务器读取响应的速率,默认是0,即禁用限制;
  • proxy_download_rate:限制每个连接从代理服务器读取响应的速率,默认是0,即禁用限制;
  • proxy_upload_rate:限制每个连接从客户端读取数据的速率,默认是0,即禁用限制;

8.7 开启TCP保活机制

  • proxy_socket_keepalive:设置是否开启Nginx与代理服务器间的TCP保活机制,保活参数使用系统内核参数;

9、负载均衡

  • queue:设置连接队列大小,无默认值;
  • keepalive:限制与上游服务器保持长连接的数量,无默认值。该长连接由Nginx关闭,不是由TCP协议栈管理;
  • keepalive_requests:限制与上游服务器建立一个长连接后能处理的最大请求数,默认是1000;
  • keepalive_time:限制与上游服务器建立一个长连接后能处理请求的最长时间,默认是1小时;
  • keepalive_timeout:限制与上游服务器建立长连接的最长空闲等待时间,默认是60秒;
  • hash:一致性哈希法。哈希策略方法可以针对客户端访问的 URL 计算哈希值,对相同的 URL 请求,Nginx 可以根据相同的哈希值而将其分配到同一后端服务器;
  • ip_hash:IP哈希法。IP哈希(IP Hash)负载均衡策略根据客户端IP计算出哈希值,然后把请求分配给该数值对应的被代理服务器;
  • least_conn:在考虑服务器权重的情况下,将请求传递给活动连接数最少的服务器;
  • least_time:在考虑服务器权重的情况下,将请求传递给平均响应时间最短、活动连接数最少的服务器;
  • random:在考虑服务器权重的情况下,将请求传递给随机选择的服务器。可选参数 two 表示 nginx 先随机选择两个服务器,然后再使用指定的 method 选择一个服务器。method 默认是 least_conn,将请求传递给活动连接数最少的服务器。method 也可以选择?least_time。
upstream backend_server {
    ip_hash;                                
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

# 设置缓存共享内存区1
proxy_cache_path proxy-cache1 levels=1:2 keys_zone=myCache1:256m max_size=10g use_temp_path=off inactive=60m;    
# 设置缓存共享内存区2
proxy_cache_path proxy-cache2 levels=1:2 keys_zone=myCache2:128m max_size=10g use_temp_path=off inactive=60m; 

split_clients $request_uri $proxy_cache {
              default       "myCache1";
              /reader/      "myCache1";
              /app/         "myCache2";
}

server {
    listen 80;
    root /reader;
   
    # 忽略被代理服务器返回响应头中指定字段的控制响应
    proxy_ignore_headers Cache-Control Set-Cookie;

    location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {           
        expires      12h;					# 设置客户端静态资源文件缓存过期时间为12小时
    }

    location ~ / {
        proxy_cache $proxy_cache;             # 启用proxy_cache_path设置的$proxy_cache的共享内存区域
        proxy_cache_lock on;                  # 启用代理缓存锁
        proxy_cache_lock_age 5s;              # 代理缓存锁有效期为5s
        proxy_cache_lock_timeout 5s;          # 等待代理缓存锁超时时间为5s
        proxy_cache_methods GET HEAD POST;    # 缓存GET、HEAD、POST方法的请求的响应数据
        proxy_cache_min_uses 1;               # 响应数据至少被请求1次,才会被缓存
        proxy_cache_bypass $http_pragma;      # 当请求头中包含pragma字段时,不缓存响应

        # 设置什么情况下允许使用过期缓存
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_503;
                                            
        proxy_cache_background_update on;     # 允许使用过期的响应数据时,启用后台子请求更新过期缓存
        proxy_cache_revalidate on;            # 当缓存过期时,向后端服务器发起服务端校验
        proxy_cache_valid 200 301 302 10h;    # 200 301 302状态码的响应缓存10小时
        proxy_cache_valid any 1m;             # 其他状态码的响应缓存1分钟

        add_header X-Cache-Status $upstream_cache_status;  # 添加缓存请求状态标识

        proxy_pass   http://backend_server;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

}

文章来源:https://blog.csdn.net/ShenDaiSun/article/details/135398080
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。