一、短连接 与 长连接
• 短连接
当客户端通过浏览器访问 HTTP 服务器时,HTTP 请求会通过 TCP 协议与 HTTP 服务器建立一条访问通道,当本次访问数据传输完毕后,该 TCP 连接会立即被断开,由于这个连接存在的时间很短,所以 HTTP 连接
也被称为短连接。默认配置下,HTTP 协议的负载均衡与上游服务器组中被代理的连接都是 HTTP/1.0 版本的短连接。
• 长连接
在 HTTP/1.1 版本中默认开启 Connection:keep-alive,实现了 HTTP 协议的长连接,可以在一个 TCP 连接中传输多个 HTTP 请求和响应,减少了建立和关闭 TCP 连接的消耗和延迟,提高了传输效率。网络应用中,
每个网络请求都会打开一个 TCP 连接,基于上层的软件会根据需要决定这个连接的保持或关闭。例如,FTP 协议的底层也是TCP,是长连接。
查看长连接
1、列出建立连接的 IP
# netstat -anp | grep nginx
tcp 0 0 172.16.3.40:81 172.16.2.84:56049 ESTABLISHED 1709/nginx: worker
# netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1
2、查看该ip是否为长连接
# tcpdump -i ens33 -A host 172.16.3.40 -n | grep HTTP
二、client到nginx的长连接
默认情况下,nginx已经开启了对client的keepalive支持,但一些场景下,仍然需要我们手动调整参数重写一下:
http {
keepalive_timeout 300; # 客户端连接nginx服务器超时值,默认75s
keepalive_request 2000; # 每条长连接最大复用请求数为2000
}
三、nginx到server的长连接
http {
upstream BACKEND{
server 192.168.0.1:8080 weight=1 max_false=2 fail_timeout=30s;
server 192.168.0.2:8080 weight=1 max_false=2 fail_timeout=30s;
keepalive 300; # 连接池里面最大的空闲连接数量
}
server{
listen 8080 default_server;
server_name:"";
location / {
proxy_pass http://BACKEND
proxy_set_header Host $Host;
proxy_set_header x-forwarded-for $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
add_header Cache-Control no-store;
add_header Pragma no-cache;
proxy_http_version 1.1; # 启用HTTP/1.1版本与被代理服务器建立连接,1.0版本不支持长连接,很重要!
proxy_set_header Connection ""; # 设置http头默认为长连接,不关闭
}
}
}
四、对于 FastCGI 协议服务器,需要设置 fastcgi_keep_conn 指令启用长连接支持。
upstream fastcgi_backend {
server 192.168.2.154:9000;
server 192.168.2.109:9000;
keepalive 8; # 长连接缓存池大小为8
}
server {
...
location /fastcgi/ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on; # 启用长连接支持
...
}
}