上周日吃着晚饭时,“叮叮”两声,老板在QQ上单独M我。
“服务器好像崩了”
“昨天和前天在线人数猛猛下滑 现在更是只有879人在线了”
看完消息,我震惊了,忙用筷子将碗中剩下的饭菜一股脑扒拉到嘴里,来到书桌前坐下,打开笔记本查看问题。
上周五,我确实提交了不少代码,也确实没有进行过多的测试。难道就这样出问题了?
查看阿里云监控
我打开阿里云的监控,cpu基本上维持在3%左右,太低了!不正常,至少也要20~30%。难道真的崩溃了?内存7%左右,属于正常,因为HTTP服务器和RPC服务器基本上用不到多少内存。
查看容器运行情况
打开阿里云Client,查看服务器容器运行情况,一切良好,所有微服务服务器都在运行中。看来服务器没有崩溃。
查看容器运行错误日志
我打开登陆服务器相关的日志,里面有不少没见过的错误。一般都是找不到用户。但是为什么呢?
服务器启动上一版本
一时之间没发现问题,家里虽然开着空调,我的肚皮上也都是汗水。先不管那么多吧,先把服务器启动为上个版本,先保证线上安全,再去找问题吧。于是jenkins简单操作一番,服务器还原上个版本。
这一下心里踏实多了,CPU的使用率应该会逐渐增加吧?
10分钟过去了,涨了一丢丢,没太大变化。20分钟过去了,反而降低了,之后一直没好转。
意外
“叮叮”,同事发来信息,告诉我。周六下午,大批用户无法上线。客户端在周五提交了一个版本,但当时没事。不知为何周六下午就出事了。而且同事自己可以登录,另一位同事上不去。
我使用远端控制,用单位自己的机器登录,也是上不去的,提示我获取Token失败。难道和客户端的提交有关?
我们客户端提交后,会更新服务器后台的MD5,MD5验证通过用户才能正常登录。难道和MD5有关系。
我打开钉钉,发现钉钉MD5报警达到了2万多次。初步怀疑是版本问题。
这时,瞌睡虫起了作用,我的脑袋开始昏懵。继续下去,会影响第二天工作,也不利于解决问题。于是跟老板回复,初步判断是这个问题,明天再和客户端同事对对,共同查看问题。
nginx
第二天,来到单位,和同事不多寒暄,直接进入正题。同事反馈,有时能登陆,有时登陆不了。
我继续查看日志,和前一天在家显示的日志相同。我根据日志信息,查看相关逻辑没发现问题。但一些登陆的用户名称,在数据库中查不到。查不到就说明用户根本没进来。
因为什么呢?难道是nginx的代理问题?我们的nginx会监听某个域名的80端口,然后将请求转发给阿里云服务器上的微服务。
于是找到nginx日志目录,打算查看登入和错误日志。我用vim直接打开日志,卡、无响应,根本打不开。
我一看日志容量,有四十多G,vim可不是打不开嘛!在此之前,我还真不知道vim打开大文件会无响应,又让我学会一招。我强行终止了vim的进程,使用网上学来的打开大文件的方法。不过可惜的是,没发现有什么大问题。
postman
于是我用postman访问登陆API,报错:Error: getaddrinfo ENOTFOUND 【我们公司域名】。
使用AI工具查询问题,给出我如下结论:
错误信息 “Error: getaddrinfo ENOTFOUND 【我们公司域名】” 表示在尝试解析域名 “【我们公司域名】” 时发生了错误。这个错误通常发生在以下几种情况:
- 域名不存在:域名 “【我们公司域名】” 可能不存在于 DNS(域名系统)中,或者没有正确注册。
- 网络连接问题:可能是因为你的服务器无法连接到 DNS 服务器,或者 DNS 服务器无法访问。
- 本地 DNS 缓存问题:本地 DNS 缓存可能过时或者出现故障。
- DNS 配置问题:服务器的 DNS 配置可能不正确,或者指向了一个无法访问的 DNS 服务器。
解决这个问题的步骤如下:
- 检查域名:确保域名 “【我们公司域名】” 是正确的,并且已经正确注册并指向了一个有效的 IP 地址。
- 检查网络连接:确保你的服务器可以访问互联网,并且没有防火墙或其他安全策略阻止了 DNS 查询。
- 刷新 DNS 缓存:你可以尝试清除本地 DNS 缓存。在 Linux 系统上,你可以使用以下命令:
sudo systemd-resolve --flush-caches
或者:sudo nscd restart
- 检查 DNS 配置:检查服务器的
/etc/resolv.conf
文件,确保配置了正确的 DNS 服务器地址。 - 使用其他 DNS 服务器:如果可能,尝试将 DNS 服务器更改为一个公用的 DNS,如 Google 的
8.8.8.8
和8.8.4.4
,或者 Cloudflare 的1.1.1.1
。 - 诊断工具:使用诸如
nslookup
或dig
这样的工具来诊断 DNS 解析问题。nslookup 【我们公司域名】
或者:dig 【我们公司域名】
因为我对于nginx不是很熟,判断不是nginx的问题,因此我直接使用第6号步骤。发现nslookup根本找不到【我们公司域名】。
好吧,我相信看到这里,很多人都知道发生了什么。但我不知道,我还缺少运维相关的一些知识。
破案
于是,我只能询问一位运维朋友,他让我用curl访问,我访问回复错误消息:“未能解析此远程名称”。
而运维朋友在他那边,同样适用curl访问,确能得到数据。我当时又是惊奇又是惊喜。
难道是我的命令输入有误?当然不是!
他明确告诉我说,是域名解析出了问题。在网上搜索这个域名,在8月2日已经过期了,因此访问不了。
哦!原来是这样!但为啥3号才大批量上不去呢?朋友告诉我,因为DNS有缓存。DNS会把解析结果缓存到客户端,这样客户端就可以访问,而不需要向服务器请求。但DNS缓存会有一个失效时间,过了时间,就会向服务器请求,服务器的域名过期,那就访问不到了。
我找到域名管理负责人,让他对域名进行续费,问题迎刃而解。
成长
在这次事故中,我学到了几点知识,和大家分享,希望遇到和我相同的问题,大家可以从容不迫解决,少走一些弯路。
一、vim打开大文件
vim不要直接打开上几十G的大文件,因为它会将文件内容暂存在内存中,很快内存就会耗光,服务器会无响应。这时,应该使用以下几种方法(>temp.log相当于导出为另一文件,没有这个会直接显示):
1.查看文件的前100行
head -100 /data/nginx/log/error.log > temp.log
2.查看文件的后200行
tail -200 /data/nginx/log/error.log > temp.log
3.查看文件100行至300行
sed -n '100,300p' /data/nginx/log/error.log > temp.log
4.查看符合条件的文件内容
cat /data/nginx/log/error.log | grep 'notice' > test.log
5.实时查看文件内容
tail -f /data/nginx/log/error.log
二、域名(DNS)前缀
购买的域名可以设置多个前缀,比如我的网站域名为skycreator.top,那么我就可以设置www.skycreator.top,也可以增加code.skycreator.top,当用户在浏览器输入www.skycreator.top或者code.skycreator.top都可以查看我的网站。
三、域名(DNS)解析
我们平时浏览器访问的各个网站,实际上都是对应一个ip地址(如125.38.24.139)。但ip地址我们的大脑很难记忆,因此才有了域名这一概念。
www.baidu.com就是一个域名,skycreator.top也是一个域名。但凡域名都是需要花钱购买的,当然也有少部分不花钱的域名。域名会与一个ip地址相联系,比如我这里访问百度网址的ip地址就是110.242.68.4。
当输入www.baidu.com时,服务器会自动将你的请求链接到110.242.68.4。如果baidu.com域名过期了,输入www.baidu.com大概率是访问不到的。能访问到是因为域名缓存。
域名缓存,是为了避免用户频繁访问服务器而暂存到用户终端上的信息。一般域名缓存都有过期时间,时间到了,会自动在服务器上获取域名相关信息。这个过期时间在购买域名平台的后台管理里可以设置。
以上就是这篇文章的全部内容,谢谢大家阅读。