一、通用排查基础
1、服务名称与id,服务列表页面
2、容器id,容器管理页面
3、容器端口,主进程端口一般为port.mainprot或port.slbhttps的值
该例子中5000访问失败,所以健康检查标红了。
4、通用排查方法
1)webssh登录进容器,查看/acs/log下的应用日志。如果webssh登录不了,容器健康状态又为“运行中”,登录到ECS,执行docker exec -it 容器id /bin/bash
2)如果/acs/log下没有日志。登录ECS主机,执行docker logs 容器id,看容器启动的日志
例如,部署时提示 dial tcp 127.0.0.1:XXXX: getsockopt: connection refused,说明端口没有成功启动,按照上面两个步骤排查即可
二、Java应用常见问题
1、域名访问4XX
应用自身代码问题,需要自己排查。如400请求参数不合法、404找不到资源
2、域名访问5XX
1)容器管理中看健康状态
已停止: Docker容器可能没有起来。重新启动收集错误信息。(可以在EWS页面收集错误信息,也可以在宿主机执行docker logs 容器id 查看容器启动日志)
运行中: Docker容器已经起来,可以试着用WEBSSH登上去
2)WEBSSH登录,运行ps -elf | grep java
确认Java进程是否已经起来,出现如下代表java进程已经起来
-bash-4.2# ps -elf | grep java
0 S root 72 1 5 80 0 - 363512 futex_ 15:25 ? 00:00:21 /acs/user/jdk/jre//bin/java -Djava.util.logging.config.file=/acs/user/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -
Xms256M -Xmx256M -Xmn128M -Xss256K -XX:PermSize=64M -XX:MaxPermSize=64M -XX:SurvivorRatio=10 -Duser.timezone=Asia/Shanghai -Djava.endorsed.dirs=/acs/user/tomcat/endorsed -classpath /acs/user/tomcat/bin/bootstrap.jar:/acs/user/tomcat/bin/tomcat
-juli.jar -Dcatalina.base=/acs/user/tomcat -Dcatalina.home=/acs/user/tomcat -Djava.io.tmpdir=/acs/user/tomcat/temp org.apache.catalina.startup.Bootstrap start
3)看/acs/log下面的日志,如catalina.log,localhost.log等
常见的有java.lang.OutOfMemoryError这些,一般是开发者配置管理中堆大小,持久大小等设置不合适。
或者开发者代码的异常,如版本冲突,依赖冲突,数据库连接异常等。
4)宿主机ECS上,执行docker logs 容器id,可以看到该容器启动的过程日志,也可以帮助定位问题
5)Java应用推荐内存为2G及以上,可以尝试升级容器规格以及修改服务-配置管理中jvm的启动参数
6)检查部署的代码包,war包或jar是否正常
6.1)如果上传部署,看代码包是否能正常解压
6.2)检查解压代码包后的目录结构
3、SpringBoot上传部署/编译部署之后,健康检查失败,502
1)参照问题2中的排查方法
2)代码包目录结构结构问题,
正常的war包结构为META-INF,WEB-INF,org
正常的jar包结构为META-INF,BOOT-INF,org
参考:https://blog.csdn.net/chuan_zhang_ak/article/details/89511879
4、服务总是运行一段时间就没了,域名访问502或健康检查失败
一般来讲,这种情况都是因为java进程OOM被系统kill了,推荐java应用分配2G以上内存。
dmesg |grep java或egrep -i -r 'killed process' /var/log 等指令可以帮助找到相关日志。如下面的/var/log/messages中
解决方法:
1)升级容器规格,在服务列表-容器管理-规格升级
2)规格升级了,还要确认一下相应的jvm启动参数是否被调大。服务列表-配置管理
之后重置并重启容器。
5、Java服务启动很慢?
一般来说spring framework或springboot的应用启动,其他tomcat等应用依赖比较多的话启动会慢。
还有一个是SecureRandom的问题,如下所示,
解决方法,在启动参数里加上,服务-配置配置管理
Tomcat7的官方镜像,加上jvm.append这个环境变量,值为-Djava.security.egd=file:/dev/./urandom
Tomcat8的官方镜像,直接再catalina.sh中加入-Djava.security.egd=file:/dev/./urandom
参考:https://wiki.apache.org/tomcat/HowTo/FasterStartUp
https://jingyan.baidu.com/article/4f34706e126f51e386b56d5f.html
6、升级容器规格没有效,java内存不足?
调整java应用规格:
1)升级容器规格,建议2G及以上
2)服务-配置管理,修改-Xms -Xmn等jvm启动参数
7、activemq镜像,无法监听消息?
openwire默认端口 61616,amqp默认端口 8161,可以在EWS服务-配置管理中修改相关配置。
EWS域名访问的是amqp端口,管理后台;
消息监听直接使用主机IP+容器端口(如61616)的形式。
无法监听请按照上面所述JAVA应用问题排查
8、需要修改容器中tomcat的配置文件,但是重启后会重置
1)tomcat8官方镜像支持server.xml和catalina.sh的配置,可以在服务-配置管理中修改。建议使用该镜像
2)webssh到容器中去修改tomcat配置,tomcat目录在/acs/user/tomcat,然后重启java进程。容器启动脚本为/acs/bin/start
参考文档:https://open.taobao.com/doc.htm?docId=117793&docType=1
3)使用自定义镜像
三、PHP应用常见问题
1、服务访问502 504
出现502,504错误的原因非常多,有可能是开发者的代码逻辑问题,也有可能是服务本身出现问题,排查方式步骤如下:
1)首先确认代码本身不存在问题
2)通过控制台webssh或者ssh客户端登录容器打开/acs/env/tengine/nginx.conf 文件,读取server 配置段的listsen 端口配置比如为5000(也可以在容器管理查看到容器对应的nginx端口,下图例子中也为5000)
3)在webssh(ssh客户端)执行curl 命令看是否返回ok。比如访问服务的页面的url是http(s)://xxx.xxx.com/aaa//xxx,在容器只执行"curl http://localhost:5000/aaa//xxx"
如果curl 命令返回结果正确,请联系工作台以及路由中心配置的小二进行排查。
4)如果上述curl命令返回也是和浏览器等客户端同样错误,请查看/acs/log/php.log以及/acs/log/php_fpm.log
5)查看nginx进程以及相应的端口(如此例中的5000)有没有启动,ps -elf | grep nginx,netstat -ntlp
6)ECS主机上执行docker logs 容器id,查看容器的启动日志,分析失败原因
7)确认主机上是否运行着"多余容器"。参考:
2、PHP服务不支持跨页面session传递?
如果使用的是EWS官方镜像,可以登录到容器中,看下/acs/user/script/tpl/php.ini文件,session.auto_start 是否为 0,
如果为0,则改为1,然后重启该容器
3、PHP脚本运行时间最大时间怎么调整?
对于使用官方镜像的,登录容器中,/acs/user/script/tpl/php-fpm.conf文件,修改 request_terminate_timeout的值,然后重启该重启。
注,如果使用了EWS接入层域名,接入层现在最长响应时间为60s,所以request_terminate_timeout不能大于60。
4、PHP官方镜像怎么添加扩展库?
EWS服务-配置管理,PHP_EXTENTSIONS字段,可选扩展如下:mqp, exif,imagick, memcache,memcached,mongo,redis,stomp,zookeeper。
其他扩展暂时不支持,如有需求,请使用自定义镜像:https://open.taobao.com/doc.htm?docId=104181&docType=1
四、NodeJS常见问题
1、启动服务后,统一接入层域名访问502,但是主机ip+端口的形式可以访问
1)检查容器端口,容器管理,查看容器的端口。看代码中server是否在该端口监听
2)检查代码,nodejs的server是否是https的,如果是,需要改成http的。统一接入层自身支持https,可以通过https://xxx.ewszjk.m.jaeapp.com进行访问
五、Nginx应用常见问题
1、修改nginx的配置,如access_log?两种方法
1)EWS服务-配置管理-nginx.conf.file,重置
2)登录到容器中,修改/acs/user/script/tpl/nginx.conf,然后重启容器
2、Nginx容器中获取客户端IP?X-Forwarded-For获取的不对?
原因:Nginx服务使用了EWS统一接入层(外网域名),EWS统一接入层底层基于Tengine,做了一层代理,再到用户的Nginx代理。所以X-Forwarded-For获取的的是统一接入层代理的IP
解决方案:使用proxy_add_x_forwarded_for,往上获取一层
参考:https://blog.csdn.net/qq_28796345/article/details/88685245
3、Nginx是否支持上传部署?
不支持
4、EWS上的应用,怎么去做loadbalance?怎么去集成nginx?
可以使用EWS的统一接入层,接入层集群就是基于nginx做负载均衡的
5、Nginx缓存的怎么配置?
服务-配置管理-nginx.conf.file,自行配置
六、dotnet常见问题
1、官方镜像dotnet:2.1.4 指的是支持 .NET Core 2.0 下的 SDK 2.1.4 还是说得是 .NET Core 2.1 下的Runtime 2.1.4?
1)登录ECS主机,执行docker logs 容器id,查看容器日志,若无日志报错,步骤2)
2)登录ECS主机,执行docker exec -it 容器id /bin/bash进入容器环境(页面webssh也可以)
3)/acs/code目录(服务的代码在这里),运行dotnet xx.dll,观察报错
4)如果报错相关的core Runtime not found。则需要在容器中自行安装相应版本的runtime。之后运行dotnet xx.dll