首页
首页
文章目录
  1. 简介
  2. 问题排查
  3. 解决方法
    1. nginx缓存静态文件
    2. 横向扩容机器
    3. 修改TIME_WAIT的回收时间
  4. 结束

nginx缓存静态文件与反向代理服务,减少后端服务的TIME_WAIT

简介

今天公司的一个服务宕机掉了,影响到了整个服务市的预约挂号功能,电话直接被打爆,才发现服务后端的微信公共账户服务与小程序服务在一起,并且只有一台Windows机器, 我都不知道这样怎么跑到现在的,而且还用来支撑全市的预约挂号功能。

问题排查

我们的整个流程是 nginx <——> win的公共账户与小程序服务 <——> 后端其它服务

检查win机器的连接数、CPU、内存等

1
netstat -ano | find /i /c "TIME_WAIT"

发现有58000多个…… T.T!
CPU、内存、硬盘均正常

解决方法

1、缓存静态文件、检查后端请求连接
2、横向扩容机器。
3、修改TIME_WAIT的回收时间

nginx缓存静态文件

因为微信公共账户服务不是前后端分离的,所以我们使用nginx对后端服务的公共账户服务的静态文件进行缓存,缓存方法如下
在nginx.conf中的http{}模块里面添加以下代码,并在server{}中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
http {
include mime.types;
default_type application/octet-stream;
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间。一般设置1和2
gzip_comp_level 2;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
# 设置缓存路径并且使用一块最大100M的共享内存,用于硬盘上的文件索引,包括文件名和请求次数,每个文件在1天内若不活跃(无请求)则从硬盘上淘汰,硬盘缓存最大10G,满了则根据LRU算法自动清除缓存。
proxy_cache_path /home/wxcache/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=1g;
...略...
server{
location ~* ^.+\.(css|js|ico|gif|jpg|jpeg|png)$ {
log_not_found off;
# 关闭日志
access_log off;
# 缓存时间1天
expires 1d;
# 源服务器
proxy_pass http://healthweb;
# 指定上面设置的缓存区域
proxy_cache imgcache;
# 缓存过期管理
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 10m;
proxy_cache_valid any 1h;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
}
...略...
}
...略...
}

横向扩容机器

修改TIME_WAIT的回收时间

Windows修改
在注册表

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

中添加名为TcpTimedWaitDelay的DWORD键,设置为十进制60,以缩短TIME_WAIT的等待时间,默认为4分钟这里修改到60
Linux修改
参考之前的文章即可
关于服务器出现的TIME_WAIT和CLOSE_WAIT的原因以及解决方法

结束

配置完成后,使用ab进行压力测试,暂时没发现任何异常
ab 用法

1
ab -c 100 -n 10000 -C "cookies" "URL"

以上
End!

支持一下
扫一扫,我会更有动力更新
  • 微信扫一扫
  • 支付宝扫一扫