Arthas Web-Console远程连接使用
1.引言
1.1编写目的
该文档主要是解决远程使用arthas诊断的功能需求,而且看官方文档还不能正确理解整个部署环境和操作细节的朋友,我希望按照我自己的从零开始实现部署完毕整个环境的教程,能给各位一个清晰的实操手册.
GitHub上官方文档的连接: https://alibaba.github.io/arthas/web-console.html
本文不是介绍arthas怎么用,因为官方命令文档算很详细了,我也不过是用了官方文档的那些命令,没有用过很高深的,而且也很多不太会用,所以经验上没有能够拿出手的.
1.2项目背景
统一授权登录机器,对机器可以直接使用arthas诊断,无需登录到具体目标IP去启动arthas-boot.jar.
2. 准备环境
2.1统一的web-console服务端
下载arthas-tunnel-server-3.1.7.jar,我这里用的是3.1.7版本,请到官网直接下载即可: https://github.com/alibaba/arthas/releases
2.2在目标机器上上传arthas包
下载arthas-3.1.7-bin.zip,我这里用的是3.1.7版本, 请到官网直接下载即可: https://github.com/alibaba/arthas/releases
解压到你自己的目录下,我这里统一都是放 cd /tmp/arthas,里面包含如下图的jar包
3. web-console服务端使用说明
3.1部署web-console服务端
启动arthas-tunnel-server-3.1.7.jar
命令:java –jar arthas-tunnel-server-3.1.7.jar
打开地址:ip:port就能看到一个页面了
现在解释一下这个arthas-tunnel-server-3.1.7.jar包是干嘛的,这个包是arthas提供的一个web页面,纯Spring-Boot开发的,对java开发来讲很容易上手了.这个页面主要的作用是通过这个页面你可以连接到你要诊断的目标机器去使用arthas,咱们平时使用arthas是登录到要诊断的那台ip,启动arthas后,就在这台机器上执行arthas的命令…
这个web页面等于帮我们做了一个代理,直接在这台机器上去远程连接目标IP即可使用,但是还有一步,你还是必须到目标机器上启动arthas且注册到这个web服务器上,这边才能连接的上的,干!好像半点减少我工作量都没有,我都能上目标机器启动arthas了,我还在你这页面搞个鬼,是不是.稍等,后面我接着讲这个问题的解决方式.
3.2Web页面中的输入框和按钮
页面中有三个输入框:
IP:这个IP是arthas-tunnel-server这个页面server部署的IP,使用当中基本不会动.
Port:默认就是7777,这个端口指目标机器要通过arthas-tunnel-server代理去使用arthas,那就注册到我这且连接我开放的7777端口,我就是这么理解的.
AgentId:这个是目标机器启动arthas后会生成一串这个ID,你这里就填这个ID就好,这个ID其实就等于目标机器注册了一串唯一标识到server端了,通过串标识就能找到目标的IP并且操作目标IP的arthas.但这里有个坑的,官方文档中有图显示了这个ID,但你在做的时候并没有出现这串东西,你会很苦恼,稍等,我一会给你说明一下这个问题.
3.3Web启动日志请注意几个点
我在上面截图启动日志的时候有画了三个红色框,那几个点是要注意一下的
1:Using generated security password: d535ec80-31d9-4ec8-99a2-b3f129206b91,这一串是web后台登录的密码,相信看过官方文档的都会知道,但是登录上去也没能看到什么东西.
2:READ: [id: 0xb16388e6, L:/10.208.45.56:7777 - R:/10.208.46.53:38632],第一个IP和端口就是server端的连接信息了,第二个就是目标机器的注册信息了,53这个IP就是我用另外一台机器启动arthas且注册到56的server端的,这里有记录日志.
3: uri: /ws?method=agentRegister&id=10.208.46.53 这个就是目标IP注册了server端的正确信息.
3.4目标IP使用arthas注册到server端
首先如果要用server去连接目标IP使用arthas的话,服务端必须启动的,否则这个AgentId是出不来的,因为要注册成功后才会出现这个ID,也解释了上面那个问题,为什么我启动了目标机器的arthas,但是控制台就不打印AgentId呢.
第二是这两台机器,无论是server还是目标ip,都必须装了telnet,否则也是出不了AgentId的,应该双方是使用这个工具通讯的.
为了做这个实验,我使用了A机器: 10.208.45.56启动了server端,上面已经教大家启动了.B机器: 10.208.46.53启动了一个Tomcat,且已经上传了arthas的工具包上去了.
现在想要用B机器attach一下Tomcat进程,并且注册到A机器,让它出现AgentId
大家都知道启动arthas可以用SpringBoot方式也可以用as.sh脚本启动,但其实都一样,我个人用的是SpringBoot方式,重要的是后面有些参数是要给大家完整的说明白的,OK,Let’s Go.
命令: java -jar arthas-boot.jar --tunnel-server 'ws://10.208.45.56:7777/ws' --target-ip '10.208.46.53' 我没有在A机器启动server,所以这里没有AgentId出现.
第二次我把server端启动后,再来启动异常上个命令(先stop退出后),就多出现了一个id属性值.(注意退出arthas应该用stop命令,而不是shutdown命令,免得不小心执行了关机了你就玩完了,虽然arthas内支持两个命令退出,就防万一看花眼了)
这个id是随机的,如果不想随机,那就用 --agent-id 'xxx' 参数启动arthas,我比较倾向于用目标机器的IP做为这个代理的id,因为后面有大用,我认为.而且其实大家可以先jps –l命令把pid进程号拿到,直接attach这个进程号,就不用在启动arthas后在选择要attach的进程号,这做法在后面也是有大用的.
java -jar arthas-boot.jar --tunnel-server 'ws://10.208.45.56:7777/ws' --target-ip '10.208.46.53' --agent-id '10.208.46.53' 15092
还可以用session命令来显示AgentId,我第一次玩的时候没有注册上server端,用这个命令也是只有两行,没有AgentId的.还跑去官网提issues,都是因为没有正确注册到server端的问题.
3.5arthas启动参数解释
其中对我现在有用的是这些命令(注意命令两个杆杆是要的哦)
--target-ip <value>指arthas启动的这台ip
这里要说明一下,其实如果你不启动A机器的server端,你只启动B机器的arthas,你也有一个和server一模一样的web页面的,只是少了一个AgentId的输入框,我弄给大家看看
如果第一次使用arthas,你肯定不回用到server端,也不好去下载server端的jar部署,你甚至启动的时候都不会指定这个命令,然而你会发现arthas-client connect 10.208.46.53 3658这个会是arthas-client connect 127.0.0.1 3658 ,但如果是127.0.0.1,那么你必须在这台机器上打开浏览器,并且他只监听127.0.0.1这个ip,也就是说你必须用127.0.0.1:3658(注意端口是3658)去打开这个网址,你用真正的ip去打开是无法打开的,但咱们是无法在linux上安装浏览器的,公司也不会让你装,所以要加这个参数,写上实际的IP去启动.就在其他转了浏览器的代理机用浏览器打开这个地址了,你看我的截图.
第二点要注意web页面的那个IP,你第一次打开会变成localhost,你要改成实际的IP,在点Connet按钮,那个黑框框就是正常连接了,pid就是attach到的进程.
说白了,就是用web页面去操作arthas而已,和你在SecureCRT敲命令一个德行.
--tunnel-server <value>这个命令后面是指server端的ip和端口,就是要使用到server端才会接触到这个命令,默认写法就这个样ws://10.208.45.56:7777/ws,和最上面我截图的web-console一样.ip是server端的,port是server端的.
--agent-id <value>和tunnel-server命令配合使用,注册到server端了,这个就有用.
--attach-only官方解释是只attach,不启动 telnet去连接,比如只想启动 webconsole的端口,然后用户再用浏览器去连接.可以理解为后台启动arthas,启动完毕后啥都不干,等web端来连接,你用这个命令会发现执行完后就跳出arthas控制台了.上个图
但你会神奇的发现,web控制台可以使用arthas,但jps没有发现启动arthas-boot的进程号,这就很神奇了.
到了这里我相信大家动手玩过几遍的话,问题不是很大了
3.4总结一下这个使用
先启动tunnel-server,目标机器用tunnel-server命令注册到server端,如果出现id就是成功,这个id就是server端的AgentId,如果不成功也不会影响在目标机器上的使用.agent-id可以自己指定否则会随机生成但不好记,attach-only是后台启动arthas方式.重要的是id必须出现,否则没有tunnel-server啥事,咱们就没有什么交集,文章就没必要存在,基本都是围绕这个id来的.
再来解释一下为什么要有这个tunnel-server的控制台界面,之前我也说过,能在目标机器打开arthas了,我何必还跑过来这个页面使用呢,画蛇添足哇,对吧!
所以我们需要进一步改造它,先说明为什么要改造它并且得使用它:因为你的目标机器肯定不会让你去执行java –jar命令的,可能你的公司会完全屏蔽掉这些命令的权限执行,这没错吧,那你可能也无法在目标机器使用arthas,只能通过运维管理员去弄啊弄给你开这乱七八糟的的权限,等开完权限黄花菜都凉了.
那么就需要中间件架构组来做这个改造动作,可不可用一个集中式的我就打开一个运维管理页面,就能远程启动arthas并且使用它跟在目标机器一样的效果,那就必须要解决一个问题:一个命令能搞定登录到目标机器并且启动arthas且注册到server端,server端pia一下就connet出黑框框来,所以说现在那个tunnel-server就有用了,就能一站式的解决远程调试目标机器的功能需求了.
这个功能我打算另外起一篇文章来详细聊这个,也算给各位一些参考.
这篇文章对我的帮助挺大的,他是先驱者,向这位同学致敬:https://github.com/alibaba/arthas/issues/15