Go言語フレームワークRevelをCentOSで動作させる

はじめまして、運動担当の小泉です。平成生まれです。若いです。彼女います。
週末はフットサル、ランニングしてます。
今は人間ドック予約サイトの開発をしており、主にPHPを使っています。

先日、dots summitに参加し、Go言語の注目度の高さに衝撃を受けました。
PHP以外の言語でもWebサービスを作ってみたいと思っていたタイミングなので、Goで書けるWebフレームワークを探してみたところ、「Revel」に出会いました。今回はほんの入り口のみの情報になりますが、紹介させて頂きます。

Goのフレームワークはほかにも「goji(https://goji.io/)」や「martini(https://github.com/go-martini/martini)」がありますが、どちらも用意されている機能が少なく、扱い辛そうでしたので、Revelを選びました。ちなみに、Gunocyは「kami(https://github.com/guregu/kami)」という独自のフレームワークで書かれていて、kamiはgojiをもとに作っているそうです。

Revelについて

Goで書かれた機能豊富な(いわゆるフルスタック系の)MVCフレームワークで、以下サイトにて、ベンチマークがかなり良いという結果が出ています。
http://www.techempower.com/benchmarks/#section=data-r9&hw=ec2&test=query&c=1

Revel公式サイト
http://revel.github.io/index.html

公式サイトにも
「Revel builds on top of the Go HTTP server, which was recently benchmarked to serve three to ten times as many requests as Rails across a variety of loads.」
とあるように、Railsの3~10倍の負荷を処理できると宣言しています。

Revelサンプルアプリ

意外にもLinux環境での情報が少なかったため、環境はEC2でCentOS7にしました。
環境の構築手順はここでは省略しますが、wgetコマンドがインストールされていることを前提として進みます。

1.Goインストール

$ sudo wget https://golang.org/dl/go1.4.2.linux-amd64.tar.gz
$ cd go1.4.2.linux-amd64.tar.gz
$ sudo tar -c /usr/local/ -xzf go1.4.2.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin ※~/.bash_profileに追記

2.Revelインストール

2-1.GOPATH指定

GOPATHに関しては任意の場所を設定してください。

$ mkdir ~/gocode
$ export GOPATH=~/gocode  ※~/.bash_profileに追記
2-2.Git&Marcurialインストール

githubからgo getで取ってくるために必要なようです。

$ sudo yum -y install git
$ sudo yum -y install '*mercurial*'
2-3.Revel本体インストール
$ go get github.com/revel/revel
※~/gocode以下にインストールされます  
2-4.Revelコマンドインストール
$ go get github.com/revel/cmd/revel
$ export PATH="$PATH:$GOPATH/bin" ※~/.bash_profileに追記  
2-5.確認

revelコマンドが使えるようになっていれば、インストール完了!

$ revel
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]

The commands are:

 new create a skeleton Revel application
 run run a Revel application
 build build a Revel application (e.g. for deployment)
 package package a Revel application (e.g. for deployment)
 clean clean a Revel application's temp files
 test run all tests from the command-line

Use "revel help [command]" for more information.

3.アプリひな形作成&起動

3-1.revel new
$ revel new sampleapp
~
~ revel! http://revel.github.io
~
Your application is ready:
   /home/koizumi/gocode/src/sampleapp

You can run it with:
   revel run sampleapp
3-2.revel run
$ revel run sampleapp
~
~ revel! http://revel.github.io
~
INFO 2015/03/23 21:24:03 revel.go:326: Loaded module testrunner
INFO 2015/03/23 21:24:03 revel.go:326: Loaded module static
INFO 2015/03/23 21:24:03 run.go:57: Running sampleapp(sampleapp) in dev mode
INFO 2015/03/23 21:24:03 harness.go:165: Listening on :9000

4.EC2アクセス&アプリ表示

Revelはデフォルト9000番ポートで動作しますので、アクセス先URLは「EC2 Public DNS:9000」になります。 正常に起動していれば、以下の画面のように「It Works !」と表示されます。 この画面はRailsとかCakePHPでデフォルト表示される画面みたいなものです。
※EC2のSecurity Group設定でinboudにTCP9000番を許可していないとハマります。

f:id:y_koizumi:20150324105227p:plain

HTTPポート80番にアクセスしてアプリを表示するには、$GOPATH/src/sampleapp/conf/app.confに「http.port = 80」と記述し、root権限で動かせば動作しますが、今回は脆弱性対策などもしておらず、root権限で動かすのはセキュリティ上問題があるため、以下のコマンドにより、iptablesフォワーディングをする方法をとります。

$ sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 9000

これで、「:9000」を記述しなくても、「It Works!」が表示されます。

個人的な感想としては、githubから取ってきたソースの中にSampleアプリが含まれていて、フレームワークの挙動は勉強しやすいと思いました。
速度などはある程度の規模のWebサービス作って運用してみないとわからない部分があり、何ともいえませんので、Revelで何か作ってみようと思います。

今回は以上になります。

[参考サイト]

http://revel.github.io/index.html

http://golang.jp/