nginx的so_keepalive和timeout相关小计
KeepAlive
这里的keepalive是TCP的探活机制:
[root@ ~]# sysctl -a |grep tcp_keepalive
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
参数解释:
- tcp_keepalive_time 1200 ,tcp建立链接后1200 秒如果无数据传输,则会发出探活数据包
- tcp_keepalive_probes 9 , 共发送9次
- tcp_keepalive_intvl 75 ,每次间隔75秒
KeepAlive并不是默认开启的,在Linux系统上没有一个全局的选项去开启TCP的KeepAlive。需要开启KeepAlive的应用必须在TCP的socket中单独开启。
TCP socket也有三个选项和内核对应,通过setsockopt系统调用针对单独的socket进行设置:
- TCPKEEPCNT: 覆盖 tcpkeepaliveprobes
- TCPKEEPIDLE: 覆盖 tcpkeepalivetime
- TCPKEEPINTVL: 覆盖 tcpkeepalive_intvl
Nginx
server {
listen 127.0.0.1:3306 so_keepalive=on;
proxy_pass 172.17.0.3:3306;
#建立连接时间
proxy_connect_timeout 5s;
#保持连接时间
proxy_timeout 3600s;
error_log /data/logs/my.log info;
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
- on: 开启,探测参数更加系统默认值
- off: 关闭
- keepidle: 等待时间
- keepintvl: 发送探测报文间隔
- keepcent: 探测报文发送次数
proxy_timeout:建连后无数据时与后端服务器连接保持时间,默认75s。
proxy_connect_timeout:与后端服务器建立连接的超时, 不超过75s。
proxy_send_timeout:向后端服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_read_timeout:向后端服务器组发出read请求后,等待响应的超时间,默认为60秒。