at posts/single.html

Ruby 1.8.7 が終了するのでレンサバCGIで Ruby 2.0.0-p195 と tDiary を動かした

あと一週間でついに Ruby 1.8.7 のサポートが終了する。Ruby 1.8.0のリリースが2003年8月だから、10年間もお世話になったことになる。

ところが、さくらのレンタルサーバはまだ Ruby 1.8 しか入っていない。

$ /usr/local/bin/ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [amd64-freebsd8]

tDiary も次のリリースからは 1.8 がサポート終了になるので、さくらのレンタルサーバで Ruby 2.0 で tDiary の最新版を動かす手順をまとめておく *1

git のインストール

Ruby 2.0 のインストールに rbenv + ruby-build を使うので、 GitHub からソースコードを取得できるように git をインストールしておく。インストール先はホームディレクトリ ($HOME) 。 FreeBSD の make だとビルドに失敗するため、 gmake (GNU Make) を使う。

$ wget --no-check-certificate https://git-core.googlecode.com/files/git-1.8.3.1.tar.gz
$ tar zxvf git-1.8.3.1.tar.gz
$ cd git-1.8.3.1
$ ./configure --prefix=$HOME --enable-pthreads=-pthread --with-curl=/usr/local
$ gmake && gmake install

--enable-pthreds オプションを指定しないとビルドでエラーになる。

    LINK git-credential-store
libgit.a(run-command.o)(.text+0x6a2): In function `start_async':
/home/machu-test/src/git-1.8.3.1/run-command.c: 719: undefined reference to `pthread_create'
libgit.a(preload-index.o)(.text+0x97): In function `read_index_preload':
/home/machu-test/src/git-1.8.3.1/preload-index.c: 92: undefined reference to `pthread_create'
gmake: *** [git-credential-store] Error 1

--with-curl を指定しないと、インストール後に https スキームが使えない。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/machu-test/.rbenv'...
fatal: Unable to find remote helper for 'https'

参考リンク

rbenv + ruby-build のインストール

Ruby は普通に tar.gz のソースからインストールするのではなく、 rbenv と ruby-build で管理する。これで、今後のバージョンアップへの追従が楽になる。昔はrvmを使っていたけど、今は rbenv 。インストール手順は 公式ドキュメント を参照。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

さくらのレンタルサーバは標準シェルが csh なので、 rbenv の設定は .bashrc に追記している (.bash_profile はログオン時しか読まれない) 。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ rbenv --version
rbenv 0.4.0-49-g8b04303

ruby 2.0.0-p195 のインストール

rbenv を使ってコンパイルする。

$ rbenv install 2.0.0-p195

そのままだと、 configure で失敗する。

/tmp/ruby-build.20130617231646.39014/yaml-0.1.4 /tmp/ruby-build.20130617231646.39014 ~
/home/machu-test/.rbenv/plugins/ruby-build/bin/ruby-build: ./configure: /bin/sh: bad interpreter: Permission denied

./configure が失敗するのは、 /tmp (/var/tmp) が noexec に設定されているため。

$ cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0p2              none            swap    sw              0       0
/dev/ad0p3              /               ufs     rw,acls         1       1
/dev/ad0p4              /usr            ufs     rw,acls         2       2
/dev/ad0p5              /var            ufs     rw,userquota,noexec,nosuid              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
/dev/ad1                /home           ufs     rw,userquota,acls,nosuid                2       2

環境変数 TMPDIR をホームディレクトリ以下に設定すればよい。あわせて、 gmake を使うように環境変数 MAKE も設定しておく(でないと、ビルドに失敗する)。 .bashrc に追記する。

export TMPDIR=$HOME/tmp
export MAKE=gmake

これで、 Ruby 2.0 がインストールできた。

$ rbenv install 2.0.0-p195
$ rbenv global 2.0.0-p195
$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-freebsd8.1] 

tDiary のインストール

git を使って、開発版の tDiary をダウンロード。

$ cd ~/www
$ git clone https://github.com/tdiary/tdiary-core.git
$ mv tdiary-core diary
$ cd diary
$ mv index.rb index.cgi
$ mv update.rb update.cgi

最新の tDiary は、関連パッケージを外部ライブラリ (RubyGems) として取得するようになっている。ライブラリの管理で bundler が必要なので、インストールしておく。 bundle install コマンドで、外部ライブラリ (HikiDocなど) をインストールする。なお、リリース版のパッケージでは外部ライブラリを同梱して配布する予定なので、この作業は不要。

$ gem install bundler
$ rbenv rehash
$ bundle install --gemfile Gemfile.cgi

あとはいつもどおり、 .htaccess や .htpasswd や tdiary.conf を設定すればおしまい。

まとめ

レンタルサーバのCGIでも、最新版の Ruby と tDiary を普通に動かすことができる。ポイントは3つかな。

  • Rubyは rbenv を使ってインストールする
  • /tmp ではなく $HOME/tmp を使う
  • make ではなく gmake を使う

レンタルサーバの利用者がそれぞれ Ruby 2.0 をコンパイルするのは無駄なので、さくらのレンタルサーバ標準で使えるようにしてほしいところ。

関連する日記