从”好友档案”说nginx与长连接、短连接

 最近人人流行这么一个应用“好友档案”,但是这个很火的app用的人很多,确总是在白天高峰时间出现nginx 504 gateway timeout错误页面,究竟为什么呢?带着问题,就顺便补习下web server以及长连接、短连接的相关知识吧。

 
Why 504 gateway timeout?
 
首先介绍一下大明顶顶的nginx。Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。它通常放在后台应用服务器apache或者tomcat的前面,用来做反向代理、长连接、负载均衡、IP过滤等。
 
那么“好友档案”这个应用为什么会出现504错误呢?首先eginx没有任何问题,它只是和客户端浏览器保持长连接(下面说明什么是长连接),然后转发动态的请求到后端的应用服务器,虽然和应用服务器之间是短连接,但是应用服务器的响应还是成了瓶颈,像apache这种应用服务器是进程制的,所以一旦连接起来,后台处理比较慢的情况下应用服务器开启了过多的进程,导致连接满,无法再响应更多的请求导致的。
 
What is 长连接、短连接?
 
首先先了解HTTP协议,HTTP协议是无状态的,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
 
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持,但还是无状态的,或者说是不可以信任的。如果浏览器或者服务器在其头信息加入了这行代码
 
Connection:keep-alive
 
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
 
现在的web服务器基本上都提供长连接的方式,所谓长连接就是客户端一次请求完后,不关闭连接,保持一段时间的连接,下次此客户端再次请求时,不用创建新连接,复用所保持的连接即可,省去了TCP连接三次握手的时间。从理论上,长连接可以免去大量建立和关闭连接的资源消耗,但同时也有大量连接被占用的代价。长连接比短连接能带来更高的TPS,更低的CPU消耗,更少的IO,更高的内存占用。
 
Nginx就是目前应用很广的一个web服务器,它通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close"。Nginx与前端的连接默认为长连接,一个用户跟Nginx建立连接之后,通过这个长连接发送多个请求。如果Nginx只是作为reverse proxy的话,可能一个用户连接就需要多个向后端的短连接。如果后端的服务器(源站或是缓存服务器)处理并发连接能力不强的话(比如单进程的squid),就可能导致瓶颈的出现。
 

Leave a Comment.