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后再发送给客户端,提高传输效率,默认关闭。仅在开启sendfile时才有效;
- 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:开启日志缓冲区buffer和gzip压缩,避免频繁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:设置是否记录子请求日志,默认关闭;
- uninitialized_variable_warn:设置是否记录变量未初始化的警告日志,默认开启;
- 生产环境中,要尽量提高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;
}