最近搭建redis集群,本来觉得,这个事情么,一个小时足够了。结果人算不如天算,踩坑了。
事件回顾
redis基础配置及服务起来以后,需要安装ruby 与 rubygem,方可使用redis集群。安装ruby 也简单,去官网(https://www.ruby-lang.org/zh_cn/downloads/ )下载即可。然后,解压,进入解压目录中,正常来说,只要三个命令即可:
./configure
make
make install
拦路虎1
当然也可以指定下安装路径./configure --PREFIX=/usr/local/xxx
,这一过程很顺利。
执行make
的时候,出现如下报错:
make[2]: Leaving directory `/usr/local/redis/ruby/ruby-2.6.3/ext/fiber'
make[2]: Entering directory `/usr/local/redis/ruby/ruby-2.6.3/ext/zlib'
make[2]: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop.
make[2]: Leaving directory `/usr/local/redis/ruby/ruby-2.6.3/ext/zlib'
make[1]: *** [ext/zlib/all] Error 2
make[1]: Leaving directory `/usr/local/redis/ruby/ruby-2.6.3'
make: *** [build-ext] Error 2
大概说是,找不到/include/ruby.h'
这个文件。
解决方法是:
[root@localhost ruby-2.6.3]# cd /usr/local/redis/ruby/ruby-2.6.3/ext/zlib
[root@localhost zlib]# ls
depend extconf.rb exts.mk Makefile mkmf.log zlib.c zlib.gemspec
[root@localhost zlib]# ruby extconf.rb
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for crc32_combine() in zlib.h... yes
checking for adler32_combine() in zlib.h... yes
checking for z_crc_t in zlib.h... yes
creating Makefile
看起来没啥问题,继续执行
[root@localhost zlib]# make
make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop.
哦,报错了,先来看看哪里报错了?
# AUTOGENERATED DEPENDENCIES START
zlib.o: $(RUBY_EXTCONF_H)
zlib.o: $(arch_hdrdir)/ruby/config.h
zlib.o: $(hdrdir)/ruby/backward.h
zlib.o: $(hdrdir)/ruby/defines.h
zlib.o: $(hdrdir)/ruby/encoding.h
zlib.o: $(hdrdir)/ruby/intern.h
zlib.o: $(hdrdir)/ruby/io.h
zlib.o: $(hdrdir)/ruby/missing.h
zlib.o: $(hdrdir)/ruby/onigmo.h
zlib.o: $(hdrdir)/ruby/oniguruma.h
zlib.o: $(hdrdir)/ruby/ruby.h
zlib.o: $(hdrdir)/ruby/st.h
zlib.o: $(hdrdir)/ruby/subst.h
zlib.o: $(hdrdir)/ruby/thread.h
zlib.o: $(top_srcdir)/include/ruby.h <----------------- 问题在这里
zlib.o: zlib.c
# AUTOGENERATED DEPENDENCIES END
让我们再来看看报错信息:make: *** No rule to make target
/include/ruby.h’, needed by zlib.o'. Stop.
。它提示在/include/ruby.h
这个路径下的文件不存在,确认了一下的确不存在。但是配置项中明明有变量$(top_srcdir)
,难道是变量没有设置?或者说设置了为空的变量?
此处有两种解决方法:
1、在Makefile
文档最前面,设置变量top_srcdir
的路径
2、用绝对/相对路径替换$(top_srcdir)
该变量
来一个简单粗暴点的方法吧:
使用 vim Makefile
(因为要大批量改动,建议先备份: cp Makefile Makefile-date +%F
)编辑文件,而后替换所有$(top_srcdir)
,输入:
: %s/$(top_srcdir)/..\/../g
替换后,保存,退出编辑,执行
make
一切正常,执行
make install
一切正常。
拦路虎2
接下去执行命令:
[root@localhost ruby-2.6.3]# gem install redis
Traceback (most recent call last):
33: from /usr/local/bin/gem:21:in `<main>'
32: from /usr/local/lib/ruby/2.6.0/rubygems/gem_runner.rb:59:in `run'
31: from /usr/local/lib/ruby/2.6.0/rubygems/command_manager.rb:148:in `run'
30: from /usr/local/lib/ruby/2.6.0/rubygems/command_manager.rb:178:in `process_args'
.......
.......
.......
7: from /usr/local/lib/ruby/2.6.0/rubygems/request/http_pool.rb:39:in `make_connection'
6: from /usr/local/lib/ruby/2.6.0/rubygems/request/https_pool.rb:6:in `setup_connection'
5: from /usr/local/lib/ruby/2.6.0/rubygems/request.rb:48:in `configure_connection_for_https'
4: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
3: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
2: from /usr/local/lib/ruby/2.6.0/net/https.rb:23:in `<top (required)>'
1: from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- openssl (LoadError)
如上报错,如果没装该库,需先安装:
yum -y install openssl-delvel
接着处理方式就和上述有些类似了:
cd /usr/local/redis/ruby/ruby-2.6.3/ext/openssl
ruby extconf.rb
make
make install
若顺利的话,问题即处理完毕:
[root@localhost openssl]# gem install redis
Fetching redis-4.1.1.gem
Successfully installed redis-4.1.1
Parsing documentation for redis-4.1.1
Installing ri documentation for redis-4.1.1
Done installing documentation for redis after 0 seconds
1 gem installed
安装可以正常执行。
若出现类似上述找不到/include/ruby.h'
这个文件,按照上述处理即可。