相信不少朋友公司对外服务的机器上面开放的端口都是有限的,例如只开放80,8080,443端口,这种环境下有时候我们需要调试服务的时候很麻烦,这里记录一下简单解决的一种办法,解决的途径很多,这里只是抛转引玉。
一、背景
对面服务的nodejs进程有内存泄露的情况,服务已经启动对外开发了一段时间了,这时候希望能够debug这个运行中的进程,生成一些heapdump来分析内存泄露的具体位置。针对运行中的nodejs程序,我们可以使用kill命令传递信号来开启nodejs程序的debug模式。
代码语言:javascript复制ps -ef //获取nodejs-pid
kill -s SIGUSR1 nodejs-pid // 开启nodejs调试进程
这个时候,通过netstat -tnpl命令,我们可以看到运行中的nodejs代码已经开启了debug模式了,默认监听了9229端口。下一步我们只要在chrome inspect面板上,配置这个ip:9229就可以debug了。
不幸的是,由于运维部门的安全策略,9229端口一般不对外开放。我们需要解决这个问题。
二、解决思路
最简单的办法,我们可以使用ssh来建立隧道,把远程remote的9229端口转发到本地的9229端口上,类似下面这样
代码语言:javascript复制ssh -L 9229:localhost:9229 user@remote.host
不过很多公司都不允许通过ssh命令在网络直接打洞,这样会打破网络隔离,有安全方面的风险。最好的办法就是把远程服务上9229端口的流量转发到本地开放的8080端口上。这里推荐使用socat来解决,下面以centos为例子,可以和这么操作
代码语言:javascript复制sudo yum install socat //安装socat
sudo socat TCP-LISTEN:8080,fork TCP:localhost:9229 //转发本地9229到本地8080
运行命令后,本地的9229端口就会被代理到本地的8080端口上。需要注意的是,使用socat进行端口转发时,需要保证本地和远程服务器之间的网络连接畅通,否则可能会出现连接失败的问题。同时,需要保证本地和远程服务器之间的防火墙设置正确,以允许端口转发的流量通过。