nginx502错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Moolight_shadow/article/details/60578438

环境说明

这里写图片描述
如上图,主要做服务的是最后端的那台.net的web服务器,通过两台nginx做负载提供一个vip跟防火墙做映射为外网提供web服务

问题描述

在网站上下载小文件正常下载大文件会出现502,但这个502页面不会直接出现在浏览器,在打开浏览器开发者工具才能看到502

问题解决(结合上面拓扑图)

1.看nginx是否正常

一般在产品线上出这种问题都是从外向内看问题,外网没问题就在内网,内网分为后面web服务层与前面nginx与nginx负载层,先看nginx与网站日志(ip跟域名我用IP跟DOMAIN代替了)

[02/Mar/2017:17:19:34 +0800] ***IP*** - - - ***DOMAIN*** "GET /smartbi/xwcz/getexportsuccess HTTP/1.1" [200] 0 "http:DOMAIN/Insurance?curr_id=40" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" "-" [0.003] [0.002] [200]
[02/Mar/2017:17:19:34 +0800] ***IP*** - - - ***DOMAIN***"GET /PatientsChronicDiseases/Index/GetDoctorExportListByHospitalid1?departmentname=-99&cbxdoctorname=-99&doctorname=&hospitalid=1026333&iDisplayStart=0&iDisplayLength=100000 HTTP/1.1" [502] 568 "http://***DOMAIN***/PatientsChronicDiseases/Index/PatientsDiseases?userid=AFCA58EDCD1B4CC697BB9D1BC0413F85" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" [0.083] [0.083] [502]
[02/Mar/2017:17:19:34 +0800] ***IP*** - - -***DOMAIN*** "GET /PatientsChronicDiseases/Index/GetDoctorExportListByHospitalid1?departmentname=-99&cbxdoctorname=-99&doctorname=&hospitalid=1026333&iDisplayStart=0&iDisplayLength=100000 HTTP/1.1" [502] 568 "http://***DOMAIN***/PatientsChronicDiseases/Index/PatientsDiseases?userid=AFCA58EDCD1B4CC697BB9D1BC0413F85" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" [0.082] [0.082] [502]
[02/Mar/2017:17:19:34 +0800] ***IP*** - - - ***DOMAIN***"GET /PatientsChronicDiseases/Index/GetDoctorExportListByHospitalid1?departmentname=-99&cbxdoctorname=-99&doctorname=&hospitalid=1026333&iDisplayStart=0&iDisplayLength=100000 HTTP/1.1" [502] 568 "http://***DOMAIN***/PatientsChronicDiseases/Index/PatientsDiseases?userid=AFCA58EDCD1B4CC697BB9D1BC0413F85" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" [0.079] [0.079] [502]
[02/Mar/2017:17:19:35 +0800]  ***IP***  - - - ***DOMAIN*** "GET /PatientsChronicDiseases/Index/GetDoctorExportListByHospitalid1?departmentname=-99&cbxdoctorname=-99&doctorname=&hospitalid=1026333&iDisplayStart=0&iDisplayLength=100000 HTTP/1.1" [502] 568 "http://***DOMAIN***/PatientsChronicDiseases/Index/PatientsDiseases?userid=AFCA58EDCD1B4CC697BB9D1BC0413F85" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" [0.077] [0.077] [502]
[02/Mar/2017:17:19:35 +0800] ***IP***  - - -***DOMAIN*** "GET /PatientsChronicDiseases/Index/GetDoctorExportListByHospitalid1?departmentname=-99&cbxdoctorname=-99&doctorname=&hospitalid=1026333&iDisplayStart=0&iDisplayLength=100000 HTTP/1.1" [502] 568 "http://***DOMAIN***/PatientsChronicDiseases/Index/PatientsDiseases?userid=AFCA58EDCD1B4CC697BB9D1BC0413F85" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" [0.078] [0.077] [502]

2.看不出什么毛病,检查是不是nginx限制了文件大小,查看nginx的配置文件

    fastcgi_connect_timeout  300;
    fastcgi_send_timeout  300;
    fastcgi_read_timeout  300;
    proxy_buffer_size  128k;
    proxy_buffers  32 32k;
    proxy_busy_buffers_size  128k;
    client_max_body_size  10m;

先看这几项的大小限制是否合适,在这儿大都参数取了始终偏大值没问题

3.当从外向里看问题看不出什么问题的时候试试从里向外看问题,在.net服务器本地不走负载看看直接用服务器的ip:PORT访问本地看看大小文件是否下载正常,多设几个与外网访问的对照组看看

经过多次试验之后本地也不能正常下载比较大的文件

4.问题定位到本地.net服务器

查看后端代码是否正常,后面发现下载文件的代码有问题

问题解决

关于Reponse.Flush()的使用
Web项目中需要把服务器上的一个文件下载到客户端。代码很简单,直接贴上代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->        /// <summary>
        ///  下载查看文件方法
        /// </summary>
        /// <param name="fileserverURL">文件的相对路径(上传到服务器中的虚拟路径)。如:E:\User\\aa\\a.doc</param>
        /// <param name="page">所操作的页面名称</param>
        /// <returns>下载文件成功返回true,否则返回flase</returns>
        public bool FilesDownload(string fileserverURL, System.Web.UI.Page page)
        {
            try
            {
                string fileserverpath = page.Server.MapPath(fileserverURL);
                System.IO.FileInfo fi = new System.IO.FileInfo(fileserverpath);
                fi.Attributes = System.IO.FileAttributes.Normal;
                System.IO.FileStream filestream = new System.IO.FileStream(fileserverpath, System.IO.FileMode.Open);
                long filesize = filestream.Length;
                int i = Convert.ToInt32(filesize);

                page.Response.ContentType = "application/octet-stream";
                page.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(fileserverpath, System.Text.Encoding.UTF8));
                page.Response.AddHeader("Content-Length", filesize.ToString());
                byte[] fileBuffer = new byte[i];
                filestream.Read(fileBuffer, 0, i);
                filestream.Close();
                page.Response.BinaryWrite(fileBuffer);
                page.Response.Buffer = true;
                page.Response.Flush();
                //page.Response.Clear();
                page.Response.Close();
                page.Response.End();
                return true;
            }
            catch
            {
                return false;
            }
        }

在使用page.Response.Flush()前,需要加上page.Response.Buffer=true这句;表示对输出的内容进行缓冲,执行page.Response.Flush()时,会等所有内容缓冲完毕,将内容发送到客户端。这样就不会出错,造成页面卡死状态,让用户无限制的等下去。page.Response.Buffer = true和page.Response.Flush()常一起使用。不然page.Response.Flush()会报错。另外page.Response.Clear()这句注释掉了,表示不会清除缓冲区里的内容,用户多次在同一个页面下载文件时,就直接从缓存中读取文件,下载到客户端,去掉这句,当第二次,第三次请求文件时,页面呈卡死状态。

问题解决引用自http://www.cnblogs.com/purplefox2008/archive/2010/08/24/1807321.html

总结

出问题了外部发现的问题不一定是由于外部产生的,所以不能陷入在哪里发现的问题就是那里的原因的局限,要考虑清楚问题的联系,先从离问题近的地方切入解决,解决不了在反向思考,多设对照组多对照

猜你喜欢

转载自blog.csdn.net/Moolight_shadow/article/details/60578438
今日推荐