我已经谈过一些关于Nginx的常见问题,其中有一些是关于如何优化Nginx,很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行。
我有一些坏消息要告诉你,你不能像Apache一样优化Nginx。它没有魔术配置来减半负载或是让PHP运行速度加快一倍。高兴的是,Nginx已经优化的非常好了,当你决定使用Nginx并用 就是说,很多影响Nginx行为的参数其默认值并不是完全适合高并发的情况。我们也要考虑Nginx运行所在的平台,优化我们的操作系统当有一些限制的时候。 总的来说,我们无法优化单个连接的负载时间,但是我们可以确保Nginx的高并发处理环境。当然, 对于高并发我指的是每秒数百个请求连接,大多数人不需要了解这些。假如你太好奇或是想知道那就继续读吧。 首先,我们需要认识到Nginx几乎可能需要在所有的平台上使用,MacOS,Linux,FreeBSD,Solaris,Windows甚至一些更深奥的系统。他们大部分(这么翻译好些)实现了高性能的基于事件的polling方法,不幸的是Nginx的只支持其中4个系统。在四个系统中我倾向于FreeBSD,但你不会看到太大的性能差异,所以选择的操作系统让你用起来顺手,比选择最优化的操作系统更重要。 我想你一定猜到了windows不在其中。 Windows上的nginx确实没有什么理由让你值得使用。 Windows有自己的一套处理事件polling。 所以nginx的作者选择了不支持。 因此默认的还是使用select() 这种不是很高效而且性能会下降很多的方式。(初次翻译不是很好希望多多指教)
第二个最大的限制, 也是大多数人会遇到的问题是和操作系统相关的。 打开一个Shell窗口, 使用su命令切换到Nginx的运行用户, 运行命令
两种方式可以实现, 你可以通过ulimit设置os的: Nginx 限制除了注意操作系统的限制, 现在我来深入到Nginx本身,看看一些指令和方法,我们可以用它来调整Nginx。 Worker Processes(用英文会更好一些)
当你正在处理下面这种情况, 你有很多的阻塞(blocking)磁盘IO,这是你可以适当增加worker_process的值。 你需要针您的配置进行测试,检查静态文件的等待时间(waiting time), 如果值比较大,可以适当的增加 Worker Connections
默认的值是1024。 我们假设一个李兰奇一般情况下打开2个连接来通过管道获取网站资源,也就是最多可以同时处理512个用户的请求。听起来实在是太少了,但是我们在想一下默认的 此外,我们还必须考虑反向代理, 这将打开一个额外的连接到后台,但是,自Nginx的不支持持久连接到后台,这不是太大的问题,除非你有长时间运行的后台进程。
所有关于 CPU 亲和力设置CPU的亲和力,基本上意味着你告诉每个程序使用的CPU核心,而他们将只使用这个CPU核心。关于这一条,我不想说很多,但你要知道,如果你准备这样做,则必须非常小心。 要知道,你操作系统的 CPU 调度器处理负载均衡的能力要远远超过你。当然,如果你认为你的 CPU 负载均衡有问题,在调度层面上优化它,可能的话找一个替代的调度器。除非你知道你在做什么,否则不要碰这个。 Keep Alive
我在这篇性能文章里面提到这个原因非常简单。 对于最终用户来说keep alive对加载时间有着巨大的影响。 这是最重要的指标之一也是我们不断优化的原因。如果你的网站对用户来说感觉加载起来很快,他们就会很开心。 Amazon和一些其他的大型在线零售商做过许多类似的研究表明, 网站的加载时间和网站订单的完成有着直接的关系。
为什么 tcp_nodelay 和 tcp_nopush这两个指令也许是最难理解的nginx配置, 他们对于nginx的影响在网络的较低层。 你可以简单的认为这些指令决定了操作系统如何处理网络缓存和他们何时将这些缓存输出到最终用户(客户端)。 我只能建议大家如果你之前不了解这些概念你最好不要动它。 他们不会显著的改善或者改变性能, 所以最好使用他们的默认值。 硬件限制因为我们要处理nginx带来的所有可能的限制, 所以我们现在需要弄清楚如何有效的利用我们的服务器。为了做到这点我们需要看一下硬件层面的东西,由于大部分服务器瓶颈都会发生在这里。 一般服务器主要还有3个方面的瓶颈。 CPU,内存和IO。 Nginx在CPU的利用方面是非常高效的, 所以我会坦白的告诉你这不会成为瓶颈。 同样nginx在使用内存方面也是很高效的,这也不会成为瓶颈。 现在只剩下IO这个服务器瓶颈的罪魁祸首了。(搞得像找罪犯一样) 如果你经常使用服务器,那么你可能经历过这样认识。硬盘驱动器是真的,真的很慢。从硬盘驱动器读取可能是对服务器最昂贵的操作。 所以自然得出的结论是,为了避免IO瓶颈, 我们需要大量的减少nginx对硬盘驱动器的读写。 要做到这一点,我们可以通过修改Nginx的行为,以减少磁盘写操作,以及确保对nginx的内存限制,允许它避免磁盘访问。 Access Logs 默认情况下,Nginx的每个请求都会记录在磁盘上的日志文件中,你可以使用这个方法进行统计,安全问题检查等, 带着这会在一定程度上带来IO使用成本。 如果你不打算用这些访问日志来做一些检查或其他用途, 你可以直接关闭它以避免对磁盘写操作, 但是如果你需要访问日志,你可以考虑保存日志到内存中。这将会比直接写到磁盘上快很多,并且明显减少IO的使用。 如果你只打算使用访问日志进行统计,你可以考虑使用其他的比如Google analytics来取代(ga和access log还是有区别的 不能简单的取代哦),或者你只记录访问请求的部分信息而不是全部。 Error Logs
我内心小小的挣扎了一把,我是否要在这里阐述这个 Open File Cache
从文件系统中读取文件由2部分组成,打开和关闭文件。 考虑到这是一个有阻塞的操作,因此不要忽略这部分。 因此, 对于我们来说缓存打开文件的描述符是非常好的,这就是 Buffers
配置Nginx缓存的大小是一个非常重要的事情。 如果缓存大小设置的太小, Nginx将不得不把上游(用英文
彻底移除磁盘IO 最好的减少磁盘IO的方法无疑是不使用磁盘, 如果你的的应用只有少量的数据传输,你可以将数据都放入内存,这样就可以彻底不用考虑磁盘IO的阻塞了。 当然默认情况下你的操作系统也会缓存频繁访问的磁盘扇区, 所以内存越大磁盘的IO就会用到的越少。 这就意味着你可以通过增加内存来解决IO的瓶颈。 数据量越多,需要的内存越大。 网络IO 为了好玩,我们假设你有了足够大的内存来缓存你的所有数据。 这意味着理论上你的IO读速度达到了3-6gbps。 但是你没有那么快的网络通道。 不幸的是,我们可以优化的网络IO是有限的,我们要通过网络传输数据,所以还将受制于网络IO。 唯一真正有效的方法是尽量减少数据量或压缩。
幸运的是Nginx提供了gzip模块, 它可以使我们在将数据传输给客户端之前压缩它, 这将大大减少数据的大小。 一般来说 你也可以通过一些JavaScript和css缩小工具来减少传输文件大小。 但这些不是和Nginx很相关所以我相信你通过google可以获取更多的相关信息。 翻译来源:http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/ (责任编辑:IT) |