Nginx优化之服务性能优化

优化Nginx服务的worker进程个数

修改nginx主配置文件

worker_processes 1;  #指定了Nginx要开启的进程数,结尾数字就是进程个数

Nginx有Master进程和worker进程之分,Master为管理进程,真正接待“顾客”的是worker进程。

优化Nginx进程个数的策略

(1)worker_processes参数大小的设置最好和网站的用户数量相关联,

(2)新搭建服务器时,worker进程数最开始的设置可以等于CPU的核数,高流量高并发场合也可以考虑将进程数提高至CPU核数*2

查看Web服务器CPU硬件资源信息

通过/proc/cpuinfo可查看CPU个数及总核数。查看CPU总核数的示例如下:

grep processor /proc/cpuinfo 
processor   : 0
processor   : 1
processor   : 2
processor   : 3

grep processor /proc/cpuinfo | wc -l
4               #表示为1颗CPU四核
#查看CPU总颗数示例如下:
grep "physical id" /proc/cpuinfo 
physical id : 0     #物理ID一致,同一颗CPU
physical id : 0     #物理ID一致,同一颗CPU
physical id : 0     #物理ID一致,同一颗CPU
physical id : 0     #物理ID一致,同一颗CPU
grep "physical id" /proc/cpuinfo | sort | uniq | wc -l
1               #去重复,表示1颗CPU

修改重启后的worker进程数量,如下:

ps -ef | grep "nginx" | grep -v grep
root       1110      1  0 11:12 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      1429   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1430   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1431   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1432   1110  0 11:33 ?        00:00:00 nginx: worker process     

从“worker_processes 4”可知,worker进程数为4个。Nginx Master主进程不包含在这个参数内,Nginx Master的主进程为管理进程,负责调度和管理worker进程。

Nginx事件处理模型优化

在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows中使用的是icop,等等。

也可以不指定事件处理模型,Nginx会自动选择最佳的事件处理模型服务。 

#具体的配置参数如下:
events      #events指令是设定Nginx的工作模式及连接数上限
{
    use epoll;     #use是一个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select,poll,kqueue,epoll,rtsig和/dev/poll。
  其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。
  对于Linux系统Linux2.6+内核,推荐选择epoll工作模式,这是高性能高并发的设置 }

调整Nginx单个进程允许的客户端最大连接数

调整Nginx单个进程允许的客户端最大连接数,控制参数为work_connections。 (worker_connections的值要根据具体服务器性能和程序的内存使用量来指定)

events  #events指令是设定Nginx的工作模式和连接数上线
{
    worker_connections 20480;
    #worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024.最大客户端连接数由worker_processes和worker_connections决定,
  即Max_client
= worker_processes*worker_connections。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令
  “ulimit -HSn 65535”或配置相应文件后,worker_connections的设置才能生效。 }

实际的并发连接数除了受worker_connections参数控制外,还和最大打开文件数worker_rlimit_nofile有关,Nginx总并发连接=worker数量*worker_connections。 

配置Nginx worker进程最大打开文件数

worker_rlimit_nofile 65535;
#最大打开文件数,可设置为系统优化后的ulimit     -HSn的结果

放置位置:主标签段  此参数的作用是改变worker processes能打开的最大文件数 

开启高效文件传输模式

http模块

设置参数1:sendfile on;   #激活或禁用sendfile()功能功能。 

#sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率。

 设置参数2:tcp_nopush on;  #激活或禁用Linux上的TCP_CORK socket选项,此选项仅仅当开启sendfile时才生效,允许把http response header和文件的开始部分放在一个文件里发布,作用是减少网络报文段的数量。

优化Nginx连接参数,调整连接超时时间

连接超时的作用

(1)将无用的连接设置为尽快超时,可以保护服务器的系统资源

(2)当连接很多时,及时断掉那些已经建立好的但又长时间不做事的连接,以减少其占用的服务器资源

(3)黑客攻击网站,就会不断地和服务器建立多个连接,消耗连接数,大量消耗服务器的资源.

(4)LNMP环境中,如果用户请求了动态服务,则Nginx就会建立连接,请求FastCGI服务以及后端MySQL服务,,后端的FastCGI服务及MySQL服务也有对连接的超时控制。

不同程序连接设定知识

服务器建立新连接也是要消耗资源的,因此,超时设置得太短而并发很大,就会导致服务器瞬间无法响应用户的请求,导致用户体验下降。

PHP程序站点设置成短连接,PHP程序建立连接消耗的资源和时间相对要少些。对于Java程序站点来说,一般建议设置长连接,因为Java程序建立连接消耗的资源和时间更多.

Nginx连接超时的参数设置

在http模块

设置参数(1):keepalive_timeout 60;      #保持会话的超时时间为60秒

设置参数(2):tcp_nodelay on;        #用于激活tcp_ondelay功能,提高I/O性能。

  默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能。使用tcp_nodelay功能,等待时间会比较长。

设置参数(3):client_header_timeout 15;      #设置读取客户端请求头数据的超时时间

  设置读取客户端请求头数据的超时时间。服务器端将返回“Request time out (408)”错误,可指定一个超时时间,防止客户端利用http协议进行攻击。

设置参数(4):client_body_timeout 15;      #用于设置读取客户端请求主体的超时时间,默认值60

设置参数(5):send_timeout 25;         #用于指定响应客户端的超时时间。

上传文件大小的限制

调整上传文件的大小

在Nginx主配置文件里加入如下参数:

client_max_body_size 8m;            #具体大小根据公司的业务做调整,如果不清楚就先设置为8m.

设置最大的允许的客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会受到413错误,设置为0表示禁止检查客户端请求主体大小。

 FastCGI相关参数调优

Nginx FastCGI客户端向后请求PHP动态引擎服务(php-fpm(FastCGI服务器端)

 fastcgi_connect_timeout ;      #表示Nginx服务器和后端FastCGl服务器连接的超时时间,默认值为60fastcgi_ connect. timeout 秒,这个参数值通常不要超过75秒,因为建立的连接越多,消耗的资源就越多

fastcgi_send_timeout ;        #设置Nginx允许FastCG1服务器端返回数据的超时时间,即在规定时间之fastcgi_ send. timeout 内后端服务器必须传完所有的数据,否则,Nginx将断开这个连接。其默认值为60秒

 fastcgi_read_timeout ;       #设置Nginx从FastCGl服务器端读取响应信息的超时时间,表示连接建立fastcgi_ read_ timeout 成功后,Nginx等待后嶺服务器的响应时间,是Nginx已经进人后端的排队之中等候处理的时间

 fastcgi_buffer_size 64k;      #这是Nginx FastCGl的缓冲区大小参数,设定用来读取以FastCGl服务器端收到的第-一部分响应信息的缓冲区大小,这里的第-部分通常会包含-一个fastcgi_ buffer. size小的响应头部。默认情况下,这个参数的大小是由fastegi buffers 指定的一个缓冲区的大小

 fastcgi_buffers 4 64k;        #设定用来读取从FastCGl服务器端收到的响应信息的缓冲区大小和缓冲区数量,默认值为fastcgi buffers 8 4k{8k;。指定本地需要用多少和多大的缓冲区来缓冲FastCGl的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓fastcgi_ buffers 冲区来缓存;如果页面大小大于256KB.那么大于256KB的部分会缓存到fastcgi temp 指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“1616k”, "464k”等

proxy_busy_buffers_size ;      #用于设置系统很忙时可以使用的proxy_ buffers大小,官方推荐的大小为proxy_ buffers*2

fastcgi_busy_buffers_size ;      #用于设置系统很忙时可以使用的fastcgibuffers大小,官方推荐的大小为fastcgi_ buffers*2

fastcgi_temp_file_write_size ;     #FastCGI临时文件的大小,可设为128~256KB

fastcgi_cache_valid ;      #示例: fastcgi cache_ valid 200 302 1h;用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时。示例: fastcgi_ cache_ valid 301 ld;将301应答缓存1天。示例: fastcgi_ cache_ valid any 1m,将其他应答缓存设置为1分钟

 fastcgi_ cache_ min_ uses;    #示例: fastcgi_ cache_ min_ uses 1;设置请求几次之后响应将被缓存,1表示一次即被缓存

fastcgi_ cache_ use_ stale;     # 示例: fastcgi_ cache_ use_ stale error timeout invalid_ header http_ 500;定义在哪些情况下使用过期缓存

fastcgi_ cache_ key;     #示例: fastcgi_ cache_ key $request_ method://$host$request_ uri;fastcgi_ cache_ key http://$host$request uri;定义fastcgi cache的key,示例中以请求的URI作为缓存的key, Nginxfastcgi_ cache_ key 会取这个key的md5作为缓存文件,如果设置了缓存散列目录,Nginx会从后往前取相应的位数做为目录。注意一定要加上$request_ method 作为cache key, 否则如果先请求的为head类型,后面的GET请求返回为空

Nginx gzip压缩实现性能优化

Nginx gzip压缩功能介绍

Nginx gzip压缩模块提供了压缩文件内容的功能,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

Nginx gzip压缩的优点

(1)提升网站用户体验;发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了

(2)节约网站带宽成本:数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍微消耗一些CPU资源,这个一般可以忽略。

#此功能既能提升用户体验,又能使公司少花钱,一举多得。对于几乎所有的Web服务来说,这是一个非常重要的功能,Apache服务也有此功能。

需要和不需要压缩的对象

纯文本内容压缩比很高,纯文本的内容最好进行压缩,例如:html,js,css,xml,shtml等格式的文件。

被压缩的纯文本文件必须要大于1KB.

图片,视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的.

参数介绍及配置说明

Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装。

对应的压缩参数说明如下:

#######压缩的配置介绍######
gzip on;    #开启gzip压缩功能
gzip_min_length 1k;      #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值0,表示不管页面多大都进行压缩。
建议设置成大于1K,如果小于1K可能会越压越大。
gzip_buffers 4 16K;    #压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;      #压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,
使用默认即可。
gzip_comp_level 2;      #压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
gzip_types text/plain application/x-javascript text/css application/xml;
      #用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。
gzip_vary on;        #vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存经过Nginx压缩的数据。

配置Nginx expires缓存实现性能优化

 Nginx expires功能介绍

简单说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。

 Nginx expires功能优点

  1. expires可以降低网站的带宽,节约成本。
  2. 加快用户访问网站的速度,提升用户访问体验。
  3. 服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以节约人力成本。
  4. 对于几乎所有的Web服务来说,这是非常重要的功能之一,Apache服务也有此功能。

 Nginx expires配置详解

根据文件扩展名进行判断,添加expires功能范例:

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 3650d;        #缓存时间3650天
}

 location ~ .*.(js|css)$

 {

  expires 30d;

}

}

根据URL中的路径(目录)进行判断,添加expires功能范例:

location ~ ^/(images|javascript|js|css|flash|media|static)/
{
    expires 360d;
}

当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?

对于经常需要变动的图片等文件,可以缩短对象缓存时间

当网站改版或更新时,可以在服务器将缓存的对象改名

企业网站缓存日期曾经的案例参考

  • 新浪:15天
  • 京东:25年
  • 淘宝:10年

企业网站有可能不希望被缓存的内容

  • 广告图片,用于广告服务,都缓存了就不好控制展示了。
  • 网站流量统计工具(JS代码),都缓存了流量统计就不准了。
  • 更新很频繁的文件(google的logo),这个如果按天,缓存效果还是显著的。
原文地址:https://www.cnblogs.com/ywrj/p/9388925.html