tomcat出现过多close_wait的事故现场及一次错误chmod 引发的灾难

背景

前段日子,校内网站正式上线部署,本地已通过测试,然而过了一个晚上不到,网站就崩掉了,因为我们写的是一个实名注册模块,用的是tomcat服务器,以前是没有这方面的问题的,所以,问题的根源是出现了这个模块上了。

BUG重现

  • 网站可以正常ping通,但是网页加载速度过于缓慢,以至于无法正常进行浏览,赶紧ssh上去看下服务器是什么情况

  • netstat -anptl | grep 8080 得到大量的close_wait
    如下图

这里写图片描述

很明显,这是客户端已经断开连接,但服务器还在发送消息,讲道理服务器也应该要断开连接才对的,根据TCP的三次握手和四次挥手 ,这是一种不正常的现象。

这里写图片描述

这里写图片描述

这个BUG很显然就是服务器端代码未能及时的释放资源所造成的,

或者可以通过以下途径修改Linux配置文件

vim /etc/sysctl.conf

编辑文件,加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

修改之后,再用netstat -anptl | grep 8080 查看果然连接数变少了,但问题的根源还没有得到解决,问题还是出在了服务器的代码上,通过定位,发现原来是数据库连接这里未能够及时的关闭连接,于是修改逻辑代码,问题解决!

————————————————————————————

因为ssh失效,故而重装ssh后,错误赋予权限给chmod 777 /etc/* 导致重启机器后无法正常登陆。。

一开始想到的就是更改root密码

(1)重新启动Centos,在启动过程中,长按“ESC”键,进入GNU GRUB界面。

(GNU GRUB是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望允许的操作系统,GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数)

(2)选择要进入的系统,按“E”键(在启动之前编辑命令)。

(3)选择第二项操作系统的内核“kernel”,按”E”键(在引导顺序编辑选定的命令)。

(4)在 “rhgb quiet”后面间隔,输入“1”或者“single”,按Enter键保存。(向内核传递启动参数,进入单用户模式)

此时又回到GRUB界面.

(5)这时,按“B”键启动系统。

(6)输入命令行“passwd root”重新修改root的密码,按“Enter”键。

(7)输入新的密码,按enter保存后,再重新输入确认密码。

(8)如果出现“all authentication tokens updated successfully”的提示,就说明密码修改成功了。

(9)输入“shutdown -r now”命令行,重新启动系统,就可以使用root账号登陆了。

但是 ,并没有效果!!!
后来又发现!!!

可以SSH远程登陆,但是直接接键盘,显示器就不可以。
在登陆界面输入正确的账号密码会重新返回登陆界面且没有任何提示,
输入错误的账号密码会提示账号密码错误。

解决方法方法:
重启电脑进入单用户模式

 
 
  1. [root@chenghy ~]# vi /etc/pam.d/login

  2. #将如下行:

  3. session required /lib/security/pam_limits.so

  4. #修改成:

  5. session required /lib64/security/pam_limits.so



重启,还是无法登陆!!,泪崩。

仔细回忆了自己的谜一般的操作,查看history,发现了 chmod 777 /etc/命令,恍然大悟!
linux目录权限,这个错误操作,引起致命错误
chmod 777 -R /

查看系统日志 /var/log/secure 的内容,如果发现有以下内容:
Oct 9 10:31:46 localhost login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Oct 9 10:31:46 localhost login: ROOT LOGIN ON tty1
Oct 9 10:33:46 localhost login: pam_unix(login:session): session closed for user root
Oct 9 10:33:48 localhost login: pam_securetty(login:auth): /etc/securetty is either world writable or not a normal file
Oct 9 10:33:52 localhost login: FAILED LOGIN 1 FROM (null) FOR root, Authentication failure
说明该文件属性已被错误修改,从而导致root无法正常登陆,因此需要修改该文件的属性,以保证只有root用户对该文件拥有一切权限,而对其他用户只有读的权限:

chmod 744 /etc/securetty

这样修改之后,就可以用正确的root密码登陆系统并进行各种管理。

小结
Linux玩不会,真的很坑爹,还是多多的练习练习才能避免踩坑A

猜你喜欢

转载自blog.csdn.net/mikeoperfect/article/details/80033581