注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

Nginx配置文件优化  

2016-08-20 07:53:29|  分类: 服务器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Nginx(读音engine x)服务器由于性能优秀稳定、配置简单以及跨平台,被越来越多的公司和个人所采用,现已成为市场份额继Apache之后的第二大Web服务器。但是在大部分的网上教程中,对Nginx配置文件优化并没有过多的涉及。总体说来,应用服务器的性能优化主要在合理使用CPU、内存、磁盘IO和网络IO四个方面,调整Nginx配置文件 nginx.conf就可以进行优化了。
1) 工作进程数的选择
指令:worker_processes 
定义了Nginx对外提供web服务时的工作进程数。最优值取决于许多因素,包括(但不限于)CPU核心的数量、存储数据的硬盘数量及负载模式。不能确定的时候,一般建议设置成服务器逻辑核心数(或者完全小白的话,就设置为“auto”将尝试自动检测它)。如果需要判断服务器逻辑核心数,请使用如下指令:

cat /proc/cpuinfo | grep processor | wc -l

2)是否绑定CPU
指令:worker_cpu_affinity
绑定工作进程到对应CPU核心,Nginx默认未开启CPU绑定。目前的服务器一般为多核CPU,说实在的,大多数程序对服务器各个CPU的使用率并不是很智能。这种情况下使用手动CPU绑定,以达到CPU使用率相对均匀的状态,充分发挥多核CPU的优势。比如四核服务器,那么可以参考如下例子[这里其实就是设置下二进制的标志位]:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

3)打开文件数限制
指令:worker_rlimit_nofile
设定了每个Nginx工作进程打开的最大文件数,受限于系统的用户进程打开文件数限制,未设置则使用系统默认值。理论上应该设置为当前Shell启动进程的最大打开文件数除以Nginx的工作进程数。Shell执行命令 ulimit -n 可以查看当前登录Shell会话最大打开文件数量限制。当然如果最好的话,请将最大打开文件数量限制为65536。使用命令如下:

#在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535

或者

#在/etc/profile 中增加一行

ulimit -SHn 65535

或者

#在/etc/rc.local 中增加一行

ulimit -n 65535

4)惊群问题
指令:accept_mutex
如果 accept_mutex 指令值为 on 启用,那么将轮流唤醒一个工作进程接收处理新的连接,其余工作进程继续保持睡眠;如果值为 off 关闭,那么将唤醒所有工作进程,由系统通过use指令指定的网络IO模型调度决定由哪个工作进程处理,未接收到连接请求的工作进程继续保持睡眠,这就是所谓的“惊群问题”。Apache的进程数很多,成百上千也是时有的事,“惊群问题”也尤为明显,影响相对较大。但其实,对Nginx而言,一般来说,worker_processes都会设置成CPU个数,所以最多也就几十个,即便发生惊群问题的话,影响相对也较小。Nginx为了稳定,参数值保守的设置为 on 开启状态。网站访问量比较大,为了系统的吞吐量,可以将其设置成Off 提高性能和吞吐量。
5)网络IO模型
指令:use
定义了Nginx设置用于复用客户端线程的轮询方法(也可称多路复用网络IO模型)。这自然是选择效率更高的优先,Linux 2.6+内核推荐使用epoll,FreeBSD推荐使用kqueue,安装时Nginx会自动选择。但你也可以手动设置。
6)连接数
指令:worker_connections
定义了Nginx一个工作进程的最大同时连接数,不仅限于客户端连接,包括了和后端被代理服务器等其他的连接。官网文档还指出了该参数值不能超过 worker_rlimit_nofile 值,所以建议设置成和 worker_rlimit_nofile 值相等[即65535]。
7) 打开文件缓存
指令:open_file_cache
开启打开文件缓存,默认值 off 关闭,强烈建议开启,可以避免重新打开同一文件带来的系统开销,节省响应时间。如需开启必须后接参数 max=数字,设置缓存元素的最大数量。当缓存溢出时,使用LRU(最近最少使用)算法删除缓存中的元素;可选参数 inactive=时间 设置超时,在这段时间内缓存元素如果没有被访问,将从缓存中删除。示例:

open_file_cache max=65536  inactive=60s

指令:open_file_cache_valid
设置检查open_file_cache缓存的元素的时间间隔。
指令:open_file_cache_min_uses
设置在由open_file_cache指令的inactive参数配置的超时时间内, 文件应该被访问的最小次数。如果访问次数大于等于此值,文件描述符会保留在缓存中,否则从缓存中删除。
8) 日志相关
指令:access_log 和 error_log
当并发很大时,访问日志和错误日志的保存肯定会造成对磁盘的大量读写,也将影响Nginx的性能。并发量越大,IO越高。所以一般情况下,生产环境的服务器除非必要,一般都是关闭访问日志和错误日志,或者将日志保存到tmpfs文件系统里,或者减少保存的访问日志条目和错误日志的级别,从而避免磁盘IO的影响。关闭日志使用请使用:

access_log off

如必须保存日志,那么也最好按每日或者每时或者其它时间段对日志做切割,这也可以减小IO,虽然可能效果不是特别大,不过因为日志文件尺寸变小了很多,也方便查阅或归档分析日志。一般线上环境建议错误日志设置为 error 或者 crit。
9)安全相关
指令:server_tokens
开启或关闭“Server”响应头中输出的Nginx版本号。推荐设置为 off,关闭显示响应头的版本号,对性能的提高有小小的裨益,同时还是为了安全起见,让人无法找到版本号对应的漏洞,从而被攻击。
10)压缩相关
指令:gzip
Nginx默认开启了gzip压缩功能。这个就不多说了,gzip on 开启压缩后,大约可以减少75%的文件尺寸,不但节省了比较多的带宽流量,也提高了页面的整体响应时间。建议还是开启。当然也不是所有的静态文件都需要压缩,比如静态图片和PDF、视频,文件本身就应当做压缩处理后保存到服务器。这些文件就不需要再次使用gzip压缩。
指令:gzip_comp_level
指定压缩等级,其值从1到9,数字越大,压缩率越高,越消耗CPU,负载也越高。9等级无疑压缩率最高,压缩后的文件尺寸也最小,但也是最耗CPU资源,负载最高,速度最慢的,这对于用户访问有时是无法忍受的。一般推荐使用1-4等级,比较折衷的方案。使用等级2。
指令:gzip_min_length
指定压缩的文件最小尺寸,单位 bytes 字节,低于该值的不压缩,超过该值的将被压缩。推荐设置为1k,太小的文件也没必要压缩。
指令:gzip_types
指定允许压缩的文件类型,Nginx配置目录 conf 下的 mime.types 文件存放了Nginx支持的文件类型,text/html类型文件,文件后缀为html htm shtml默认压缩。推荐配置[压缩html,css,xml及js]:

gzip_types text/plain text/css application/json application/x-javascript  text/javascript text/xml application/xml

11)浏览器缓存
指令:expires
设置HTTP应答中的“Expires”和“Cache-Control”头标。"Expires"一般结合"Last-Modified"使用。当设置了合理的expires配置时,对提升网站访问速度非常有效果。原理就在于浏览器第一次访问Web页面元素,会下载页面中的的静态文件到本机临时缓存目录下。而第二次及之后再次访问相同URL时将发送带头标识"If-Modified-Since"和本地缓存文件时间属性值的请求给服务器,服务器比对服务器本地文件时间属性值,如果未修改,服务器直接返回http 304状态码,浏览器直接调用本地已缓存的文件;如果时间属性值修改了,重新发送新文件。这样就避免了从服务器再次传送文件内容,减小了服务器压力,节省了带宽,同时也提高了用户访问速度,一举三得。指令后接数字加时间单位,即为缓存过期时间;-1 表示永远过期,不缓存。强烈建议添加expires配置,针对不同的文件类型就设置不同的过期时间:

location ~ .+\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .+\.(js|css|xml|javascript|txt|csv)$
{
expires 30d;
}

12)持久连接
指令:keepalive_timeout
启用Http的持久连接Keepalive属性,复用之前已建立的TCP连接接收请求、发送回应,减少重新建立TCP连接的资源时间开销。建议是当网站页面内容以静态为主时,开启持久连接;若主要是动态网页,且不能被转化为静态页面,则要关闭持久连接。后接数字和时间单位符号。正数为开启持久连接,0关闭。
13)减少HTTP请求次数
网站页面中存在大量的图片、脚本、样式表、Flash等静态元素,减少访问请求次数最大的优点就是减少用户首次访问页面的加载时间。可以采用合并相同类型文件为一个文件的办法减少请求次数。Nginx可以通过安装阿里巴巴提供的Concat或者Google的PageSpeed模块实现这个合并文件的功能。Concat源代码网址:https://github.com/alibaba/nginx-http-concat/,PageSpeed源代码网址:https://github.com/pagespeed/ngx_pagespeed。
14)PHP加速
Nginx需要调用FastCGI接口转给PHP解释器执行,然后将结果返回给Nginx。Nginx可以开启FastCGI的缓存功能,从而提高性能。
指令:fastcgi_temp_path
定义FastCGI缓存文件保存临时路径。
指令:fastcgi_cache_path
定义FastCGI缓存文件保存路径和缓存的其它参数。缓存数据以二进制数据文件形式存储,缓存文件名和key都是通过对访问URL使用MD5计算获得的结果。缓存文件先保存至fastcgi_temp_path指定的临时目录下,然后通过重命名操作移至fastcgi_cache_path指定的缓存目录。levels指定了目录结构,子目录数以16为基数;keys_zone指定了共享内存区名和大小,用于保存缓存key和数据信息;inactive指定了缓存数据保存的时间,当这段时间内未被访问,将被移出;max_size指定了缓存使用的最大磁盘空间,超过容量时将最近最少使用数据删除。建议fastcgi_temp_path和fastcgi_cache_path设为同一分区,同分区移动操作效率更高。示例:

fastcgi_temp_path /tmp/fastcgi_temp;
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:16m inactive=30m max_size=1g;

示例中使用/tmp/fastcgi_temp作为FastCGI缓存的临时目录;/tmp/fastcgi_cache作为FastCGI缓存保存的最终目录;一级子目录为16的一次方16个,二级子目录为16的2次方256个;共享内存区名为cache_fastcgi,占用内存16MB;缓存过期时间为30分钟;缓存数据保存于磁盘的最大空间大小为1GB。
指令:fastcgi_cache_key
定义FastCGI缓存关键字。启用FastCGI缓存必须加上这个配置,不然访问就会出错,所有PHP的请求都为访问第一个PHP文件URL的结果。
指令:fastcgi_cache_valid
为指定的Http状态码指定缓存时间。
指令:fastcgi_cache_min_uses
指定经过多少次请求相同的URL将被缓存。
指令:fastcgi_cache_use_stale
指定当连接FastCGI服务器发生错误时,哪些情况使用过期数据回应。
指令:fastcgi_cache
缓存使用哪个共享内存区。
好了,在学习了相关知识之后,利用这些配置就可以让网站更快,这里只是简单示范,大家还需要针对自己的服务器状态做相应调整。

  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018