nginx upstream keepalive 和 proxy_http_version之间的联系和区别

无意之间 突发奇想,设置如下nginx conf

upstream upserver {
    server 127.0.0.1:12349;
    ### keepalive 100;
}

server {
listen 12347;
location /hello {
    proxy_pass http://upserver;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
  }
}


即upstream关闭 keepalive,但是server里明确指定 HTTP 1.1协议

通过tcpdump抓包可以看到nginx端使用HTTP 1.1协议请求upstream server,请求完毕之后发送FIN包关闭连接了!!! 

这是什么原因呢? 百思不得其解,网络也没有这个问题的明确解答,源码里也找不到相应的代码逻辑之处


邀请回答
提问于 2020-09-10 11:24
362 次浏览
共2个回答

发表评论
  • 陶辉
    2020-09-10 11:41

    proxy_http_version为1.1,同时Connection: keep-alive,这只是说:HTTP协议是支持长连接的。但客户端要不要使用长连接呢?如果使用长连接,就得有连接池,那么连接池应该是多少呢?毕竟一旦有连接池,就可能存在资源浪费,在用户没有明确的配置keepalive连接池时,Nginx还是不会使用长连接。

    1
    回复
    举报
    • nginx萌新 2020-09-10 11:47
      这个行为逻辑不符合HTTP 1.1协议规范吧?
      0
      回复
      举报
    • 陶辉 2020-09-10 13:38
      @662:HTTP规范对语法语义是硬性规定的,但长连接不包括在内,双方都可以在自己认为资源不足时去关连接。
      0
      回复
      举报
  • nginx萌新
    2020-09-11 11:26

    翻了好久的nginx源码,大概清晰了。

    ngx_http_upstream.c文件 ngx_http_upstream_finalize_request函数
        if (u->peer.connection) { // 如果upstream peer connection不为null,则会关闭连接
            ngx_close_connection(u->peer.connection);
    }

    ngx_http_upstream_keepalive_module.c文件 ngx_http_upstream_free_keepalive_peer函数

    ngx_queue_insert_head(&kp->conf->cache, q); // 将free数组里的连接 放回到cached数组里

    pc->connection = NULL; // 如果配置了keepalive属性,此时会将connections设置为null,避免被 ngx_http_upstream_finalize_request() 关闭连接

    ngx_http_upstream_round_robin.c文件 ngx_http_upstream_free_round_robin_peer函数
    没有对connection做任何设置,connection不为null

    0
    回复
    举报
提问者

nginx萌新

暂无个人介绍

  • 0

    文章

  • 0

    粉丝

  • 0

    被赞

nginx萌新
按Enter键发送
您已邀请位用户
版权所有©F5 Networks,Inc.保留所有权利。京ICP备16013763号-5