VMWare Playerでプロキシ経由のRubyOnRails環境構築
Ruby on Railsの試験環境をVMWare Playerで作っていて、プロキシ周りでいろいろと躓いたので、備忘録に残しておきます。
●やりたいこと
・GETリクエストで適当なパラメータを投げたら、それに応じた内容のHTMLを返すこと
・投げたパラメータによって、タイムアウトを起こしたり、任意のHTTPステータスコードを返すようにすること
●VMWare OS環境の準備: CentOS6.7
・VMWare PlayerにNAT設定でCentOS6.7がすでにインストールされているものとします。
※VMWarePlayerのNAT設定は、C:\users\all users\vmware\vmnetnat.cnfに記述します。
(例)22番のSSHポートをホストPCの8822に、80番のhttpポートをホストPCの8880ポートにマッピングする場合・・・
8822 = 192.168.58.129:22
8880 = 192.168.58.129:80
反映するためにおそらくPCの再起動が必要です。
●rubyのインストール
・必要なパッケージのインストール
yum -y install readline-devel git gcc zlib zlib-devel openssl openssl-devel sqlite sqlite-devel libffi-devel readline gcc-c++ glibc-headers libyaml-devel
・rbenvインストールに必要なプロキシ設定
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080
・rbenv をインストール(clone)する
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
・PATH に追加
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
・.bash_profile に追加
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
・環境変数を有効化
exec $SHELL -l
・rbenvのバージョン確認
rbenv --version
rbenv 0.4.0-74-g95a039a
・ruby-build を インストール(clone)する
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
・プロキシ設定
echo 'proxy = "https://proxy.hogehoge.net:8080/"' >> ~/.curlrc
echo 'http_proxy = http://proxy.hogehoge.net:8080/' >> /etc/wgetrc
・ruby-buildのプロキシ設定
vi /root/.rbenv/plugins/ruby-build/bin/ruby-build
http_head_curl() {
curl -qsILf "$1" >&4 2>&1
}
http_get_curl() {
curl -q -o "${2:--}" -sSLf "$1"
※これらの-qオプションを取り除く
・ruby の最新版を確認
rbenv install --list
このように表示される。
Available versions:
1.8.6-p383
1.8.6-p420
1.8.7-p249
:
:
2.0.0-p195
2.0.0-p247
2.0.0-p353 ← こいつが2.0系の最新版っぽい
2.0.0-preview1
:
・ruby のインストール
rbenv install -v 2.3.0
・再読み込み
rbenv rehash
・rubyバージョンを確定
rbenv global 2.3.0
・バージョンの確認
ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
・テスト用rubyで動作確認
こんな内容でhello.rbを作って動かしてみる。
puts 'Hello, world!'
ruby hello.rb
→Hello, world! と表示されればOK。
●Railsのインストール
gem update --system
gem install --no-ri --no-rdoc rails
gem install bundler
rbenv rehash
・インストールバージョンの確認
rails -v
Rails 4.2.6
●Railsアプリケーション作成
・アプリケーションを配置するディレクトリに移動
cd /root/pgm/ruby/testRails
・アプリケーション作成
rails new アプリケーション名(ここではtestRails)
cd testRails
●WEBricks起動
ここではApacheではなく、Railsに含まれている簡易WebサーバWEBricksを使います。
gem install uglifier
vi Gemfile
gem 'therubyracer', platforms: :ruby ←コメントを外す
bundle install
・WEBRicks起動
rails server -p 80 -b 192.168.58.129 ←明示的にIP指定しないとだめです。
=> Booting WEBrick
=> Rails 4.2.6 application starting in development on http://192.168.58.129:80
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-04-13 03:42:06] INFO WEBrick 1.3.1
[2016-04-13 03:42:06] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-04-13 03:42:06] INFO WEBrick::HTTPServer#start: pid=70530 port=80
・試しにアクセスしましょう。
http://ホストPCのIP:8880/
アクセスすると、RubyOnRailsのトップページが出ます。
About your application’s environment をクリックすると、インストール環境の情報が見れます。
●静的コンテンツ
rubyアプリケーションディレクトリのpublicの下に置くと、静的コンテンツとして閲覧可能となります。
/root/pgm/ruby/testRails/public
ログ・・・/root/pgm/ruby/testRails/log/development.log
DB・・・/root/pgm/ruby/testRails/db
※RailsでDBを使う場合は、デフォルトはここにSQLiteが配置されます。
●コントローラ作成
rails generate controller testRails
(Railsアプリケーションのルート)/app/controllers/testRails_controller.rbがコントローラ本体に関する記述がされたファイルです。
ここにメソッドを記述していきます。
def launch
arg = params[:rocket]
if arg == "apollo"
render "testRails/apollo"
elsif arg == "shuttle"
sleep(10) ←タイムアウトをシミュレーションする場合
render "testRails/SpaceShuttle"
else
render "testRails/h2a", status: 500 ←ステータスコードを任意のものにする場合
end
end
●ルーティング作成
呼び出しとアクションの紐づけを行います。
(Railsアプリケーションのルート)/config/routes.rb
編集します。下の内容の場合、http://ホスト名/rocket にアクセスすると先ほど作成したlaunchメソッドを動かします。
get 'rocket' => 'testRails#launch'
・WEBRicks起動(※停止するときにはCtrl-Cです)
rails server -p 80 -b 192.168.58.129
もしエラーが出たらrake routes でチェックします。
rake routes
ArgumentError: You should not use the `match` method in your router without specifying an HTTP method.
●ビューテンプレートの作成
(Railsアプリケーションのルート)/app/views/testRails
ここにxxx.html.erbファイルを作っていきます。
testRails_controller.rbで"testRails/apollo"と記載しましたので、
apollo.html.erbで適当なHTMLテンプレート等を作成します。jsonをレスポンスとして返したいのならjsonファイルをそのまま置けばいいです。
これで、
http://ホスト名/testRails?rocket=apollo
http://ホスト名/testRails?rocket=shuttle
にアクセスすれば、それぞれ作成したViewテンプレートで表示されるはずです。
一番躓いたのは、プロキシでした。なかなか社内環境でプロキシがないところって、ないですからね。ちゃんちゃん。