nginx

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 过多。

必要条件

  1. upstream 中有配置 keepalive
  2. 需要后台服务真实支持 http1.1 协议;
  3. 到上游的请求和响应的 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;      # 发送包的时间
最后更新于