homebrew openssl自動更新後導致的php5.6啓動失敗的問題

homebrew 更新了openssl至1.1了,然後把1.0版本的openssl自動刪除了,導致了一些依賴openssl1.0的 app 報錯,比如php5.6,在php5.6的php-fpm日誌下就有這樣的錯誤信息:

vi /usr/local/var/log/php-fpm56.log
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/opt/[email protected]/sbin/php-fpm
  Reason: image not found
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/opt/[email protected]/sbin/php-fpm
  Reason: image not found

也就是原來的libcrypto.1.0.0.dylib找不到了。

安裝openssl 1.0

可以直接下載openssl1.0的ruby文件,然後本地安裝,但這樣下次homebrew更新時還會自動移除這個版本,很蛋疼,或者使用homebrew在線安裝指定版本安裝,我們使用homebrew在線安裝,把openssl1.0裝回來:

brew install [email protected]

耗時較長,主要是需要在本地編譯和安裝。

安裝完成後可以看到本地有兩個版本的openssl了

ll /usr/local/opt/ | grep openssl
lrwxr-xr-x    1 falcon  admin    28B Jul  3 12:02 [email protected] -> ../Cellar/[email protected]/1.0.2t
lrwxr-xr-x    1 falcon  admin    28B Mar 19 14:17 [email protected] -> ../Cellar/[email protected]/1.1.1d

修改依賴路徑

將原來的依賴路徑修改爲新的openssl 1.0的路徑,也就是php5.6的php-fpm尋找的相關dylib的路徑,需要藉助install_name_tool

sudo install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib  /usr/local/opt/[email protected]/lib/libcrypto.1.0.0.dylib /usr/local/opt/[email protected]/sbin/php-fpm
sudo install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib  /usr/local/opt/[email protected]/lib/libssl.1.0.0.dylib /usr/local/opt/[email protected]/sbin/php-fpm

 可以使用 otool  查看應用的依賴庫的位置。參考之前的文章:《用otool查看應用的動態庫》

One more thing

有開發者對php5.6 發佈了一個修正補丁,但需要從它指定的pull request Formula安裝,這意味着你需要重新安裝php5.6。否則會得 Error: invalid option: --with-openssl-1.1-patch錯誤。

https://github.com/eXolnet/homebrew-deprecated/pull/25

其他

mysql5.7 存在同樣的依賴路徑,也需要修改如下:

sudo install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib  /usr/local/opt/[email protected]/lib/libssl.1.0.0.dylib /usr/local/Cellar/mysql/5.7.13/bin/mysqld
sudo install_name_tool -change /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib  /usr/local/opt/[email protected]/lib/libcrypto.1.0.0.dylib /usr/local/Cellar/mysql/5.7.13/bin/mysqld

爲了防止homebrew自以爲是地移除openssl1.0,修改這個位置的權限,我真是受夠了這個沙雕homebrew。這樣只要不用sudo 的brew安裝就不會移除1.0的版本。

cd /usr/local/opt
sudo chown -R root:admin [email protected]/

 

本文在 CC BY-NC-SA 4.0 許可 下發布
  • 署名 - 您可以複製、發行、展覽、表演、放映、廣播或通過信息網絡傳播本作品,但必須 署名作者 並添加鏈接到 原文地址
  • 非商業性使用 — 您不得將本作品用於商業目的。
  • 相同方式共享 — 如果您再混合、轉換或者基於本作品進行創作,您必須基於與原先許可協議相同的許可協議 分發您貢獻的作品。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章