来自我的公众号 『 YongHao 写东西的 Cache 』 打个小广告,还是希望写的东西有人看🙊
分享一下见解,权当抛砖引玉
在 nginx 中,proxy_pass
是我们做内部转发时很常见的命令,同时少不了用proxy_set_header
设置转发时的头部。细看文档,你会发现 nginx 会默认为你转发时设置两个头部:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
你能想到为什么这两个头部 nginx 为什么要做默认设置吗?
$proxy_host
查查文档很容易理解,就是转发的目标服务器。$proxy_host
name and port of a proxied server as specified in the proxy_pass directive;
设置 Host
头也很容易理解——如果你想了一会很想不到,那你真的该好好看看 http 协议的基础知识了。
想完了吗?答案就是:通常服务器都会设置并根据虚拟域名来过滤请求,如 nginx 中的server_name
,目的就是一台服务器,可以同时服务作用于多个域名的请求。
Connection 头( header ) 决定当前的事务完成后,是否会关闭网络连接。
如果该值是 “ keep-alive ”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
如果该值是 “ close ”,表明客户端或服务器在完结请求后想要关闭该网络连接,这是 HTTP/1.0 请求的默认值
而 HTTP 的 RFC 定义了:
HTTP/1.1 applications that do not support persistent connections MUST include the "close" connection option in every message.
HTTP 1.1 中,如果不支持持久链接的话,每条信息必须包含 close。因为 nginx 不知道你 proxy pass 过去的应用支持长连接不啊,所以只能给你先设个 close。e
而在 proxy_pass
支持长连接,更是家常便饭了。
nginx 使用upstream
做负载均衡时,为了提高性能,需要用 keep-alive 来建造连接池,复用已经创建的连接。
我记得以前看到 nginx 官方文档中,是提供了做法的:
For HTTP, the proxy_http_version directive should be set to “1.1
” and the “ Connection ” header field should be cleared:
upstream http_backend { server 127.0.0.1:8080; keepalive 16; } server { ... location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; ... } }
Alternatively, HTTP/1.0 persistent connections can be used by passing the “ Connection: Keep-Alive ” header field to an upstream server, though this method is not recommended.
又到我们的思考时间了,为什么proxy_http_version
要设为 1.1 呢?为什么这次Connection
头部设置为空字符串呢?
第一个问题很容易解答,只要想一想 http 1.1
与1.0
的区别即可: http 1.1 开始,支持 keep-alive 长连接。
第二个问题,其实设置为空字符串,只是为了避免别人传了 Connection
为 close 的请求过来,然后我们 转发到 upstream
时 把此头部带过去,导致了全部 upstream
中的长连接都被关掉——也就是keepalive
设置来一点用都没有了。
也可以设置为“ Connection: Keep-Alive ”
,但官方说不推荐,至于为什么,我还没有想明白。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.