Nginx 的性能优化(性能调优)

摘要:nginx 的性能优化,nginx 最大连接数,worker_processes,worker_connections ,nginx 的 gzip 压缩,nginx 的工作模式,multi_accept ,expires 缓存设置。

worker 进程配置

worker_processes –  nginx 的 worker 进程数(默认为1)。在大多数情况下,每个 cpu 内核运行一个工作进程运行良好,我们建议设置此指令 auto 以实现这一目标。有时您可能需要增加此数目,例如,当辅助进程必须执行大量磁盘 i/o 时。

[root@localhost ~]# ps aux | grep nginx
root      1565  0.0  1.1  34636 11380 ?        Ss   10月15   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www       1566  0.0  3.4  56060 34868 ?        S    10月15   0:00 nginx: worker process
root      9695  0.0  0.0 112736   992 pts/1    R+   20:35   0:00 grep --color=auto nginx

也可以通过 worker_cpu_affinity 参数设定,将每个 worker 进程绑定到对应的 cpu 上面,来防止 cpu 跨核切换引发缓存丢失,作为缓存丢失和过度上下文切换的结果要访问本地内存。

worker_processes  4;
worker_cpu_affinity 0010 0100 1000;

0101 表示开启第一个和第三个内核,1010 表示开启第二个和第四个内核,2个进程对应着四个内核,worker_cpu_affinity 配置是写在 nginx 配置文件里面的,2 核是 01,四核是 0001,8 核是 00000001,有多少个核,就有几位数,1 表示该内核开启,0 表示该内核关闭。


返回限制

limit_conn 以及 limit_conn_zone – 限制 nginx 接受的客户端连接数量,例如从单个 ip 地址。设置它们可以帮助防止单个客户端打开过多的连接并消耗比其资源共享更多的资源。

# 设置共享内存区域的参数,该参数将保留各种键的状态
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
    # 当且仅当 limit_conn 当前级别上没有指令时,这些指令才从上一级继承
    
    location /download/ {
        limit_conn addr 1; # 一次每个 ip 地址只允许一个连接
    }
}

limit_reqlimit_req_zone – 限制nginx 理请求的速率,这与设置具有相同的好处 limit_rate。它们还可以通过将请求速率限制为对人类用户合理的值,但对于试图通过请求淹没您的应用程序的程序(例如 DDoS攻击中的机器人)太慢,可以提高安全性,尤其是对于登录页面而言。

# 设置共享内存区域的参数,该参数将保留各种键的状态
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
    # 当且仅当limit_req 当前级别上没有指令时,这些指令才从上一级继承 
    
    location /search/ {
        limit_req zone=one burst=5; # 平均每秒最多允许不超过 1 个请求,并且突发不超过 5 个请求
    }
}

limit_rate – 限制每个连接向客户端传输响应的速率(因此打开多个连接的客户端可以为每个连接消耗此带宽量)。设置限制可以防止某些客户端使系统过载,从而确保所有客户端的服务质量更高。

location /images/ {
    root html;
    set $limit_rate 4k;
}


gzip 压缩

gzip 压缩使用的是 nginx 的 ngx_http_gzip_module 模块。开启 gzip 压缩后,nginx 会在返回内容前将内容压缩后返回,可以减少带宽和提高传输速度,给用户更好的体验。但是压缩文件也会消耗 cpu 资源,所以要合理使用。

http {
    gzip on; # 开启压缩
    gzip_min_length  1k; # 低于 1 K 不压缩
    gzip_buffers     4 16k; # 设置用于压缩响应的number和size的缓冲区
    gzip_http_version 1.1; # 设置压缩响应所需的最低 http 版本请求
    gzip_comp_level 2; # 压缩级别 1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 压缩文件类型
    gzip_vary on; # 是否添加 Vary: Accept-Encoding 响应头
    gzip_proxied   expired no-cache no-store private auth; # 根据请求和响应为代理请求启用或禁用响应的压缩
   gzip_disable   "MSIE [1-6]\."; # 配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
}

查看文件是否 gzip 压缩,直接在浏览器的返回 Response Headers 头中查看是否存在 content-encoding: gzip 参数。


expires 缓存

对于一些静态文件,我们可以利用 nginx 的 expires 模块来缓存到浏览器中,不必要每次访问到从服务器获取。

expires 30s; # 表示把数据缓存30秒
expires 30m; # 表示把数据缓存30分
expires 10h; # 表示把数据缓存10小时
expires 1d; # 表示把数据缓存1天

location ~* \.(gif|jpg|jpeg|png) {
    root  root/images;
    expires 3d;
}

用 chrome 浏览器抓下包,cache 那一列是 memory cache 就证明这次访问是从浏览器中取的缓存,如果想从服务器获取,直接强刷以下就可以了。


nginx 工作模式

events 指令设定 nginx 的工作模式及连接数上限。

events {
    use epoll;
}

use 指令用来指定 nginx 的工作模式,nginx 支持的工作模式有 select、 poll、 kqueue、 epoll 、 rtsig 和/ dev/poll,不过 epoll 是最优的。当然也可以不指定事件处理模型,nginx 会自动选择最佳的事件处理模型。

[root@localhost ~]# ulimit -a|grep "open files"
open files                      (-n) 65535

可以看到当前系统的打开的最大文件数量是 65535,而默认的 51200 是小于这个值得,所以一般不同更改。我们也可以设置参数  worker_rlimit_nofile 来限制 worker 进程最大打开文件数的限制。

events {
    worker_connections 51200;
}

worker_connections – 每个 worker 进程可以同时处理的最大连接数,默认值为 51200,这个值一般不用更改。但是该数目包括所有连接(例如,与代理服务器的连接等),而不仅包括与客户端的连接。另一个需要考虑的因素是,并发连接的实际数量不能超过打开文件最大数量的当前限制,可以通过 worker_rlimit_nofile 进行更改 。

每个 worker 进程可以处理的最大并发量计算如下:从用户的角度讲,一次请求会并发两个链接,一个输入一个输出,所以这个值应该是 worker_connections * worker_processes/2 这么计算。但是如果 nginx 还要将请求发送到动态解释器去解析动态文件,所以这个最大并发数量应该是 worker_connections * worker_processes/4 这么计算。

events {
    multi_accept on;
}

开启 multi_accept 指令,一个 worker 进程尽可能的接收多个请求连接,如果被禁用了,那么每次只能接受一个新的连接。如果开启,一个 worker 进程可以同时接受所有的连接。


参考:

Tuning NGINX for Performance

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top