nginx指令配置释义

在Nginx配置中,指令不少,但与nginx性能主要有关的并非不少,在使用中,公司的ops都会给出他们的标配,每每咱们除非有特殊的性能需求,才会考虑nginx的默认配置是否对性能有影响,且nginx自身在设计时,对性能的优化已考虑不少。 html

OS考量
  • 事件模型:nginx的事件模型应与选择的操做系统相匹配, Linux 2.6+有效的模型是使用epoll。
  • 文件描述符:由于与客户端创建对应的链接,表明须要使用某文件句柄描述符与之通讯,可使用命令ulimit -a查看系统设定值,建议特别是高并发时,尽可能提升内核限制,而后使用nginx指令worker_rlimit_nofile 改变nginx worker 进程可打开的最大文件描述符限制。
Nginx 自身
  • worker_processes : 定义nginx worker进程的数量,系统默认为1,一般设定这个值时,应该与cpu核的数目一致,即便比CPU核数目多出,但不会带来很明显的效益,在测试时发现,增长这个数字,会当即提升CPU使用率,但更可能是由于进程的调度形成,并无有效利用CPU。此外,还应考虑读取文件的大小以及负载模式。若是业务逻辑有大量的阻塞IO操做,能够适当提升这个值。
  • worker_connections: 某worker进程在某时刻可维持的链接数,wiki指出nginx的最大客户端链接数为worker_connections*worker_processes值,不少人给出的建议是尽可能调大这个值,当业务高并发链接时。理想设置是(umilit -n) /num of worker_processes ,可是考虑到HTTP请求的特性,短暂而高突发且不一样请求的时长不一致,能够都设置为最大值umlit --n ,实际中使用时,可根据本身的状况适当调整,毕竟描述符的使用也是须要系统资源的。
  • worker_cpu_affinity : 绑定worker进程到某特殊的CPU上,仅容许FressBSD与Linux使用,参考别人的建议以及实际压测发现,并无带来变化,毕竟操做系统层次的调度算法,可参考的运行因素不少,会比实际手工分配有机会在负载均衡上作得更出色,不建议去考虑此指令,除非你的CPU负载在实际查看中发现存在问题,但也是推荐修改调度算法。
  • sendfile:在于传输TCP帧时,能够将数据直接从内存写到网络芯片的缓存中,避免数据在内核态到用户态之间反复上下文切换,以及其余内存访问操做如TLB,虚拟内存地址到实地址的映射等,下降CPU消耗等,通常建议开启。在网上查阅相关配置时,指出当读取文件过大(>4M)时,建议关闭这个选项,调整其余指令的值,特别是输出缓冲区,使用异步IO(Linux许多版本还不支持)等,可是至于为何关闭sendfile,发现都没有很好的解释,看sendfile的官方指出在初始设计时,并非针对大文件的偏移操做,可是2.4版本已经添加sendfile64,且已经有glibc的sendfile透明封装好,于是对于这个建议仍是很困惑。有人给出的解释是“以平衡磁盘与网络I/O处理速度,下降系统的uptime”,可是以为仍是模糊,毕竟磁盘有内核缓存,网络芯片也有自身的缓存。偶然间看到nginx邮件列表中的内容,指出sendfile在nginx中传输文件的大小是受到限制的。
  • TCP_NODELAY与TCP_NOPUSH: 与socket选项有关,决定着操做系统如何处理网络缓存以及什么时候将数据发送给终端用户。TCP_NOPUSH, 避免传输数据小,网络带宽没法有效利用,将多个数据组包一块儿发送,也就是Nagle's 算法, 而wiki中指出仅能与sendfile一块儿使用,能够方便在调用sendfile以前准备头部信息,或优化网络吞吐率,毕竟减小传输过程的网络数据包。可是HTTP的数据更可能是偏向流处理,而不是相似telnet,等待用户输入数据,且此算法会有最高达200ms的延迟上限; TCP_NODELAY则是禁用Nagle's 算法,wiki指出启用仅被包含在keep_alive 链接里。Linux 内核2.5.17 以后已经容许两个指令能够组合在一块儿使用。默认是TCP_NODELAY 开启,TCP_NOPUSH 关闭。
  • keepalive_timeout: 涉及到HTTP协议的特性,容许客户端与服务端创建的链接持续到所设置的时间为止,容许客户端发起多个请求,而再也不进行屡次握手协议,节省socket创建的时间,与NGINX自身的优化却是无关,更多体如今客户端加载页面多个资源的响应速度,影响用户的体验。根据业务适当设置,以避免恶意的客户端占用,形成性能的影响。
减小IO

Nginx在CPU与内存使用上效率都很高,广泛不是性能瓶颈,可是磁盘由于自身的特色,形成读写都很慢,于是应尽可能减小nginx的磁盘读写。 linux

  • open_file_cache:缓存打开的文件描述符、文件大小以及修改时间,还有存在的目录信息等其余信息,至于相关配置其余指令可参考nginx wiki.
  • access_log :记录正常的访问请求,可用于统计,安全检查等,可是却频繁的读写文件,且buffer不工做,对于任何的日志项打开文件,写完后就迅速关闭文件。若是没有特殊需求,建议关闭。不然尝试改变请求访问日志记录的保存方式等,固然容忍其开启也能够。
  • error _log: 与access_log同样,可是由于出错的请求并非不少,于是开启影响不大!

在nginx中也须要调整buffer大小,设置太小,某些请求或者后端返回的数据就会存储在临时文件中,形成磁盘的读写。 nginx

  • client_body_buffer_size: 请求体的缓存大小,若是请求体的数据大于设置的这个值将会被写入到临时文件中,于是在处理post请求的数据时,须要注意这个选项。
  • fastcgi_buffers: 用于缓存后端fastcgi进程返回的数据,当返回的数据过大就会写入临时文件,于是运行PHP程序时,能够适当调整此值,默认是32KB/64KB,取决于操做系统的页设置大小。
  • output_buffers :这条指令虽然nginx有关的配置中出现,可是在nginx指令的索引中没有找到,并且查阅很多配置,发现更可能是读取大文件时,关闭sendfile,调整此值,提升服务器的吞吐率。
  • gzip:并不属于减小磁盘IO,可是能够有效减小网络传输数据的大小,毕竟现实中数据包传输时间受带宽影响的时间要明显高于主机之间的距离形成的传送时间,于是压缩数据包,能够有效利用带宽,下降带宽形成的延迟,默认压缩级别是7,可是压缩级别不要设置过高,毕竟要消耗CPU时间,带来的压 缩效果并不很明显。

可能在配置中看到的其余某些选项 算法

  • client_header_buffer_size与large_client_header_buffers: 缓存请求头,当请求头的大小超出这两个指令指定的缓存限制时,就会返回相关错误码,于是采用默认配置就好,并不影响nginx的性能。
  • client_body_timeout与client_header_timeout:更可能是设置服务端在读取客户端发送的请求时设置的超时时间,避免客户端恶意或者网络情况不佳形成链接长期占用,影响服务端的可处理的能力。须要注意的是,client_body_timeout是设置在两个连续的读取操做之间的超时,并非传输整个请求体的超时时间设置。当相关的数据包在超时时间内没有读取到时,都会返回408,默认设置值是60s。
  • send_lowat与send_timeout: 侧重与客户端的交互,send_lowats 当设置为非零值时,nginx就会试图减小对客户端socket的发送操做,默认设置为零;而send_timeout是设置服务端传送回应包时的超时时间,针对两个连续的写操做,而不是整个回应过程的超时设置,默认设置60s.

在Nginx中还有不少其余指令,可能会影响到浏览器的行为,如某些模块的指令可有效利用浏览器的本地缓存,可以影响到用户浏览网页的体验效果。
在实际使用中,若是没有特殊需求,可直接采用使用nginx源码安装后给出的默认配置,调整worker_processes以及worker_connections,其余参数,针对须要,决定是否开启。 后端

参考文献
  1. http://nginx.org/en/docs/http/ngx_http_core_module.html#directives
  2. http://linux.die.net/man/2/sendfile
  3. http://www.techrepublic.com/article/use-sendfile-to-optimize-data-transfer/ (对sendfile如何起做用很不错的分析)
  4. http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads
  5. http://www.lifelinux.com/how-to-optimize-nginx-for-maximum-performance/
  6. http://baus.net/on-tcp_cork/ (tcp_nopush设置时,对业务的弊与利)
  7. https://calomel.org/nginx.html (nginx配置文件样例还有些调优的内容)
  8. http://www.phoenixvps.com/guides/2013/04/nginx-configuration-examples (nginx 配置文件样例)
相关文章
相关标签/搜索