maemaewaterの日記

エンジニア兼ゲーマーの人の日記です。PHP/Python/JavaScript/C#/C++などによるプログラムに関することを主に書いています。

ARMプロセッサのLinuxでRuby on Railsを動かす

f:id:maemaewater:20200910122711p:plain
Rails ARM

普段はx86-64などのCPUを使ったサーバーが多いですが、ARMプロセッサのサーバーもAWSでは選択ができるようになっています。 ARMプロセッサで動くサーバーでRailsを動かすまでの違いなどを確認するために試してみたことをまとめていきます。

基本的な環境構築の注意点

AWSを利用しますが、ここでEC2でサーバーを作成する際にOSの選択時に64ビット(x86)と64ビット(ARM)が選べるのでARMの方を今回は選びます。 ここで作成時に気を付けないといけないので東京リージョンの場合のアベイラビリティーゾーンです。将来は変わるかもしれませんがARMが使えるのはaとdの方になりますので、これ以外を選択する作成時にエラーとなってしまいます。

Railsを動かすための準備

後で必要になるビルドのツールをyumでインストールします。

sudo yum groupinstall "Development Tools"

Rubyの環境構築

Rubyは最新バージョンを使用するためrbenvを使うことにしました。HomeBrewを使用してインストールを行おうとしたところ失敗してしまうので、直接インストールします。 インストール方法はGitHubの説明を参考にしました。

github.com

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
~/.rbenv/bin/rbenv init

ビルドするためのツールのruby-buildをセットアップします。こちらに手順が書かれております。

github.com

mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

rubyをインストールします。(a1.midiumだと20分ほどであったと思います。) openssl-develをインストールしていないと最後の最後で失敗してしまいます。

sudo yum install openssl-devel
rbenv install 2.7.1

デフォルトで使用するバージョンを設定します。

rbenv global 2.7.1

Node.jsの環境構築

AWS Linuxの方でNode.jsは準備されていないようでしたのでnodebrewを通してインストールすることにしました。

GitHub - hokaccha/nodebrew: Node.js version manager

curl -L git.io/nodebrew | perl - setup
export PATH=$HOME/.nodebrew/current/bin:$PATH (.bashrcの最後に追記する)
source ~/.bashrc

nodebrew install v14.10.0でインストールを完了させたかったものの、取得されるバイナリに互換性がないようでしたのでコンパイルすることにしました。 割と時間がかかるので注意です。(a1.midiumで3時間ほど)

nodebrew compile v14.10.0
nodebrew use v14.10.0
npm install -g yarn

Railsをインストール

sudo yum install sqlite-devel (後で入れなおしますが一旦インストールします)
gem install rails

新しくアプリケーションを作成します。この時に、--skip-bundleを入れないとセグメンテーションフォルトのエラーとなってしまうため追加しています。

rails new blog --skip-bundle

ラズベリーパイでも同じようなエラーがでるようです。こちらのページがとても参考になりました。

lilac-xi.hatenablog.com

インストールされているsqlite3が古いため再度インストールします。

wget https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz
tar xvzf sqlite-autoconf-3330000.tar.gz
cd sqlite-autoconf-3330000/
./configure --prefix=/opt/sqlite/sqlite3
make
sudo make install
gem uninstall sqlite3
gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include --with-sqlite3-lib=/opt/sqlite/sqlite3/lib

これでRailsのアプリケーションを起動します。

cd blog
bin/rails server

3000ポートで受け付けているので、

curl http://localhost:3000/

にアクセスするか、ブラウザから確認する場合には別のターミナルからSSHでトンネルを作成して手元のブラウザからアクセスするのが楽かと思います。

ssh -i (鍵ファイルへのパス) -L 3000:localhost:3000 {ユーザー名}@{サーバーのIPなど}

手元のブラウザでhttp://localhost:3000を開く

まとめ

いまのところでのARM版での違いはRailsのセグメンテーションフォルトの問題、Node.jsのインストールでコンパイルが必要、Homebrewでrbenvがインストールできないというあたりなのではないでしょうか。 今後改良が進んで時間のかかるコンパイルの処理などが不要になっていくと嬉しいですね。