文档章节

Nginx反向代理腾讯云COS的一个坑

腾讯云开发者社区
 腾讯云开发者社区
发布于 2017/03/31 16:40
字数 944
阅读 181
收藏 0

有一个朋友开发的手机app,把大量文件都保存在腾讯云COS上,然后通过CDN分发。 最近有一个特殊的需求,希望通过CVM来提供部分COS文件的访问。因为服务器用的是Nginx,所以事情也很简单: 1 到COS的管理页面上查询一下内网访问域名

2 给nginx增加一个标准的upstream配置,上游指向腾讯云COS的内网域名

照理说,配置好域名解析就可以开始工作了。但是一开始工作就出现很奇怪的现象:下载开始很快,随后变得很慢,最终有很大概率失败。

首先排除网络原因的可能性。登录服务器用wget通过访问本机localhost验证: 现象就是前面都下载的飞快,到了最后一部分就突然下载不动了。

打开nginx的error_log,发现了upstream timed out (Connection timed out)错误

再排除COS有问题的可能性:

现在问题就很诡异了:上游没有问题,经过反向代理后文件的前面一大部分也都没有问题,就是最后一小截文件要等待很久很久,并且发生了upstream timed out超时。

通过肥龙找到了熟悉nginx的ares同学协助抓包,才定位到了这个问题:

这里的UA是wget,wget默认使用的是http1.0协议。当前服务器使用的nginx是1.0.15这个比较古老的稳定版,还不支持 proxy_http_version 1.1这样的参数(要到1.1.4版本以后才支持)。所以也是采用http1.0协议代理了请求。

照理说innercos服务接到这样的请求应该按照http1.0的方式返回数据,但是我们看到服务器返回了 HTTP/1.1 200 OK 。也就是说不管客户端支持什么http版本cos服务总是用http1.1协议来工作。

http1.1有一个重要的特性是keep-alive,也就是说http数据传输完毕后TCP连接继续保持一段时间不断开,可以给后续的http请求重用。而http1.0的客户端原则上并不知道http1.1的这套原理。所以对于这个老版本的Nginx来讲,它收到完整的数据以后,看到TCP链接一直没有断开,以为upstream还有话说,就一直挂在那里,等上游继续送数据,直到上游连接超时,才在error_log里面记录一个timed out错误,然后断开下游的连接。

把proxy_buffering 关掉让上下游直接对上话可以绕过这个问题,但是有附带的损失。更好的办法是把nginx升级到1.1.4以上的版本,并且开启proxy_http_version 1.1 。

至此圆满解决。

总结一下,腾讯云COS的后台服务假设客户端都支持http1.1协议,对http1.0协议没有做很好的兼容,而腾讯云CVM提供的带Nginx的系统镜像里面的Nginx版本又有点儿老旧了,proxy还只能工作在http1.0上,导致了这个问题的出现。

相关推荐

【腾讯云的1001种玩法】Nginx + Tomcat 负载均衡配置详解

nginx 基本入门


阅读原文,本文由腾云阁授权发布,经社区允许后方可转载。更多技术文章,请访问腾云阁

© 著作权归作者所有

腾讯云开发者社区
粉丝 189
博文 286
码字总数 857839
作品 0
深圳
私信 提问
加载中

评论(0)

页面静态化

1.什么是页面静态化 页面静态化,可以分为伪静态与静态化两种 伪静态是指将动态链接通过一定的手段变成静态文件的链接(restful方式等),如userdetail.htm?userid=1234 变成 userdetail/1234....

顾志雄
2015/12/16
313
2
Nginx反向代理豆瓣API接口为小程序提供数据

因为近来豆瓣的开发者平台已经无限期的下线,而且由于很多小程序直接请求豆瓣的接口,导致了豆瓣做了防盗链的,小程序完全不能打开。 但是服务器端用curl发现是可以访问,那么我们不如自己做...

开源中国最牛的人
2018/12/07
667
0
Nginx 利用代理转发请求实例

我们米扑科技的业务遍布全球,有时国外的客户无法访问我们搭建在国内的服务,这就要求我们在国外服务器上搭建一个代理转发服务,用户请求国外服务器的域名,然后代理转发到国内,处理请求后返...

sunboy2050
2018/03/09
211
0
无内测账号,手把手教你微信小程序开发

「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试。可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面)。本以为没有 AppID 这个月就与小程序无缘...

EarlGrey
2016/09/28
9.6K
6
如何打通前端dist和后端jar?

前端dist和后端jar已经分别独立部署到服务器上,这篇博客是对下面两篇博客的延续。 如何部署前端dist目录? 如何部署后端jar包? 那么,怎样打通前后端,产出一个完整的线上项目呢? 这篇博客...

趁你还年轻233
2019/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

.NET Core 3 WPF MVVM框架 Prism系列之命令

原文: .NET Core 3 WPF MVVM框架 Prism系列之命令 本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令# 我们在上一篇.NET Core 3 WPF MVVM框架 Pr...

osc_4dady4pk
23分钟前
24
0
Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手

原文: Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手 概述 ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行。 它的项目...

osc_3grma05a
24分钟前
28
0
php数组转字符串 加单双引号和逗号

$Arr = array(a,b,c,d,e,f,g) #join$str = " ' " . join("','", array_values($Arr) ) . " ' "; // 使用需要的符号拼接#str_replace$str = " ' ".str_replace( ",","','", impl......

啥都不会的程序员
25分钟前
25
0
性能计数器在.NET Core中的新玩法

原文: 性能计数器在.NET Core中的新玩法 传统的.NET Framework提供的System.Diagnostics.PerformanceCounter类型可以帮助我们收集Windows操作系统下物理机或者进程的性能指标,基于Performan...

osc_dg21zk4i
25分钟前
20
0
【WPF学习】第六十三章 理解WPF中的自定义元素

原文: 【WPF学习】第六十三章 理解WPF中的自定义元素   尽管可在任意WPF项目中编写自定义元素,但通常希望在专门的类库程序集(DLL)中放置自定义元素。这样,可在多个WPF应用程序之间共享自...

osc_5h77wdgp
26分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部