Nginx 学习笔记 (a1) —— proxy_set_header 默认值
proxy_set_header 默认重定义两个 Header 头字段:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Host 初始值 $proxy_host,这是因为 HTTP/1.1 必须包含 Host 字段以指定主机。$proxy_host 是 backend 即后端的主机名,$host 是 frontend 即自身的主机名。要不要改成 $host 或 $http_host,视后端会不会校验域名和端口而定。举个例子,proxy_pass 的目标是一组 upstream 时,$proxy_host 是这组 upstream 的名字,如果后端只接收 Host 是 www.example.com 的请求,那么后端不会响应,变通办法正是改写 Host 字段的值。
Connection 初始值 close,是因为在 HTTP/1.1 中所有连接都是长连接,而后端的 Web 应用程序(HTTP/1.0 或更古早的)未必支持连接复用,所以统统设成 close 以免出错。跟后端通讯真需要用到 keep-alive,先配置一组 upstream,回头再清空 Connection 字段即可。
upstream backend {
server www.example.com;
keepalive 16;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
# proxy_set_header Host www.example.com;
}
}
并没有 proxy_http_version 2.0,甚至于 nginx → upstream 也是默认 HTTP/1.0。HTTP/2 多路复用可减少客户端到 frontend 的连接数,不过在 frontend 到服务端的情境中,连接数并非瓶颈,共用一个连接反而更限制并发能力。
<small>原载 App-scope,有删改。</small>