一次冗長繁瑣的排錯經歷

一次冗長繁瑣的排錯經歷

白白忙活了一個下午+半個早飯的時間。感慨一下, 解決問題的思路很重要啊,否者就會像無頭蒼蠅同樣,處處亂撞。php

因項目關係,須要在測試環境中開啓https,悲劇的是,在通過了機器遷移以後,以前可用的https鏈接失敗了:html

 

而Nginx中也只有寥寥幾行的錯誤日誌:linux

 

這裏首先說明一下,Nginx對HTTPs的支持是經過Module ngx_http_ssl_module來實現的。而這須要保證幾點:nginx

  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,錯誤日誌又一頭霧水,各類度娘、谷哥無果…..但,戰鬥仍是要繼續,烽火不會由於你的放棄而中止燃燒。c++

忽然想起來,linux提供了dmesg命令能夠查看內核的一些錯誤信息,果不其然:工具

Libcrypto.so是openssl的動態連接庫,這裏若是segfault了,致使process exit也就在乎料之中了。post

如今基本清楚了: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引用動態庫的映射關係:spa

ldd $(which 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時被幹掉了。.net

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 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 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
相關文章
相關標籤/搜索