记一次诡异的故障排查经历

简介: 每一次故障排查都是一笔财富,各种狗血经过不表,解决问题之后的那种满足是不可替代的。背景发布系统架构图简化如下:管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docker仓库,容器集群更新镜像,用户通过负载均衡访问我们的容器集群。

每一次故障排查都是一笔财富,各种狗血经过不表,解决问题之后的那种满足是不可替代的。

背景

发布系统架构图简化如下:
发布架构图

管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docker仓库,容器集群更新镜像,用户通过负载均衡访问我们的容器集群。

老的varian采用shell+python开发,配合Jenkins(jdk1.7)进行发布,因内部项目较多,写了很多兼容脚本,代码比较乱。我们计划对varian进行重构,完全采用python开发,各个功能模块化,不同类型的项目用乐高的思想拼装模块部署发布,降低耦合。并将jenkins升级到最新版本,jdk同样升级到1.8。新的varian已经开发完成,现在开始部署测试了,故事就由此开始。

为了降低对现有项目的影响决定重新部署一套新的环境,完全测试通过后将老环境废弃,直接启用新环境,新环境信息如下:

  • 系统:Debian8
  • 语言:Python3.4
  • JDK1.8 + Jenkins2.134

故障处理过程

解决nginx访问403的问题

通过Jenkins调用varian正常部署了一个静态项目(纯html,css,js等静态资源),通过负载均衡访问容器集群(参考上边架构图),发现页面样式无法加载,浏览器按F12调出控制台发现个CSS文件返回403状态
chrome F12调试

web服务用的nginx,脑海里迅速过了一遍什么情况下nginx会返回403


  • nginx配置了白名单,client端访问的IP不在白名单内
allow 192.168.0.152;
deny all;
  • 访问的路径是个目录,而nginx配置了禁止列目录
#nginx中这个配置默认就是off,改成on当访问的路径是目录时,可以列出目录中的内容
autoindex           off;
  • 访问的路径是个文件,但nginx服务配置的用户和用户组对文件没有读取权限
#nginx中这个配置指定nginx服务的用户和用户组                                                                                                                  
user  www-data www-data;                                              
  • 目录索引index配置错误,例如你的目录下只有index.html,你却配置了index.shmtl或index.php等等
index index.shtml index.php;

常见的有以上问题会导致nginx返回403,迅速排查了一下,发现就是权限的问题导致的,nginx配置的用户和用户组为www-data,而css文件的属主属组都是root,且其他用户没有任何权限

# cat /etc/nginx/nginx.conf                                                                                                                     
user  www-data www-data;

# ls -lh csl.css                                                                                                                                
-rw-r----- 1 root root 7.9K Jul 24 12:34 csl.css

这里再详细讲解下linux下的文件权限,以上边的csl.css文件为例:

-rw-r----- 1 root root 7.9K Jul 24 12:34 csl.css

以空格分割

  • 第一段-rw-r-----10个字符定义了文件的权限
    • 第一个字符,这里为-代表这是一个文件,还会看到像d代表目录、l代表连接
    • 剩下九个字符,每三个一组,第2-4个字符代表属主权限,第5-7个字符代表属组权限,第8-10个字符代表其他用户的权限
    • 其中每一组三个字符分别为r、w、x,用数字表示r=4、w=2、x=1,分别代表读、写、执行权限,如果这个字符有值表明有这个权限,例如上边css文件的权限就为属主有rw读写权限,属组只有r权限,其他用户没有权限
  • 第二段为一个数字,表示文件的连接数
  • 第三段root表示用户的属主为root
  • 第四段root表示用户的属组也为root
  • 第五段则表示文件大小
  • 后边三段为修改时间
  • 最后一段为文件名

好了,接着上边的故障说,已经找到了是因为文件权限的问题导致的403,那么修改了文件的权限为644(其他用户有读取权限),再次访问顺利返回正常状态了。问题就这么结束了吗?当然不能,仔细想想为啥其他的文件权限都ok,就这个文件权限不对?接着找原因

tomcat8 UMASK

经过反复测试,发现我直接在linux下通过控制台执行python脚本的方式发布部署最终文件权限正常,但是同样的脚本经过Jenkins执行后权限就不对了。

控制台执行跟Jenkins执行有什么区别?账号不一样啊,遂把jenkins项目、tomcat文件都改成属主属组都为root重新执行,发现还是一样的结果。

再想想还有哪里不对,这个css文件是程序生成的,生成的文件权限不对,umask!这个词突然蹦出来,对,应该就是umask,他控制了生成新文件的权限。


简单介绍下什么是umask:
umask值用来设置用户在创建文件时的默认权限,跟设置文件权限命令chmod是相对的,总共四位,不过我们通常只用后三位,同样对应属主属组以及其他用户的权限,例如你的账号umask值为0022(可直接通过umask命令查看),此时你创建的文件权限默认为644(文件初始的最高权限为666,umask设置为022,那么最终的权限为:6-0,6-2,6-2=644。当然有人说文件的权限最高是777,是的没错,但我们说的是默认权限,默认权限是由umask决定的,umask设置为000时文件的权限就是666,文件夹权限777),此时创建的目录权限为755(目录的最高权限为777,umask设置为022,那么最终的权限为7-0,7-2,7-2=755)
- - -

查了root用户的umask、jenkins用户的umask,都为0022,没问题呀,并且登录这两个账号创建了新文件权限也都正常,就剩下一种情况了Jenkins!

Jenkins没有地方可以给配置UMASK,Jenkins跑在tomcat容器里,老版本的varian也有相似的处理逻辑一直没问题,本次升级了tomcat8,难道tomcat8更新了UMASK?半信半疑的看了下,果然!tomcat8的umask默认改成了0027,麻溜的改成了0022,问题顺利解决

# vi tomcat/bin/catalina.sh 
if [ -z "$UMASK" ]; then
    UMASK="0027"
fi

终于破案了,还真相于世人!

扫码关注公众号查看更多实用文章

目录
相关文章
|
Web App开发 存储 安全
SameSiteCookie疑难杂症
mPaas下SameSiteCookie疑难问题处理
944 0
SameSiteCookie疑难杂症
|
1月前
|
消息中间件 数据采集 运维
一份运维监控的终极秘籍!监控不到位,宕机两行泪
【10月更文挑战第25天】监控指标的采集分为基础监控和业务监控。基础监控涉及CPU、内存、磁盘等硬件和网络信息,而业务监控则关注服务运行状态。常见的监控数据采集方法包括日志、JMX、REST、OpenMetrics等。Google SRE提出的四个黄金指标——错误、延迟、流量和饱和度,为监控提供了重要指导。错误监控关注系统和业务错误;延迟监控关注服务响应时间;流量监控关注系统和服务的访问量;饱和度监控关注服务利用率。这些指标有助于及时发现和定位故障。
160 1
|
7月前
|
存储 NoSQL 编译器
实战总结|抽丝剥茧,记一次神奇的崩溃
本文详细回放了一个崩溃案例的分析过程。回顾了C++多态和类内存布局、pc指针与芯片异常处理、内存屏障的相关知识。
|
Dubbo Java 应用服务中间件
浅谈踩坑记之一个Java线程池参数,差点引起线上事故(下)
浅谈踩坑记之一个Java线程池参数,差点引起线上事故
300 0
|
Dubbo Java 应用服务中间件
浅谈踩坑记之一个Java线程池参数,差点引起线上事故(上)
浅谈踩坑记之一个Java线程池参数,差点引起线上事故
174 0
|
Arthas NoSQL Java
线上服务器CPU100%的真相排查【Bug利器Arthas】
这起CPU100%的事故,由某个客户演示的bug暴露出来,气氛比较尴尬....
770 0
线上服务器CPU100%的真相排查【Bug利器Arthas】
|
测试技术
如何处理不能复现的bug?软件测试工程师避坑指南
软件测试工作中常常会遇到不能复现的bug,遇到这种情况其实很正常,但是很多测试新手都按照自己的想法处理,没有提交bug,或者匆匆关闭bug。线上出现问题,就只能自己背锅了。
573 0
|
测试技术
软件测试面试题:软件上线后有bug怎么处理?
软件测试面试题:软件上线后有bug怎么处理?
207 0
|
Java 程序员
这个Bug的排查之路,真的太有趣了。 (上)
这个Bug的排查之路,真的太有趣了。 (上)
142 0
这个Bug的排查之路,真的太有趣了。 (上)
|
Java
这个Bug的排查之路,真的太有趣了。 (中)
这个Bug的排查之路,真的太有趣了。 (中)
138 0
这个Bug的排查之路,真的太有趣了。 (中)

相关实验场景

更多