http 403 错误 +“readv() 在读取上游时失败(104:对等方重置连接)”

Posted

技术标签:

【中文标题】http 403 错误 +“readv() 在读取上游时失败(104:对等方重置连接)”【英文标题】:http 403 error + "readv() failed (104: Connection reset by peer) while reading upstream" 【发布时间】:2014-11-01 00:34:04 【问题描述】:

前言:我正在使用 s3boto 作为默认存储后端的亚马逊 ec2 实例上运行 nginx + gunicorn + django。我是免费层。 ec2 安全组允许:http、ssh 和 https。

我正在尝试发送包含单个元素的多部分/表单数据请求:照片。尝试上传照片时,iPhone(请求的来源)挂起。照片大小约为 9.5 MB。

当我检查 nginx-access.logs 时:

"POST /myUrl/ HTTP/1.1" 400 5 "-""....

当我检查 nginx-error.logs 时:

[error] 5562#0: *1 readv() failed (104: Connection reset by peer) while reading upstream, client: my.ip.addr.iphone, server: default, request: "POST /myUrl/ HTTP/1.1", upstream: "http://127.0.0.1:8000/myUrl/", host: "ec2-my-server-ip-addr.the-location-2.compute.amazonaws.com"

[info] 5562#0: *1 client my.ip.addr.iphone closed keepalive connection

我真的不知道为什么会这样...我尝试更改 /etc/nginx/sites-available/default 超时设置...

server  ...

    client_max_body_size 20M;
    client_body_buffer_size 20M;


    location / 
       keepalive_timeout 300;
       proxy_read_timeout 300;
    

有什么想法吗?

【问题讨论】:

【参考方案1】:

编辑:再谈 IRC 之后,他的问题是 403 本身,而不是 nginx 错误。将我的 cmets 留在下面的 nginx 错误上,以防其他人有一天偶然发现它。

上周我遇到了这个问题,并花了很长时间试图弄清楚发生了什么。见这里:https://github.com/benoitc/gunicorn/issues/872

基本上,只要 django 看到标头,它就知道请求没有经过身份验证。它不等待大型请求主体完成上传;它立即响应,并且 gunicorn 立即关闭连接。 nginx不断发送数据,最终结果是gunicorn向nginx发送了一个RST包。一旦发生这种情况,nginx 将无法恢复,它不会从 gunicorn/django 发送实际响应,而是发送 502 Bad Gateway。

我最终放入了一个中间件,它可以访问 django 请求中的几个字段,以确保在 Django 发送响应之前下载整个请求体:

checker = re.compile(feed_url_regexp)

class AccessPostBodyMiddleware:

    def process_request(self, request):
        if checker.match(request.path.lstrip('/')) is not None:
            # just need to access the request info here
            # not sure which one of these actually does the trick.
            # This will download the entire request,
            # fixing this random issue between gunicorn and nginx
            _ = request.POST
            _ = request.REQUEST
            _ = request.body
        return None

但是,我无法控制客户端。既然你这样做了(以你的 iphone 应用程序的形式),也许你可以找到一种方法来处理 502 Bad Gateway。这将使您的应用不必两次发送整个请求。

【讨论】:

所以很遗憾我仍然遇到我在原始问题中描述的问题。 这个问题正是我的问题。我每天花了 1/2 的时间来追踪这个问题,而您的回答(阅读字段)为我指明了正确的方向。很棒的东西!这就是使 SO 成为如此重要资源的原因。 很高兴它有帮助!我也花了很长时间追踪它......你知道当你在生产服务器上运行 tcpdump 时这将是艰难的一天:)

以上是关于http 403 错误 +“readv() 在读取上游时失败(104:对等方重置连接)”的主要内容,如果未能解决你的问题,请参考以下文章