nginx
日志分析
# 排查后端服务都挂的情况
tail -n 2000 error.log| grep 'no live upstreams while connecting to upstream' | wc -l
# 响应时间排序
tail -n 30000 access.log | awk '{print $5}' | sort -r | head服务管理
# 刷新日志文件
kill -USR1 $(cat /opt/nginx/logs/nginx.pid)常见问题
tcp连接队列满
操作系统有一个 accept 队列, 满了之后新的完成三次握手的连接无法进入队列,客户端会收到超时或 RST
os系统级别的配置一般是 net.core.somaxconn = 128 或 4096
流量高峰期可能不足, 一般表现情况为 502
# 相关日志
upstream timed out (110: Connection timed out) while connecting to upstream
upstream prematurely closed connection while reading response header
# 定位办法 - 看第一个队列的值
ss -tnlp | grep 80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
cat /proc/sys/net/core/somaxconn
4096
# 解决办法
sysctl -w net.core.somaxconn=65535
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf长连接配置
长连接能解决很多问题, 比如 TIME_WAIT 过多。
必要条件
- upstream 中有配置 keepalive
- 需要后台服务真实支持 http1.1 协议;
- 到上游的请求和响应的 http1.1 报文头上有显式的 Connection: keepalive 或者为空, 至少不能是 Connection: close
upstream server_backend {
server 10.0.0.1:9000;
keepalive 60;
}
location / {
proxy_pass http://server_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}超时控制
keepalive_timeout = 75; # 长连接中连续两个请求之间空闲的最大时间
client_header_timeout 50;
client_body_timeout 60;
send_timeout 60;
ssl_handshake_timeout 60s;
ssl_session_timeout 5m;
proxy_connect_timeout 60; # tcp 三次握手的时间
proxy_timeout 120s;
proxy_read_timeout 60; # 接收包的时间, 必须在这个时间内给一个响应, 指的是两次相临读的间隔时间;
proxy_send_timeout 60; # 发送包的时间最后更新于