Rackspace服务器Ruby站点无法访问rubygems.org问题求助
我来帮你排查这个困扰你的RubyGems超时问题——既然curl能正常下载gem文件,但gem和bundle命令却报超时错误,说明问题大概率出在RubyGems的配置或者网络解析层面,咱们一步步来解决:
切换RubyGems源到HTTPS协议
HTTP协议的源可能存在链路不稳定或被拦截的情况,换成HTTPS源通常能解决大部分超时问题:gem sources --remove http://rubygems.org/ gem sources --add https://rubygems.org/ # 确认源设置正确 gem sources -l确保输出里只有
https://rubygems.org/这一个源。调整gem的超时时间
默认的超时时间可能太短,不足以应对服务器到rubygems的网络延迟,延长超时时间试试:gem config set timeout 60这里把超时设为60秒,给gem足够的下载缓冲时间。
检查并清理代理配置
有时候服务器的代理配置会影响gem的网络请求,而curl可能用了不同的代理设置。先查看当前gem的代理状态:gem env | grep -A 2 "Proxy"如果有不需要的代理配置,直接移除:
gem config --remove http_proxy gem config --remove https_proxy如果确实需要通过代理访问,再正确设置对应的代理地址和端口。
强制使用公共DNS解析
服务器默认的DNS可能解析rubygems域名较慢,临时切换到公共DNS(比如Google的8.8.8.8)测试:
编辑/etc/resolv.conf文件,在最顶部添加:nameserver 8.8.8.8保存后再尝试运行
gem update --system和bundle install。(注意:部分系统重启后resolv.conf会被重置,需要配置永久DNS的话要对应修改系统的DNS设置)临时手动安装gem(救急方案)
既然curl能下载gem,你可以先手动下载并本地安装来临时推进工作:# 下载报错的rake gem curl -O http://rubygems.org/gems/rake-12.3.1.gem # 本地安装 gem install rake-12.3.1.gem对于bundle依赖,可以通过
bundle config local.gemname /path/to/local/gem来让bundle优先使用本地gem,但这只是临时办法,还是建议解决根本的网络配置问题。检查服务器防火墙/安全组规则
虽然curl能通,但不排除服务器的防火墙(比如iptables)或SELinux对Ruby进程的网络请求做了限制:- 查看iptables规则:
sudo iptables -L - 查看SELinux状态:
getenforce,如果是Enforcing可以临时关闭测试:sudo setenforce 0,测试后再决定是否调整SELinux策略。
- 查看iptables规则:
先从切换HTTPS源和调整超时时间这两个步骤开始尝试,这是最常见的解决思路,如果还不行再依次排查代理、DNS和防火墙的问题。
内容的提问来源于stack exchange,提问作者mrturtle

