服务器大负载情况下客户端出现Connection reset by peer
作者:tweyseo
背景
在一次交易服务扩容的之后,监控发现APIServer上在忙时会出现服务被熔断的日志 (upstream server temporarily disabled),进一步发现被熔断的服务是扩容进来的服务。进一步通过运维人员得知,由于这个机器的配置较好,所以upstream的权重也配的比较大。
定位
于是开始在新机器上定位问题。发现对应进程的CPU较高,然后再通过SS发现,对应应用的端口除了ESTABLISTH以外,还有大量的SYN_RECV状态。再观察发现对应应用的端口在LISTEN状态的Send-Q列和Recv-Q列的值都是128,这说明当前应用的待accept队列的最大值只有128,并且已经满了。于是这里推论出:由于应用的上层过于繁忙,造成应用的网络层无法及时去对已经完成三次握手的连接进程accept操作,造成待accept队列拥堵,从而造成待完成连接队列也发生拥堵(上述SS出现的大量SYN_RECV状态),最后对于客户端就出现Connection reset by peer了。
原理分析
这里进一步分析下这两个队列:
由于TCP建立连接使用3次握手 ...
keepalive_requests
作者:tweyseo
01
最近客户端(APP)换了新的网络库,几轮测试下来,功能和性能上都是正常的,只是网络库对应的日志里会有连接被关闭的提示,开始以为新的网络库踩到坑了,客户端的同学排查了几轮下来,过滤抓包发现是服务端发fin包主动关闭的连接,于是找到我说帮忙排查下。
02
先说下我们测试环境里的服务端的架构,客户端使用基于HTTP/1.1的长连接直连服务端的一个基于lor的APIServer,APIServer再对应后端的其他服务。
03
我这里就直接在APIServer上抓包,发现果然是APIServer上发起的fin包。仔细观察,发现fin包的前一个包,是一个响应客户端请求的包,而且让人比较困惑的是,这个包用HTTP协议解析出来,里面的status竟然还是200(这样就排除了是因为请求出错,NGX主动关闭的这个连接),然后间隔200ms后就是fin包了,再来观察这个响应包,发现HTTP协议解析出来的头,有connection: close的字段:
可是在APIServer里打印了该响应包在ngx.print之前的具体的头部信息,发现并没有connection: clo ...
Moonscript如何显示复选框
Moonscript如何显示复选框
"/checkbok": =>
@url_for: =>
@html ->
form method: "POST", action: @url_for(), ->
input type: "hidden",
name: "csrf_token", value: @csrf_token
input type: "checkbox", name: "username"
input type: "checkbox", name: "password"
有意思的脚本moonscript
这是一个测试
这又是一个测试
新测试
想看看lua到底有什么web框架,为了找到和openresty有点关系的框架,就找到了lapis,lapis是可以在openresty上跑的,更有意思的是,lapis可以使用moonscript,moonscript是一位叫做leafo的人写的。
moonscript是基于用lua的lpeg库来写的。
Django的Static静态文件目录设定
作者:糖果
Django的静态文件设定,与Nginx的static设定方式存在差异,需要在对应应用的setting文件中进行配置,配置的内容如下:
SITE_ROOT=os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')
STATIC_ROOT = os.path.join(SITE_ROOT,'static')
STATIC_URL='/static/'
STATICFILES_DIRS = (
("css", os.path.join(STATIC_ROOT,'css')),
("js", os.path.join(STATIC_ROOT,'js')),
("img", os.path.join(STATIC_ROOT,'img')),
)
在工程的Static目录下,只要添加一个新的静态目录,需追加定义到"STATICFILES_DIRS"中。
关于
友情赞助!~
关注本站作者:
微博账号:
糖果lua
Lapis安装与项目创建
Lapis是程序员leaf写的一个lua语言的WEB框架,目前已经发布了1.3版本。要求的服务器开发环境是Openresty,而且支持moonscript,这个moonscript语言类似于Javascript的coffescript。起到的作用是,可以用简短moonscript实现你的任务,然后通过翻译程序把moonscript翻译成lua语言。
Lapis还提供了命令行工具,用来管理nginx实例的启动,关闭,重新加载。
1.安装luarocks.
在Lua语言生态工具中,有一个类似于Python的Pip一样的引用管理工具,叫做Luarocks。这个工具可以方便的安装,目前在Lua世界中很多的软件包。而如果正好使用的Linux是Ubuntu系统,使用sudo apt-get install luarocks就可以安装Luarocks了。
2.Lapis的安装:
当在Linux系统上安装完luarocks之后,使用如下命令就可以安装lapis:
luarocks install lapis
因为lapis是在有openresty基础上运行,我们假设现在openresty已经安装好了。 ...
Lua的WEB开发框架Lapis
在过去的一段时间里,使用Lua语言开发WEB程序。原因是因为我们需要写一个WEB的防火系统,其中的一个实现方案是 Openresty+lua的方案。
Openresty是一种高性能的WEB服务器程序,和Nginx有着很深的渊源,简单的理解的就是Openresty 使用了Nginx的核心模块,外加了其他的一些服务部件,最主要的是Openresty支持使用Lua编写WEB程序,来处理用户的请求,也真是因为这个原因,被我们选做WEB防火墙的一个实现方案。
其实,写这个文档的目的,不是单纯的追求说明一下Lua的WEB程序怎么编写,还有Lapis框架如何使用,如果是这个目的来看,可以直接去独Lapis的英文文档,从学习和实用角度来看也是效率最高的。
而这篇文档的目的,是想通过Lua语言和Lapis框架来做个实践,从设计角度和实现角度,来分析实际的WEB开发,我们都需要解构出那些任务,以一个怎样相对共同的标准来看,那些语言工具或是框架的设计,能更好的完成WEB开发工作。(WEB防火墙系统)
这些标准和设计的原则,其实是具有共性的,甚至和语言都是无关的,语言作为一种工具,哪种语言的特性是有力于我们的 ...
Lua功能模块之“加密”
作者:糖果
在Lua开发的世界中,有很多开源的模块,分布在一些网站(比如开普勒项目),github上,有的都已经配置好了,可以向python的pip工具一样,只不过在lua世界中使用luarocks安装工具快速的安装。
我们在开发的工作中,难免要对一些数据进行加密处理,而加密模块的使用有是就必不可少。
在lua官方的WIKI列表中就列出了,很多lua程序写的加密库,这写加密库有的是用纯lua写的,也有用lua调用C的程序实现加密。不过有些时候甄选这些库还是需要花一些时间精力,只是需要测试一下这是加密算是否是好用的
这是lua组织列出的一览列表。
http://lua-users.org/wiki/CryptographyStuff
说一下为什么要加密,我们面临的任务是什么!我们现在面临的任务是,要对一段字符串进行sha256算法加密。
我们从列表中选出了几个支持sha256加密的包,并说明一下这几个工具包。
1.SecureHashAlgorithm和SecureHashAlgorithmBW
这个工具包是支持sha256加密的,而且是纯lua方法的实现,问题是,这两个包分别依赖lu ...


