web服务器出现大量CLOSE_WAIT连接的前因后果

摘要:
后来测试出来是一个管理身份的用户登陆就会引发这个错误,并且运维在查看服务器情况的时候发现有大量的http请求,并且状态为CLOSE_WAIT。看了下请求的ip地址,正是我们的图片服务器的ip。所以才会产生那么多CLOSE_WAIT的http连接,正是这些没有及时关闭的http连接占用了服务器的正常http请求,导致了不能正常访问。根据我查到的资料,CLOSE_WAIT状态的连接在2个小时后也会自己关闭的,所以网站才会过段时间自己恢复正常。

公司网站一直很稳定,前段时间开始偶尔出现网站无法打开,提示504的错误,运维有怀疑是程序更新引起的,但是仔细看过代码并没有获取数据量过大的地方,而且数据库表现也一直很平稳。所以一直也无从下手,不知道问题出在哪里,每一次出现这个问题重启下iis可以解决,或者有的时候是过段时间自己就解决了,所以这个问题一直悬而未决。

直到昨天晚上网站再次更新,在进行功能验证的时候频繁出现这个问题。后来测试出来是一个管理身份的用户登陆就会引发这个错误,并且运维在查看服务器情况的时候发现有大量的http请求,并且状态为CLOSE_WAIT。看了下请求的ip地址,正是我们的图片服务器的ip。上网查了下这个问题,发现大都是说这个问题是socket程序中出现的,怎么我们的web程序也出现了这样的问题呢?

、 web服务器出现大量CLOSE_WAIT连接的前因后果第1张

先不去纠结这个,还是从代码入手吧。于是看了下管理身份的用户登陆的代码,重要去关注跟图片服务器相关的地方。最终发现这个账号登陆后会获取很多图片用于在首页轮转显示,关键的问题是在显示这些图片的时候会先执行一个方法判断这个图片路径是否存在,如果不存在则返回一个默认的本地图片地址。

 public static string GetTrueImgPath(stringurl)
        {
            HttpWebRequest myReq =(HttpWebRequest)WebRequest.Create(url);
            try{
                HttpWebResponse myRes =(HttpWebResponse)myReq.GetResponse();
                if (myRes.ContentLength > 0)
                {
                    return url; //存在   
}
                else{
                    return "/Contents/Images/img_fload.gif";
                }
            }
            catch{
                return "/Contents/Images/img_fload.gif";
            }
           
        }

看到这个代码估计大家一下子就知道问题出在哪里了,HttpWebResponse的请求最后没有被关闭!所以才会产生那么多CLOSE_WAIT的http连接,正是这些没有及时关闭的http连接占用了服务器的正常http请求,导致了不能正常访问。根据我查到的资料,CLOSE_WAIT状态的连接在2个小时后也会自己关闭的,所以网站才会过段时间自己恢复正常。至此问题的根源已经找到,就差修改代码然后进行验证了,代码修改如下:

 public static string GetTrueImgPath(stringurl)
        {
            var myReq =(HttpWebRequest)WebRequest.Create(url);
            myReq.KeepAlive = false;
            HttpWebResponse myRes;
            try{
                myRes =(HttpWebResponse)myReq.GetResponse();
                if (myRes.ContentLength <= 0)
                {
                    url = "/Contents/Images/img_fload.gif";
                }
                myRes.Close();
            }
            catch{
                url = "/Contents/Images/img_fload.gif";
            }
            returnurl;
        }

更新到服务器后进行验证也通过了,没有再出现CLOSE_WAIT的连接,至此问题解决。

免责声明:文章转载自《web服务器出现大量CLOSE_WAIT连接的前因后果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Omnibus testAndroid 源代码自动编译packages/apps下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python接口自动化-接口基础(二)

一、HTTP请求方式 1.常见请求方式 方法 描述 GET 请求指定的页面信息,并返回实体主体 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改 PUT 从...

location.href和location.replace和location.reload的不同(location.replace不记录历史)

location.href iframe.location.href window.location.href      整个URL字符串(在浏览器中就是完整的地址栏) reload 方法,该方法强迫浏览器刷新当前页面。     语法: location.reload([bForceGet])                               ...

转载:Android应用的自动更新模块

软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很流行使用Splash界面, 正好与自动更新配套在一起; 在这个自动更新Splash中, 使用到了 动画设置 ,SharedPerference ,pull解析...

常见网页错误400/401/403/404/500网页错误代码表示的含义

转载:http://blog.csdn.net/yanchao315/article/details/76686827 HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。 HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。 请与...

通过url 下载文件

1、问题简介   通过文件的url,将文件下载到本地。文件存储的位置为:tomcat服务器的文件夹(通过读取properties文件:可看:http://www.cnblogs.com/0201zcr/p/4700418.html) 2、实现思路   读取properties文件,将获得文件将要存储的位置   通过java的Url类,将网上的文件下载到本地...

Nginx配置转发

nginx location proxy_pass 后面的url 加与不加/的区别  在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。 首先是location进行的是模糊匹配 1)没有“/”时,locatio...