摘要
正在生成中……
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/php@5.6/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/php@5.6/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 openssl@1.0
耗时较长,主要是需要在本地编译和安装。
安装完成后可以看到本地有两个版本的openssl了
ll /usr/local/opt/ | grep openssl
lrwxr-xr-x 1 falcon admin 28B Jul 3 12:02 openssl@1.0 -> ../Cellar/openssl@1.0/1.0.2t
lrwxr-xr-x 1 falcon admin 28B Mar 19 14:17 openssl@1.1 -> ../Cellar/openssl@1.1/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/openssl@1.0/lib/libcrypto.1.0.0.dylib /usr/local/opt/php@5.6/sbin/php-fpm
sudo install_name_tool -change /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/opt/openssl@1.0/lib/libssl.1.0.0.dylib /usr/local/opt/php@5.6/sbin/php-fpm
使用 otool
就能查看应用依赖库的所在位置。参考之前的文章:《用otool查看应用的动态库》
One more thing
github上有开发者对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/openssl@1.0/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/openssl@1.0/lib/libcrypto.1.0.0.dylib /usr/local/Cellar/mysql/5.7.13/bin/mysqld
为了防止homebrew自以为是地移除openssl1.0,可以修改这个位置的权限,我真是受够了这个沙雕homebrew。这样只要不用sudo 的brew安装就不会移除1.0的版本,好像默认也不能使用sudo。
cd /usr/local/opt
sudo chown -R root:admin openssl@1.0/