如何让你的Nginx 提升10倍性能?
开发者全社区
共 9002字,需浏览 19分钟
· 2020-08-09
负载均衡(参见“建议二”),反向代理服务器上运行负载均衡服务,把流量平均分配给几台应用服务器。有了负载均衡,添加应用服务器根本不需要修改应用。 缓存静态文件(参见“建议三”),图片或代码之类的可以直接请求的文件,都可以保存在反向代理服务器中,以便直接发给客户端。这样不仅可以更快地响应请求,还能减轻应用服务器的负担,加快其运行速度。 保证站点安全,可以配置反向代理服务器提升其安全级别,通过它监控来快速识别和响应攻击,从而保存应用服务器安全。
传统服务器与NGINX Worker的比较
静态内容缓存,不常变化的文件,如图片(JPEG、PNG)和代码(CSS、JavaScript),可以保存在边缘服务器中,以便快速从内容或磁盘中获取。 动态内容缓存,很多Web应用会为每个页面请求生成全新的HTML,把生成的每个HTML都缓存一小段时间,可能显著减少需要生成的页面总数,同时又可以保证交付的内容足够新鲜。
把内容放到离用户近的地方。离用户近,传输时间少。 把内容放到较快的机器上。机器快,检索速度快。 把内容从过度使用的机器中拿走。有时候机器会比在专注执行特定任务时慢很多,那是因为太多任务让它们分心。这时候把内容拿到其他机器上,不仅对缓存的内容有好处,对非缓存的内容同样有利,因为托管它们的主机的负担减轻了。
注意: 缓存涉及开发、决策和运维,完善的缓存策略,比如本文提到的这些,能够体现从DevOps角度考虑的价值。也说是说,开发人员、架构师、运维人员此时携手,共同保障一个网站的功能、响应时间、安全和业务目标。
会话缓存。使用ssl_session_cache指令开启缓存,缓存每次SSL/STL连接时用到的参数。 会话票或ID。把特定SSL/TLS会话的信息保存为一个会话票或ID,以便连接重用,而不必重新握手。 OCSP封套。通过缓存SSL/TLS证书信息减少握手时间。
文件描述符。NGINX对每个连接最多使用两个文件描述符。如果系统服务于很多连接,可能需要增大sys.fs.file_max这个对描述符的系统级限制,以及nofile这个用户文件描述符限制,以支持增大后的负载。 临时端口。在作为代理使用时,NGINX会为每个上游服务器创建临时端口。可以设置net.ipv4.ip_local_port_range,增大端口值的范围,以增加可用的端口量。此外,还可以减小net.ipv4.tcp_fin_timeout的值,它控制非活动端口释放重用的等待时间,加快周转。 对NGINX而言,请参考NGINX性能调优指南,了解如何不费吹灰之力将你的Linux系统优化为能够支持更大的吞吐量。
访问日志。不要每个请求的日志都马上写到磁盘,可以在内存里做个缓存,然后批量定入。对NGINX而言,将buffer=_size_参数添加到access_log指令,等内存缓冲区写满后再把日志写到磁盘。如果你添加了**flush=_time_**参数,那么缓冲区的内容也会按照指定时间写入磁盘。 缓冲。缓冲用于在内存里保存部分响应,直到缓冲区被填满,可以实现对客户端更有效的响应。无法写入内存的响应会被写到磁盘,从而降低性能。在NGINX的缓冲启用时,可以使用proxy_buffer_size和proxy_buffers指令来管理它。 客户端活动连接。活动连接可以减少时间消耗,特别是在使用SSL/TLS的情下。对NGINX而言,可以针对客户端提高keepalive_requests的数值,默认值为100;也可以增大keepalive_timeout的值,让活动连接持续时间更长,从而让后续请求得到更快响应。 上游活动连接。上游连接,即连接到应用服务器、数据库服务器的连接,同样可以从活动连接的设置中获得好处。对上游连接来说,可以增加活动连接,也就是每个工作进程可用的空闲活动连接的数量。这样可以增进连接重用,减少重开连接。关于活动连接的更多信息,请参考这篇博客。 限制。限制客户端使用的资源可以提升性能和安全性。对NGINX而言,limit_conn和limit_conn_zone指令限制指定源的连接数,而limit_rate限制带宽。这些设置可以防止合法用户“侵吞”资源,同时也有助于防止攻击。limit_req和limit_req_zone指令限制客户端请求。对于到上游服务器的连接,可以在上游配置区的服务器指令中使用max_conns参数,它限制对上游服务器的连接,防止过载。相关的队列指令会创建一个队列,在max_conns限制到达后将指定的请求数保存指定的时间。 工作进程。工作进程负责处理请求。NGINX采用基于事件的模型和OS相关的机制有效地在工作进程间分配请求。建议将worker_processes的值设置为每个CPU一个工作进程。如果需要,大多数系统都支持提高worker_connections的值(默认为512)。可以通过试验找到最适合你系统的这个值。 套接字分片。通常,一个套接字监听器向所有工作进程分发新连接。套按字分片则为每个工作进程都创建一个套接字监听器,由内核在套接字监听器可用时为其指定连接。这样可以减少锁争用,提升多核系统上的性能。要启用套接字分片,在listen指令中包含reuseport参数。 线程池。一个费时的操作会阻塞任何计算机进程。对Web服务器软件来说,磁盘访问可能阻碍很多较快的操作,比如内存中的计算和复制。在使用线程池的情况下,慢操作会被指定给一组独立的任务,而主处理循环会继续运行较快的操作。磁盘操作完成后,结果会返回到主处理循环。在NGINX中,read()系统调用和sendfile()被转载到了线程池。
反向代理服务器及负载均衡。没有负载均衡或池负载均衡,可能导致极低的性能。添加一个反向代理服务器,比如NGINX,可以减少Web应用在内存和磁盘之间的往返。负载均衡可以把任务从过载的服务器转移到空闲的服务器,也便于扩展。这些改变能极大地提升性能,与原有的部署方式最差的时候相比,10倍性能提升是很轻松的事,即使不到10倍那也在总体上有了质的飞跃。 缓存动态和静态内容。如果你的Web服务器同时又充当了应用服务器,那么通过缓存动态内容就可以达到高峰期10倍的性能提升。缓存静态内容也可以有几倍的性能提升。 压缩数据。使用JPEG、PNG、MPEG-4以及MP3等压缩格式能显著提升性能。如果这些手段都用上了,那么压缩的文本数据(代码及HTML)可以将初始页面加载时间提升两倍。 优化SSL/TLS。安全握手对性能有很大影响,因此对其进行优化可以让初次响应加快两倍,对于文本内容较多的网站尤其如此。优化SSL/TLS下的媒体文件带来的性能提升很小。 实施HTTP/2和SPDY。在使用SSL/TLS的情况下,这两个协议有可能提升网站的整体性能。 调优Linux和Web服务器。使用优化的缓冲策略、使用活动连接,将耗时的任务转载至独立的线程池,可以显著提升性能。比如线程池可以将磁盘操作密集性任务的性能提升至少一个数量级。
开发者全社区
评论
【第129期】程序员的新宠:三款终端工具,让你告别Xshell!
概述 WindTerm:跨平台的SSH利器 首先介绍的是WindTerm,这是一款使用C语言开发的跨平台SSH客户端。它不仅完全免费,而且没有商业使用的限制。WindTerm支持SSH v2、Telnet、Raw Tcp等协议,而且性能出色,甚至超过了FinalShell和Electerm。功能
前端微服务
0
上班的时候,有一群摸鱼搭子非常重要...
上班的时候,有一群摸鱼搭子非常重要!一到上班时间,他们就从四面八方涌进群里冒泡...从八卦聊到股市、从职场聊到乌X兰局势,偶尔还会复读、相亲、battle...然后,下午6点钟准时消失不见...所以你要不要加入我们一起摸鱼?我们有北京、上海、深圳、广州、杭州、武汉、成都、南京等8个城市的摸鱼群,还有
产品经理日记
0
周四002 瑞超:同样落寞的境遇——北雪平vs埃尔夫斯堡
上赛季最终排名联赛第9的北雪平本赛季伊始表现不佳,4轮战罢他们仅以1胜1平2负的战绩排在倒数第三,这支历史上曾夺得13次联赛冠军、6次杯赛冠军老牌劲旅,正如英格兰赛场上的一众百年俱乐部,在低谷中不断探索着出路。球队主教练安德烈亚斯·阿尔姆曾是AIK索尔纳及赫根队的主教练,他于今年年初刚刚拿起球队教鞭
产品与体验
0
你只是卡住了,你并没有被击垮
一旦思维僵化了,那就很难跟上这个真实世界的快节奏,更不可能自发地去发现自身问题,进而打破自己。思维僵化,会导致我们无法“活在当下,开放和接纳,并去做自己觉得重要的事情”。觉察自己思维僵化的特征,是改变的第一步。思维僵化导致了你的选择都是错误的。思维方式的不同,才是人跟人之间的不同。有的人遇到挫折了,
小Q聊产品
1
【第128期】提升编程效率VSCode变量命名插件推荐
概述 在编程的世界里,一个好的变量名不仅能够提升代码的可读性,还能反映出程序员的专业水平。Visual Studio Code(VSCode)作为一个广受欢迎的代码编辑器,拥有丰富的插件生态系统,其中不乏能够帮助我们高效命名变量的工具。今天,我们就来介绍几款VSCode上能够提升变量命名效率的插件
前端微服务
0
日本影山优佳最新杂志照,展现充满透明感的美丽
今天的图文分享的是影山优佳的杂志写真。元日向坂46的影山优佳,登上了写真杂志《周刊FLASH》5/7和5/14合并号的封面。影山优佳是日本艺人、女演员、前偶像。身高155厘米。2001年5月8日出生于东京都。2023年7月从组合日向坂46毕业,之后作为演员活跃的影山优佳,在《周刊FLAS
python教程
0
盘点一个使用超级鹰识别验证码并自动登录的案例
点击上方“Python共享之家”,进行关注回复“资源”即可获赠Python学习资料今日鸡汤江上几人在,天涯孤棹还。大家好,我是皮皮。一、前言前几天在Python钻石交流群【静惜】问了一个Python实现识别验证码并自动登录的问题,提问截图如下:验证码的截图如下所示:二、实现过程这里大家激烈的探讨,【
IT共享之家
0