摘要
正在生成中……
今天用homebrew
安装openresty
,发现一个奇怪的问题,安装时需要下载一个文件, https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch 然后就报错退出:
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
于是很自然地想到使用 proxy_chain
执行安装,但依然提示这个错误。接着尝试给homebrew
使用代理,实际上就是给curl
配置代理,因为homebrew
是调用curl
来进行文件下载的。修改~/.curlrc
文件,加上socks5
的代理, 像这样配置好了代理:
socks5 = "127.0.0.1:1085"
保存后测试直接调用curl
可以成功下载 raw.githubusercontent.com
上的那个文件。然而再次使用homebrew
安装依然提示SSL错误。?
这说明 homebrew
在调用 curl
时并没有使用到代理,这是为什么呢?为了追根溯源,我们来看一下整个安装过程。
PS:使用 -v 命令可以查看homebrew安装过程
$ brew -v install openresty/brew/openresty
==> Installing openresty from openresty/brew
==> Downloading https://homebrew.bintray.com/bottles/geoip-1.6.12.catalina.bottle.1.tar.gz
Already downloaded: /Users/falcon/Library/Caches/Homebrew/downloads/0b6b3fee7857c204e048fa865837318a0c094739d8ce80c2e9a233f359dd03e4--geoip-1.6.12.catalina.bottle.1.tar.gz
==> Verifying checksum for '0b6b3fee7857c204e048fa865837318a0c094739d8ce80c2e9a233f359dd03e4--geoip-1.6.12.catalina.bottle.1.tar.gz'.
==> Downloading https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch
/usr/bin/curl --disable --globoff --show-error --user-agent Homebrew/2.6.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10.15.7\)\ curl/7.64.1 --header Accept-Language:\ en --fail --retry 3 --location --remote-time --continue-at 0 --output /Users/falcon/Library/Caches/Homebrew/downloads/57153ba4d1c3b1ddddf8b3fbfaa4338c7a0f2f3e5d09af19f02613e478b375e5--openssl-1.1.1f-sess_set_get_cb_yield.patch.incomplete https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
Error: Failed to download resource "openresty-openssl111--patch"
留意这一行
/usr/bin/curl --disable --globoff --show-error --user-agent Homebrew/2.6.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10.15.7\)\ curl/7.64.1 --header Accept-Language:\ en --fail --retry 3 --location --remote-time --continue-at 0 --output /Users/falcon/Library/Caches/Homebrew/downloads/57153ba4d1c3b1ddddf8b3fbfaa4338c7a0f2f3e5d09af19f02613e478b375e5--openssl-1.1.1f-sess_set_get_cb_yield.patch.incomplete https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch
从这里可以看到 curl
使用了一个叫 --disable
的参数,查看curl
的帮助可以看出:
$ curl -h | grep disable
-q, --disable Disable .curlrc
...
这个参数的作用是忽略 .curlrc
的配置,这就解释了在 .curlrc
中配置的代理不生效的原因。
不过也有办法更改这个设置,那就是export
一个 HOMEBREW_CURLRC
的变量来指定 .curlrc
的位置 , 写在shell
的配置文件里,比如~/.zshrc
或者 ~/.bashrc
中,也可以单独为homebrew
中使用的curl
配置一个不同于默认配置的 curlrc
export HOMEBREW_CURLRC="~/.curlrc"
官方还有更多其他的配置,具体可以查看这里:https://docs.brew.sh/Manpage
PS: 一直不太喜欢homebrew
,原因是经常踩到 homebrew
的坑,许多软件能安装得起来运转得正常,一旦 brew update
之后 突然就运行不起来太正常不过了,正常是运气好,不正常又没了半天时间,比如上次的openssl
更新后,php-fpm
就运行不起来了,要花大量的时间去找原因和解决方案。homebrew
配置我也认为是违反直觉的,作为一个用户层面的软件,为什么要默认禁止用户的 配置呢?
最根本的原因可能是homebrew
依赖太多其他的软件,又不想被他们的配置左右,类似的情形上次我看到的可能是WordPress
在使用MySQL
连接时,把会话时的sql_mode
单独设定为非严格模式,这样就不依赖系统的sql_mode
设定,因为不同机器上的 sql_mode
可能是严格模式,也可能是非严格模式,WordPress
这样做,可以从根本上保证在各个机器上表现一致。
可能这就是我能为brew辩护的最后的理由。。。