レンタルサーバーで、root権限無し、sshあり環境で古いrubyから最新rubyをユーザー領域にインストール

やっとうまくいったんで。

レンタルサーバーを借りてて、Ruby on Railsを動かしたくなって、きっとssh接続もできるのだからそんな困難もなくRails使えるだろうなって考えてたら、いざやってみたらえらい困難なハードルがあったので乗り越えたあたりをブログにしてみます。

Cent OS 6.1

Ruby 1.7

ssh使用可能

root権限無し

mkdir libyaml-devel
cd libyaml-devel
wget –no-check-certificate https://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar zxvf yaml-0.1.5.tar.gz
cd yaml-0.1.5
mkdir ~/local/libyaml-devel-015
./configure –prefix=/home/yourname/local/libyaml-devel-015
make
make install

cd
cd ruby-source/ruby-3.2.2
./configure RUBY_CONFIGURE_OPTS=”–prefix=/home/yourname/ruby-source –with-libyaml-dir=/local/libyaml-devel-015 –with-openssl-dir=/home/yourname/openssl”

結論としてrubyのソースコードから自分のホームディレクトリにインストールしました。

その際yamlがうまく読み込めない不具合があったので、最新版のruby3.2.2を3.1.4に一つ下げたのを使い、yaml-develも最新の0.2.5から0.1.5に下げてコンパイルしたらmake installまで通り、無事ユーザー領域でrubyを使い始めることができました。

そのまますぐrubyでコマンドが反応するわけではないので、.bash_profileにユーザー領域にインストールしたrubyのパスを指定してあげることも必要です。

.bash_profile >> echo “~/ruby-sourcedir/ruby-3.1.4/“

source .bash_profile

これでruby3.1.4がruby -vと打つと反応するようになりました。

~/ruby-source/ruby-3.1.4/ruby*

とmake install後、ユーザー領域でrubyが使用できるようになっています。

他にも2日ほどどっぷり浸かってたくさんのことを試していたのですが、検索しても出てこなかった問題部分だけを先頭に載せることにしました。他のことは検索したら載ってることだけなので。最終的にyaml-develがおかしいっていうところでつまづいて自力で通せたところです。

ここからは失敗集、とかうまくいくまでの前座的なお話

レンタルサーバー業者が古いOSやRuby,PHPなどを使ってる傾向があります。いろんなレンタルサーバーをチェックしましたが、バージョンが古い。というのがけっこう共通点な問題なようです。なぜ古いままにしておくのか、経営陣の頭が古くなったのか、私の使ってるところはたぶんベンチャー精神旺盛なところだと思うのですが、Ruby on Rails使いたいからRubyのバージョンアップしてほしい、とフォームから送信したらバージョンアップは却下なり、と返信が来ました。そこだけなら乗り換えかなあと思うんですが、他のレンタルサーバーも事情を調べてると同じくバージョンが古い問題があるんですよね。

古いバージョンを使ってると新しいアプリが動かなかったりと不具合があるんですが、多くのレンタルサーバーがあえてなのか古いバージョンのままにしてるみたいです。これは考えなく古いままにするわけがないと思うので、やっぱり最新のバージョンを利用しがちなウィルス対策なのでしょうかね。古いOSでは最新のウィルスは動作しないことを理解しての、バージョン古いままにしておく。なのかもしれません。

でないと最新にアップデートする手間なんて1行コマンドを打つだけなので、それだけで企業価値アップなら率先して最新にするはずですね。

本気で対策をしている人たちはわざわざおおやけに対策を施してることを言わないものです。黙って自分たちだけ対策をして自分の安全だけを確保するものです。

まず最初にやってみたこと

ruby -v

で現在の使用バージョンを調べるところからですよね。バージョンは1.7を使ってました。systemデフォルトのrubyなのでかなり古いです。現在の最新版は3.2.2でした。

これを最新にしないとRuby on Railsをインストールすることすらできない。

続いて普通にアップデートを試みてみる。

yum install update

ほんとは apt get update と打ったんですが、Cent OSだとyumだらしいですね。そもそもrootじゃないのでyum updateはできないんですが、一応打ってみました。もちろんrubyのバージョンは変わってません。

sudo yum install update

これももちろん、root権限がないので自分はrootのパスワードを知りませんから使うことはできません。

rbenv install 3.2.2

rbenvから普通にインストールを試みてみる。当然うまくいかないだろうと思ってましたが、うまくいかなかったことを積み重ねていくと正解に辿り着きやすくなるんです。

/tmp/ruby-build.20230922051632.12113.log

エラーにログを読んで、と書いてあったのでログを読む、これも意味無しでした。

wget –no-check-certificate http://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz

libyamlがなんかおかしいよ、と書いてあって検索するとyaml-develが必要とあって、当然yum installは使えないので、ソースコードを直接ダウンロードして

cd yaml-0.2.5

./configure –prefix=$HOME/local

gmake

gmake install

./configureでインストール先を–prefixで自分のユーザーディレクトリを指定できます。root権限がないから自分の管理下にインストールするわけです。yamlのinstallで失敗することはないと思います。

–no-check-certificate はCent OSはセキュリティが厳しいのでwgetするときもno-checkって入れないとダウンロードもしない仕様なようです。

CC=gcc RUBY_CONFIGURE_OPTS=”–with-openssl-dir=/usr/local –with-libyaml-dir=$HOME/local” TMPDIR=”$HOME/tmp” rbenv install 3.2.2

検索してレンタルサーバー上でrubyをインストールするためのコマンドを見つけてそのまま実行。rbenvでのインストールのせいかこれも失敗します。ひょっとしたらバージョンを下げてやればインストールできたのかもしれないですが、試してた時は失敗としておきました。

openssl-devel

opensslもいまだに1.01が入っていて、これもソースコードから自分のユーザーディレクトリにインストールしてやる必要がありました。rubyのバージョン2.7以上だとopensslのバージョンも上げないといけないらしい。

CC=gcc RUBY_CONFIGURE_OPTS=”–with-openssl-dir=/usr/local –with-libyaml-dir=$HOME/local” TMPDIR=”$HOME/tmp” –prefix=/home/your-directry/.rbenv/versions/3.2.2 –enable-shared LDFLAGS=-L/home/your-directry/.rbenv/versions/3.2.2/lib CPPFLAGS=-I/home/your-directry/.rbenv/versions/3.2.2/include rbenv install 3.2.2

もう一度、~/ この相対パスではなく、/home/your-directry/ のような絶対パスで指定しろって書いてあって、変更して再度実行。これもうまくはいかなかったんですがエラーメッセージは変わってました。

FAILD ruby-build

とruby-buildが原因のようなことが書かれていたので、ユーザー領域にあるruby-buildを.bash_profileに$PATHを通してみました。

echo “$PATH=~/ruby/bin/ruby-build” >> ~/.bash_profile

source ~/.bash_profile

これでユーザー領域のruby-buildを使うようになりました。

結局ruby-buildの参照先を変えてもFAILD ruby-buildのエラー表示は変わらずでした。

open-ssl

これも必要ならしいので、ソースコードからユーザー領域にインストールします。

mkdir -p openssl/src

cd openssl/src

wget –no-check-certificate https://www.openssl.org/source/openssl-3.1.3.tar.gz

tar -zxvf openssl-3.1.3.tar.gz

cd openssl-3.1.3

mkdir ~/openssl/openssl

./config –prefix=/home/your-directry/openssl/openssl

make

make install

opensslの./configのところでは~/ 相対パスを使うな、とエラーメッセージが出てたので/homeからの絶対パスでprefixを指定しました。それ以外はエラーも出ることなく、make installまで通りました。

TMPDIR=~/tmp RUBY_CONFIGURE_OPTS=–with-openssl-dir=~/openssl –with-libyaml-dir=$HOME/local” rbenv install 3.2.2

opensslとlibyamlも自前で用意したのを場所指定して再度rbenv installを試みてみました。これも失敗。

rbenvからのインストールを試みる作戦は思いつく限りのことをしてもうまくいかなかったので、次の作戦はrubyのソースコードから直接コンパイルしてインストール。rbenvも本当はバージョンを3.1.4に下げてやれば入ったかもしれないけど。

wget https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz

tar zxvf *.tar.gz

cd ruby-3.2.2

./configure –prefix=/home/your-directry/ruby-source

make

make install

./configureするときにroot権限がないレンタルサーバーだと、自分のホームディレクトリを指定しないといけないので、–prefixを使ってインストール先を指定してあげます。

エラーメッセージが出て、yamlがなんかおかしい、と出てきたので再度./configure

./configure –prefix=/home/your-directry/ruby-source –with-libyaml-dir=/home/your-directry/yaml-025

make

make install

これでもmakeの時点でエラーが出てきました。エラーメッセージを読んでも不具合がよくわからず。

cannot load such file — psych

が出ていました。エラーは一つづつ片付けていきましょう。と検索してpsychについて調べてみましたが、これはあんまり関係ないのか、結局手を付けずに済ましました。

yum list installed | grep libyaml-devel

libyaml-develが必要、と検索してたら出てきて、yumでインストールされているか確認してみました。これはさっき直接ソースコードからインストールしたyaml-0.2.5のことだそうです。yumを使ってインストールしてないので、yumのlistには出てこないんですが、ちゃんとインストールされています。

ここまで思いつくことを全てやって、万策尽きた。と思ったところでふと、rubyのバージョンが古いってことは、Cent OSも古いのを使ってて、ひょっとしたら最新のrubyのインストールに対応してないんじゃ、と思って万策尽きたのだし、思いつく限り古いバージョンを組み合わせて試して行ってみる、もやってみよう、としたらそれが当たりでした。

wget –no-check-certificate https://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

tar zxvf *.tar.gz

mkdir ~/local/libyaml-devel-015

cd yaml-0.1.5

./configure –prefix=/home/your-directry/local/libyaml-devel-015

make

install

と、まずはyaml-0.2.5からyaml-0.1.5にバージョンダウンして別途インストール

cd ruby-source

cd ruby-3.2.2

./configure RUBY_CONFIGURE_OPTS=”–prefix=/home/your-directry/ruby-source –with-libyaml-dir=/local/libyaml-devel-015 –with-openssl-dir=/home/your-directry/openssl”

最新のruby3.2.2にlibyamlを0.1.5に下げて./configureしてみると、makeに変化が。ちょっと進んだ感じがしました。

wget https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.4.tar.gz

rubyのバージョンも3.2.2から3.1.4に下げてみました。ダメ元なのでうまくいくまでどんどんバージョンを下げていく意気込みはありましたが、ここで成功してしまいます。

tar zxvf ruby-3.1.4.tar.gz

cd ruby-3.1.4

./configure RUBY_CONFIGURE_OPTS=”–prefix=/home/your-directry/ruby-source –with-libyaml-dir=/local/libyaml-devel-015 –with-openssl-dir=/home/your-directry/openssl”

make

make install

いつもの調子なら、makeのところでERROR 1が出て進めないんですが、3.1.4にバージョンを下げたところ、makeがどんどん進んでいって、完了したメッセージが出てきました。そしてmake install。これでオッケー。

./ruby -v

~/ruby-source ディレクトリにインストールしたので、そこにrubyの実行コマンドも入っています。なので./ruby -v で3.1.4と結果が返ってこいばinstall完了。

最後にただ単にrubyと打っても3.1.4の方のrubyを使うように.bash_profileに$PATHを記入しておきましょう。

.bash_profile

echo “~/ruby-source/ruby-3.1.4” >> .bash_profile

source .bash_profile

これで

ruby -v

3.1.4

とバージョンが切り替わっていればインストール完了です。

まとめ

いやあ、2日くらいどっぷりハマってずっと頑張ってました。VPSサーバーを借りればroot権限付きで、そんなに悩まなかっただろうと思いますが、レンタルサーバーでも自分のユーザーディレクトリ下にインストールすれば使える、ということを知って、これができればVPSサーバーに乗り換えしなくてもいいんじゃないか、って思って、VPSとレンタルサーバーだと、やはりレンタルサーバーの方が安いんで、できたら一番いいんではって思っての2日間の頑張りでしたね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です