一次冗长繁琐的排错经历

一次冗长繁琐的排错经历

白白忙活了一个下午+半个早饭的时间。感慨一下, 解决问题的思路很重要啊,否者就会像无头苍蝇一样,到处乱撞。

因项目关系,需要在测试环境中开启https,悲剧的是,在经过了机器迁移之后,之前可用的https连接失败了:

而Nginx中也只有寥寥几行的错误日志:

这里首先说明一下,Nginx对HTTPs的支持是通过Module ngx_http_ssl_module来实现的。而这需要保证几点:

  1. 编译nginx的时候启动了ngx_http_ssl_module模块。(nginx –V查看编译选项 包含--with-http_ssl_module)
  2. 在配置文件中开启了SSl并且配置正确(详情查看:http://nginx.org/en/docs/http/ngx_http_ssl_module.html)。
  3. 系统安装了openssl(yum list install / rpm –qa, openssl version)

在确认以上三点无误后,再次将目标锁定到nginx的错误日志上。需要注意的是alert的worker process xxx exit on signal 11,也就是说,nginx的worker进程由于"某种原因"退出了,对于退出的原因,却没有丝毫的线索。而"没有线索"恰恰是调试的最大障碍,就好比是你只告诉119起火了,却没有告知事故地址,你让消防队员如何救火?木有core dump,错误日志又一头雾水,各种度娘、谷哥无果…..但,战斗还是要继续,烽火不会因为你的放弃而停止燃烧。

突然想起来,linux提供了dmesg命令可以查看内核的一些错误信息,果不其然:

Libcrypto.so是openssl的动态链接库,这里如果segfault了,导致process exit也就在意料之中了。

现在基本清楚了:openssl的Libcrypto.so导致了segfault(或许可能还有其他原因?),从而引起了进程的异常退出,这与nginx的signal 11进程退出的表现也是基本一致的。本来事情可以很简单的,但是!在这之后,犯了一个及其低级的错误!在检查完openssl, openssl-devel是最新的版本之后,想当然的以为是之前openssl的安装出现了错误,于是果断卸掉openssl,重新安装,而这也导致之后走了很长时间的弯路。重新安装openssl之后,重启nginx时,出现如下错误:

error while loading shared libraries: libcrypto.so.4: cannot open share object ......

又是libcrypto.so的问题!查看nginx引用动态库的映射关系:

ldd $(which /xxx/xxx/webserver/sbin/nginx)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000318ea00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000318b200000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x000000317ac00000)
libcrypto.so.4 => 没有找到

根本没有libcrypto.so.4,应该是之前卸载openssl时被干掉了。

http://rpm.pbone.net搜索libcrypto.so.4,发现带该动态的库openssl版本是openssl097a-0.9.7,最新的openssl貌似是不带的。隐约中记得之前的开发机上的openssl没有升级过,果断登上,果然在/lib64/发现了libcrypto.so.4。scp过来之后,再次执行ldd命令,发现nginx已经可以找到libcrypto.so.4了:

ldd $(which /xxx/xxx/webserver/sbin/nginx)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000318ea00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000318b200000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x000000317ac00000)
libcrypto.so.4 => /lib64/libcrypto.so.4 (0x0000003198700000)

再次重启nginx,没有报错了。再次访问https,熟悉的界面终于出来了:

附录:几个用到的命令

1.查看OPenSSL的版本:

Openssl version

2.查看内核的消息:

dmesg

3. rpm包管理工具:

rpm –qa openssl*

4. yum包管理工具

yum install openssl openssl-devel

5. 定位包:

whereis libcrypto.so

locate libcrypto.so

6. 查看nginx依赖的动态库:

ldd $(which /xxx/sbin/nginx)

7. 如果有coredump文件,建议用gdb调试。

8. 如果你的libcrypto.so.4不是这种格式,可以通过建立软连接的形式解决:

ln –s libcrypto.so.0.9.7a libcrypto.so.4

参考文档:

  1. http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
  2. http://trac.nginx.org/nginx/ticket/618
  3. http://rpm.pbone.net/index.php3?stat=3&limit=4&srodzaj=1&dl=40&search=libcrypto.so.4&field[]=1&field[]=2
  4. http://forum.directadmin.com/showthread.php?t=21131
  5. http://blog.csdn.net/lsbhjshyn/article/details/38734261
  6. http://bbs.chinaunix.net/thread-2117172-1-1.html
  7. http://94j69.blog.51cto.com/542780/1127224
  8. http://lazycat.is-programmer.com/posts/31925.html
  9. http://lutaf.com/140.htm

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 00:06:49

一次冗长繁琐的排错经历的相关文章

HAProxy匹配泛解析域名排错经历

一 故障描述 HAProxy已经搭建完毕,现在需要把以后缀为game.xxx.com的域名转发到后端的Nginx虚拟机主机上,所以关键在于怎么使用HAProxy匹配game.xxx.com.在HAProxy的配置文件中设置将HTTP请求转发到后端Nginx主机的80端口,通过88端口检测Nginx和PHP-FPM的监控状态. 通过设置HAProxy ACL规则  acl game_url      hdr_end(host) -i   game.xxx.com 然后reload HAProxy后

openstack nova-network 的小bug的排错经历

环境是 nova-network +vmware+flatdhcp 错误表现为 开出来的虚拟机有一定几率获取不到dhcp地址,手工赋予ip则正常,用flat模式注入的ip正常,下面是排错过程 1首先找网络 防火墙已经把 dnsmasq对应的端口已经打开 抓包结果: 可以看到虚拟机dhcp 已经发到br100上面,但是br100 没有返回,基本可以排除网络原因 2 找dhcp 原因 首先kill掉 nova启动的 dnsmasq进程,手工去启一个dnsmasq,虚拟机是正常的. 其次 查看 dns

Yosimite 系统 “发生意外错误(错误代码-50)” (记一次macbook pro(mid2012) 自主维修排错经历)

电脑型号: Macbook Pro(Mid 2012)   A1278 问题描述: 上周,电脑偶尔弹出提示框"发生意外错误(错误代码-50)",弹出这个提示之后硬盘好像变成只读模式,无法保存任何东西到硬盘.重启之后会好一会儿,但是用几个小时又会出现相同的问题. 最开始没有在意这个问题,某次又出弹出了这个提示,想着重启太麻烦,干脆注销一下,估计会好,谁知注销之后系统就卡死了,卡了好长一段时间,看着没有反应,就只有强制关机了,再次打开发现系统进度条到达30%左右就前进不了了,等了好长时间还

一次OpenStack虚拟机热迁移的排错经历

先来看下cpu型号,从/proc/cpuinfo中可以看出所有cpu型号版本是一样的 通过nova live-migration --debug <instance-xxx>  <node-xxxx>命令行迁移,可以看到报错信息 通过nova-compute log错误信息定位代码 再下面就到libvirt.py了 通过这个api,看不出具体错误信息,可能是跟flags是0有关系. 通过debug代码,保存cpu xml信息到某个文件 通过virsh接口可以看到错误, 舒了一口气!

Qt try catch排错历程

前几天从网上下载了一份网友用Qt写的作品,打开时发现它是用VS2010写的,而我机器上只有VS2008,倒腾了半天最终没能用VS2008打开,而自己又不想再安装VS2010.还好在工程中有.pro文件,我只好用QtCreator打开了它.但是在编译的时候出现了这个错误提示:exception handling disabled, use -fexceptions to enable,因此也就有了以下的排错经历.    为了找到问题的根源,我在两个环境下专门建了一个类似的小工程TryCatchTe

那些年提交AppStore审核踩过的坑

此文刚刚上了CocoaChina的首页:那些年提交AppStore审核踩过的坑  欢迎围观,谢谢大家支持. //add by 云峰小罗,2016.08.04 做iOS开发近5年了,每次提交版本时不可谓不小心翼翼,如履薄冰,但是还是难免踩到了一些坑.苹果的官方文档(AppStore审核条款)这里就不罗列了,太冗长繁琐了,而且大部分是一般app都不会触碰的到的,今天我主要想以自己的亲身经历,跟大家回顾一下这些年我提交AppStore审核时踩过的坑,并且针对如何避免给出一些tips供大家参考.大神请忽

去BAT,你应该要看一看的面试经验总结(转)

来源微信公众号『easyserverdev』 http://mp.weixin.qq.com/s/UZljzFMjobo1wzCguY7NDg 说下我的面试经验吧,都是亲身经历,不喜勿喷: 我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的. 先交代下背景:坐标上海,做技术开发,我本人面试的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理.我本人也是上几家公司的面试官,因为接下来几年面临着成家养小孩,技术上也到了瓶颈期,虽然拿了不少offer,但是想综合

[转]一个“技术文化人”的片段感悟

作者简介 孟岩,曾任CSDN和<程序员>杂志技术总编.(本文来自<程序员>杂志2010年11期) 2003年我加入CSDN,6年之后离开.在2003年之后,我的技术身份就很难界定了.曾经有个朋友称我为“技术文化人”——不以软件开发为生,但整天都在拿软件开发来说事,与这个行业的整体关系可能比任何一个具体的程序员或者架构师都更密切.听上去像是一种恭维,又好像是暗讽,似乎我是站在戏台下面带头起哄的票友.其实在我看来,我与一线技术人的根本区别,在于关注的问题不同:他们关心的如何做好软件,我

目标跟踪系列十二:Exploiting the Circulant Structure of Tracking-by-detection with Kernels代码关键记录

代码关键点记录:成功不远了!O(∩_∩)O 哈哈~ 1. Input : load_video_info.m 读入视频文件groundtruth_rect.txt(里面是4个一组的点,x,y, width ,height ?),得到有用的参数: target_sz = [ground_truth(1,4), ground_truth(1,3)];  得到的是目标的尺寸(这里好像是第一张的,也就是一样大) 这个值会用来计算空间带宽的值.通常一个m*n的目标,它的空间带宽为 sqrt(m*n)/16