【Nginx】Nginx性能优化 旧城等待, 2022-12-19 11:37 200阅读 0赞 ## 1、Nginx运行工作进程数量 ## Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1看出来, 也可以查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l 查看启动后的进程数 ps -aux | grep nginx |grep -v grep **现在都是自动获取了** worker_processes auto; ## 2、Nginx运行CPU亲和力 ## worker\_cpu\_affinity配置是写在/etc/nginx/nginx.conf里面的。 2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。 * 2核CPU,开启2个进程 > worker\_processes 2; > worker\_cpu\_affinity 01 10; 01表示启用第一个CPU内核,10表示启用第二个CPU内核 worker\_cpu\_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。 * 2核CPU,开启4个进程 > worker\_processes 4; > worker\_cpu\_affinity 01 10 01 10; 开启了四个进程,它们分别对应着开启2个CPU内核 * 4核CPU,开户4个进程 > worker\_processes 4; > worker\_cpu\_affinity 0001 0010 0100 1000; 0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推 * 4核CPU,开启2个进程 > worker\_processes 2; > worker\_cpu\_affinity 0101 1010; 0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核 * 8核CPU,开户8个进程 > worker\_processes 8; > worker\_cpu\_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推 **worker\_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。** ## 3、Nginx最大打开文件数 ## worker\_rlimit\_nofile 65535; 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。 注:文件资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者\*代表所有用户来设置。 * soft nofile 65535 * hard nofile 65535 用户重新登录生效(ulimit -n) ## 4、Nginx事件处理模型 ## events { use epoll; worker_connections 65535; multi_accept on; } nginx采用epoll事件模型,处理效率高。 work\_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work\_connections。 multi\_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。 ## 5、开启高效传输模式 ## http { include mime.types; default_type application/octet-stream; …… sendfile on; tcp_nopush on; … } * Include mime.types : 媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。 * default\_type application/octet-stream :默认媒体类型足够。 * sendfile on:开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 * tcp\_nopush on:必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。) ### 6、连接超时时间 ### 主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。 keepalive_timeout 60; #防止网络阻塞,不过要包涵在keepalived参数才有效。 tcp_nodelay on;#超时时间。 open_file_cache max=102400 inactive=20s; #为打开文件指定缓存,max指定缓存数量,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s;#多长时间检查一次缓存的有效信息 open_file_cache_min_uses 1; client_header_buffer_size 4k; #客户端请求头部的缓冲区大小。 client_header_timeout 15;#设置请求头的超时时间 client_body_timeout 15;#设置请求体的超时时间。 reset_timedout_connection on;#告诉nginx关闭不响应的客户端连接。但释放那个客户端所占有的内存空间。 send_timeout 15;#响应客户端超时时间 client_max_body_size 10m; #上传文件大小限制。 ## 7、fastcgi 调优 ## fastcgi_connect_timeout 600; # 连接超时 fastcgi_send_timeout 600; # 请求超时 fastcgi_read_timeout 600; # 响应超时 fastcgi_buffer_size 64k; # 缓存区 fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; #繁忙时候的缓存区 fastcgi_temp_file_write_size 128k; # 临时缓存区 fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp; fastcgi_intercept_errors on; fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g; #fastcgi_cache缓存目录 ### 关于缓存 ### fastcgi\_buffers 控制 nginx 最多创建 8 个大小为 4K 的缓冲区,而 fastcgi\_buffer\_size 则是处理 Response 时第一个缓冲区的大小,不包含在前者中。所以总计能创建的最大内存缓冲区大小是 8*4K+4K = 36k。而这些缓冲区是根据实际的 Response 大小动态生成的,并不是一次性创建的。比如一个 8K 的页面,Nginx 会创建 2*4K 共 2 个 buffers。 当 Response 小于等于 36k 时,所有数据当然全部在内存中处理。如果 Response 大于 36k 呢?fastcgi\_temp 的作用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。同时你会在 error.log 中看到一条类似 warning。 显然,缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,浪费内存。 ### fastcgi其他配置 ### * fastcgi\_cache\_valid 200 302 1h :\#用来指定应答代码的缓存时间 * fastcgi\_cache\_valid 301 1d :将301应答缓存一天。 * fastcgi\_cache\_valid any 1m :将其他应答缓存为1分钟。 * fastcgi\_cache\_min\_uses 1 :该指令用于设置经过多少次请求的相同URL将被缓存。 * fastcgi\_cache\_key `http://$host$request_uri` :该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.一般根据`$host`(域名)、`$request_uri`(请求的路径)等变量组合成proxy\_cache\_key 。 * fastcgi\_pass :指定FastCGI服务器监听端口与地址,可以是本机或者其它。 ### 总结: ### nginx的缓存功能有:proxy\_cache / fastcgi\_cache proxy\_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。 fastcgi\_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。 proxy\_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。 fastcgi\_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。 ## 8、gzip 调优 ## 使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。 Nginx启用压缩功能需要你来ngx\_http\_gzip\_module模块,apache使用的是mod\_deflate。 一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的! gzip on; #开关 gzip_min_length 2k; # 文件多大开始压缩 gzip_buffers 4 32k; # 压缩缓存区 gzip_http_version 1.1; # 压缩版本 gzip_comp_level 6; # 压缩比例 越大越耗CPU gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml; #指定压缩的类型 gzip_vary on; #varyheader支持 gzip_proxied any; ## 9、expires 缓存调优 ## 缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires缓存配置在server字段里面。 location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ { expires 30d; #log_not_found off; access_log off; } location ~* \.(js|css)$ { expires 7d; log_not_found off; access_log off; } 注:log\_not\_found off;是否在error\_log中记录不存在的错误。默认是。 ### 总结: ### * expire功能优点: 降低网站购买的带宽,节约成本; 同时提升用户访问体验; 减轻服务的压力,节约服务器成本,是web服务非常重要的功能。 * expire功能缺点: 被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。 网站不希望被缓存的内容: 网站流量统计工具; 更新频繁的文件(google的logo)。 ## 10、防盗链 ## 防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种: 水印,品牌宣传,你的带宽,服务器足够; 防火墙,直接控制,前提是你知道IP来源; 防盗链策略下面的方法是直接给予404的错误提示。 location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { valid_referers noneblocked www.benet.com benet.com; if($invalid_referer) { #return 302 http://www.benet.com/img/nolink.jpg; return 404; break; } access_log off; } 参数可以使如下形式: none :意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)。 blocked :意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。 server\_names :为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“\*”通配符。 ## 11、内核参数优化 ## 一般别动、真的。
还没有评论,来说两句吧...