golang - Go言語でWebAppの開発に必要なN個のこと - Qiita [キータ]
http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies アプリケーションサーバ 標準パッケージの ne...
http://qiita.com/tenntenn/items/b8b27e32c28f7569f41a
tenntenn さんに開発版を書いて貰ったので運用編を書こうかと思った。
なお、以下のプロダクトは全て golang で書かれているが、ruby や perl のアプリケーションを運用する際にも使える。
リバースプロキシ
まずはリバースプロキシ。フロントは nginx にしてパスによりアプリを切り分ける。(別に直でもいいけど)
mattn/gorem - GitHub
https://github.com/mattn/gorem
ゴーレムと読みます。インストールは以下の様にして行う。
$ go get github.com/mattn/gorem
設定ファイルは以下の様に config.json を用意する。
{
"mattn": {
"address": "127.0.0.1:11006",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10086" },
{ "path": "/app2/", "backend": "http://localhost:10087" },
{ "path": "/", "backend": "/home/mattn/tmp/blog/_site" }
]
}
}
127.0.0.1:11006
がサーバのポート。これにより
/app1/
へのリクエストが
http://localhost:10086/
へ
/app2/
へのリクエストが
http://localhost:10087/
へ転送される。
/
へのリクエストは、生成した静的コンテンツ(ここでは jekyll で生成したファイル)を指す。
なお、gorem は
/app1/foo
というリクエストを
http://localhost:10086/app1/foo
ではなく
http://localhost:10086/foo
に転送するので、もし
http://localhost:10086/app1/foo
に転送したい場合は
{
"mattn": {
"address": "127.0.0.1:11006",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10086", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10087" },
{ "path": "/", "backend": "/home/mattn/tmp/blog/_site" }
]
}
}
の様に
use_path
を指定する。また CGI が使いたい場合は
{
"mattn": {
"address": "127.0.0.1:11006",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10086", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10087/foo.cgi", "cgi": true },
{ "path": "/", "backend": "/home/mattn/tmp/blog/_site" }
]
}
}
の様に
cgi
設定する。設定は複数記述する事ができ
{
"mattn": {
"address": "127.0.0.1:11006",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10086", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10087/foo.cgi", "cgi": true },
{ "path": "/", "backend": "/home/mattn/tmp/blog/_site" }
]
},
"thinca": {
"address": "127.0.0.1:11008",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10088", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10089/foo.cgi", "cgi": true },
{ "path": "/", "backend": "/home/thinca/tmp/blog/_site" }
]
}
}
の様にも書ける。動作させたまま設定を読み込みなおす場合は、gorem のプロセスに SIGHUP を送る。
$ kill -HUP 12345
上記の設定で thinca だけ再読み込みしたい場合は
{
"mattn": {
"address": "127.0.0.1:11006",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10086", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10087/foo.cgi", "cgi": true },
{ "path": "/", "backend": "/home/mattn/tmp/blog/_site" }
]
"flagfile": "/tmp/gorem.mattn"
},
"thinca": {
"address": "127.0.0.1:11008",
"entries": [
{ "path": "/app1/", "backend": "http://localhost:10088", "use_path": true },
{ "path": "/app2/", "backend": "http://localhost:10089/foo.cgi", "cgi": true },
{ "path": "/", "backend": "/home/thinca/tmp/blog/_site" }
],
"flagfile": "/tmp/gorem.thinca"
}
}
の様に設定しておき
$ touch /tmp/gorem.thinca
とすれば thinca だけ再読込される。
プロセスマネージャ
ruby に foreman というツールがある。Procfile で指定したプロセス情報と .env という環境変数情報を参照してプロセスを起動する。
しかし軽量ではない。そこで私は goreman というツールを使っている。
mattn/goreman - GitHub
https://github.com/mattn/goreman
インストールは以下の様にして行う。
$ go get github.com/mattn/goreman
Procfile の書き方は foreman と同じ。
gorem: /home/mattn/dev/gorem/gorem -c /home/mattn/dev/gorem/config.json
my_app1: ruby /home/mattn/dev/my_app1/web.rb
my_app2: ruby /home/mattn/dev/my_app2/web.rb
ここで先ほどの gorem も一緒に起動しておく。例えば上記の gorem の設定だと /app1 を my_app1 に、/app2 を my_app2 に振り分ける。
起動は Procfile のあるディレクトリで
$ goreman start
とすればいい。単独で起動停止したい場合は別の端末で
$ goreman run stop my_app2
$ goreman run start my_app2
$ goreman run restart my_app2
とする。内部で RPC を使っているがポートを変えたい場合は環境変数 GOREMAN_RPC_PORT で変更する。
memcached 等も一緒に起動しておくと良い。
Github インテグレーション
github に push したら勝手にデプロイして欲しい。
mattn/gost - GitHub
https://github.com/mattn/gost
インストールは以下の様にして行う。
$ go get github.com/mattn/gost
起動は goreman の Procfile に含めて起動しておく。
gorem: /home/mattn/dev/gorem/gorem -c /home/mattn/dev/gorem/config.json
my_app1: ruby /home/mattn/dev/my_app1/web.rb
my_app2: ruby /home/mattn/dev/my_app2/web.rb
gost: /home/mattn/dev/gorem/gost -c /home/mattn/dev/gost/config.json
また外部からのアクセスに対してリバースプロキシ経由でアクセスされる様に gorem の設定にも追加する。
{ "path": "/deploy/", "backend": "http://localhost:11613" },
※設定は一部
gost の設定ファイルは以下の様に記述する。
{
"addr": "127.0.0.1:11613",
"apps": {
"wikipedia-lingrbot": {
"proc": "wikipedia_bot",
"path": "/home/mattn/dev/wikipedia_bot/",
"build_command": "go build",
"test_command": "go test"
},
"momochan": {
"proc": "momochan",
"path": "/home/mattn/dev/momochan/"
}
}
}
あとは github の Web hook を上記の
/deploy/
に仕向けて完成。
gost は Web hook のペイロードを受け取ると goreman に対して停止、
git pull
、起動を行う。もしビルドが必要であれば上記の様に
build_command
を指定する。その他
test_command
、
release_command
もある。
上記の
wikipedia-lingrbot
は github のリポジトリ名、proc で指定する
wikipedia_bot
は goreman の Procfile に書いた proc 名となる。 path はそのリポジトリがあるローカルパスを指定し、そこで
git pull
が行われる。なお git clone 時に
git@github.com
で clone してると認証が必要になるので https://github.com/ で始まる URL で clone しておく事。