2016年5月27日金曜日

【Golang】初めてのGolang 本番への導入を検証する その2 Nginx連携

  • 公開日: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サーバーのコードを実装します。

{project_folder}/src/sample.go
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を実行します。

terminal

go run sample.go

ブラウザでhttp://localhost:8190/にアクセスします。

画面が表示されました。

Nginx経由でGolangサーバーにアクセス

次にNginx経由で、GolangのWebサーバーにアクセスします。

まずはNginxのアプリの設定を変更します。

/etc/nginx/conf.d/app.conf

    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パッケージが用意されているので、これを利用します。

{project_folder}/src/sample.go

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を実行します。

terminal

sudo service nginx restart

go run sample.go

ブラウザでhttp://localhost/golangにアクセスします。

画面が表示されました。

UNIX socketを使う場合も同様にnetパッケージを利用します。

まとめ

GoLangでNginxの連携は、シンプルに実装可能です。
php, ruby, python等で連携の経験があるなら、特にはまることはないでしょう。

スクリプト言語の経験がある人には、とてもとっつきやすい仕組みだと思います。

以上。

PICK UP オススメ書籍

運営サイト(railsで作成しています)

関連記事

参考記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

7 件のコメント:

Related Posts Plugin for WordPress, Blogger...