- 公開日:2016年05月27日
記事概要
APIサービスをRailsでなく、GoLangで作ることを検証しました。
その検証内容をまとめた記事です。
環境
- Centos6.5
- Go 1.6.2
- Nginx 1.8.1
初めに
スマートフォンアプリ用のAPIサービスをRailsでなく、GoLangで作るかどうかを検証しました。
以下が、最低限必要な検証項目です。
- centos6.5にgolangをインストール(済)
- golangでサーバーを動かす。
- nginx経由でgolangサーバーにアクセスする。
- golangでAPIを叩いてjsonを返却する
- mysqlに接続する。
- ログを吐き出す。
今回は、言語仕様や文法の基礎的なことは、学習しません。
長く使えそうな言語ならやっていきます。
ダメな場合の候補は、Rails, Spring, djangoです。
前回の記事で「centos6.5にgolangをインストール」したので、今回はgolangでサーバーを動かし、nginx経由でgolangサーバーにアクセスします。
golangをサーバーで動かす
Go言語をWebサーバーで動かすには、2種類の方法があります。
- GoでWebサーバーを動かす
- ApacheやNginxなどのWebサーバーで、FastCGIとしてGoを動かす
今回は、後者の「Webサーバーで、FastCGIとしてGoを動かす」方法を選択します。
php, ruby, python等のWEBサーバーと同じような仕組みにします。
GolangのWebサーバー
まずは、GolangでWebサーバーを動かします。
以下のようにWebサーバーのコードを実装します。
package main import ( "fmt" "net/http" ) func viewHandler(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "<h1>%s</h1><div>%s</div>", "title", "aaaaaaaa") } func main() { http.HandleFunc("/", viewHandler) http.ListenAndServe(":8190", nil) }
Golangを実行します。
go run sample.go
ブラウザでhttp://localhost:8190/にアクセスします。
画面が表示されました。
Nginx経由でGolangサーバーにアクセス
次にNginx経由で、GolangのWebサーバーにアクセスします。
まずはNginxのアプリの設定を変更します。
location / { try_files $uri $uri.html $uri/index.html @rails-unicorn; } location /golang { fastcgi_pass 127.0.0.1:8190; include fastcgi.conf; }
上記の設定をすると、domain/golangのアドレスが与えられた場合、Nginxは127.0.0.1:8190にFastCGIでリクエストします。
FastCGIは、一度起動したプログラムを一定期間、メモリ上に展開しておく仕組みです。
このサイトの説明がわかりやすいです。
Go側のコードもFastCGIを使うように修正します。GoLangには、fcgiパッケージが用意されているので、これを利用します。
package main import ( "fmt" "net" "net/http" "net/http/fcgi" ) func viewHandler(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "<h1>%s</h1><div>%s</div>", "hello", "fastCGI ") } func main() { l, err := net.Listen("tcp", "127.0.0.1:8190") if err != nil { return } http.HandleFunc("/", viewHandler) fcgi.Serve(l, nil) }
Nginxを再起動し、Goを実行します。
sudo service nginx restart go run sample.go
ブラウザでhttp://localhost/golangにアクセスします。
画面が表示されました。
UNIX socketを使う場合も同様にnetパッケージを利用します。
まとめ
GoLangでNginxの連携は、シンプルに実装可能です。
php, ruby, python等で連携の経験があるなら、特にはまることはないでしょう。
スクリプト言語の経験がある人には、とてもとっつきやすい仕組みだと思います。
以上。
0 件のコメント:
コメントを投稿