nginx性能调优是一门艺术,我们要如何欣赏这门艺术,取决于我们如何使用它和我们使用时对它的了解程度。
使用负载工具模拟真实负载
在获取你创建的服务的真实瓶颈时,反复测试和测量是有必要的。
而作为测试和测量的手段,负载工具是必要的,而典型的有Apache JMeter,Locust,Gatling等。
对客户端放开连接
近年来,随着HTTP/1.1的广泛的使用,各种应用都需要更多的连接数来维持应用的性能,所以极低的连接数将成为应用性能的瓶颈,为此我们需要增大每个客户端的最大连接数,并相应的加长连接超时时间。
http {
keepalive_requests 320;
keepalive_timeout 300s;
# ...
}
连接复用
连接复用能有效提高上游服务的性能。
proxy_http_version 1.1;
proxy_set_header Connetcion "";
upstream backend {
server 10.0.0.42;
server 10.0.2.56;
keepalive 32;
}
keepalive指令表示最多能维持32个空闲连接,任何nginx worker线程都能复用这些空闲的连接。而proxy_http_version表示代理请求将使用http1.1版本,从而让单个连接有一次性发送复数个请求的能力,最后proxy_set_header Connection “”指令允许连接维持打开状态,以让其有复用的可能。
缓存请求体
server {
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 32k;
proxy_busy_buffer_size 64k;
# ...
}
proxy_buffering的可选值为on和off,默认值为on,表示开启;proxy_buffer_size表示读取从相应服务返回的响应首部的内存大小;proxy_buffers表示请求体缓存的数量和大小;proxy_busy_buffer_size用于限制在忙的响应缓存的大小。
缓存日志
缓存日志是为了减少工作线程阻碍的可能性。
http {
access_log /var/log/nginx/access.log main buffer=32k flush=1m gzip=1;
}
这条配置将允许将日志缓存到内存中,而最迟在flush的时间后才将内存中的日志写到硬盘上。
操作系统调参
你需要修改一些系统参数来应付服连接峰值负载或严重阻塞的站点。
net.core.somaxconn是Linux中的一个内核参数,表示socket监听的backlog上限。而backlog表示socket的监听队列,当一个请求尚未被处理或建立时,它就会进入backlog中。而socket server可以一次性处理backlog中的所有请求,处理后的请求不在位于监听队列中。所以当Server处理请求较慢时,会使监听队列被逐渐填满,最终导致新请求被拒绝。该参数的默认值是128,所以当Linux系统部署了需要经常处理新请求的高负载的服务时,就需要加大这个参数值,可以通过以下方式修改:
# 该方法会在重启后失效
# sysctl -w net.core.somaxconn=1024
# 永久生效的方法
# vi /etc/sysctl.conf
# 新增一行
net.core.somaxconn=1024
上面的参数可能不太常用,但是加大文件描述符数量是一种更一般性的手段,用以提高服务性能。在Linux中,每一个连接都会打开一个文件句柄,所以更多个连接将意味着更多的文件句柄,这也就意味着越高负载的服务需要越高上限的文件描述符数量,这需要在/etc/security/limits.conf文件中设置,同样,你也需要在nginx配置中加大worker_connections和worker_rlimit_nofile的数量。
另一方面,瞬时端口也可能需要加大,当nginx作为反向代理服务器时,每一个上游连接都会打开一个临时端口用于返回数据,如果系统配置没有打开最大的瞬时端口,就需要改改了,这个配置项为net.ipv4.ip_local_port_range。这个参数一般会设置到1024-65535。TCP端口上限为1024,65535则是瞬时端口的上限,记住瞬时端口的最小值一定要大于监听端口的最大值。
发表回复