SupervisorでGoをデーモン化する。CentOS/Ubuntu
GoアプリケーションをCentOS環境で、デーモン化する必要があったので、その時の作業ログ。
CentOS
$ wget https://bootstrap.pypa.io/ez_setup.py -O - | python $ easy_install --version
$ easy_install supervisor $ supervisord -v
$ echo_supervisord_conf > /etc/supervisord.conf
設定ファイルを変更
;/etc/supervisord.conf [unix_http_server] file = /tmp/supervisor.sock chmod = 0777 chown= root:root [inet_http_server] port=9001 username = admin password = yourpassword [supervisorctl] serverurl = unix:///tmp/supervisor.sock [supervisord] logfile=/var/log/supervisord/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/var/run/supervisord.pid nodaemon=true minfds=1024 minprocs=200 user=root childlogdir=/var/log/supervisord/ [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [program:app] command=/path-to-path/yourappname autostart = true startsecs = 5 user = root redirect_stderr = true stdout_logfile = /var/log/supervisord/app.log
Run
supervisord
Stop/Reload
以下のコマンドで管理モードに入る
supervisorctl reload
Ubuntu
$ sudo apt-get install supervisor
$ sudo vim /etc/supervisor/conf.d/app.conf
設定ファイルを変更
[unix_http_server] file=/var/run/supervisor.sock chmod=0700 [supervisord] logfile=/var/log/supervisor/supervisord.log pidfile=/var/run/supervisord.pid childlogdir=/var/log/supervisor [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock [include] files = /etc/supervisor/conf.d/*.conf [program:app] command=<your path> autostart=true autorestart=true startretries=10 user=root redirect_stderr=true stderr_logfile=/var/log/long.err.log stdout_logfile=/var/log/long.out.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=10
(command に指定する前にbuildしておく必要がある。)
$ sudo service supervisor restart
GAE/GO datastoreのローカル開発をしてみる。
appengine/datastoreをローカルの開発環境でテストしたいときはどうするのかなと思ったけれど、以下でOKであった。
command
goapp test ./src/<path>
source
import ( "testing" "google.golang.org/appengine" "google.golang.org/appengine/aetest" "google.golang.org/appengine/datastore" ) func TestPostCompany(t *testing.T) { inst, err := aetest.NewInstance(nil) if err != nil { t.Fatalf("Failed to create instance: %v", err) } defer inst.Close() req1, err := inst.NewRequest("GET", "/gophers", nil) if err != nil { t.Fatalf("Failed to create req1: %v", err) } c1 := appengine.NewContext(req1) var companyResponse = struct { Name, Address, Nick, Key string }{} var key *datastore.Key key, _ = datastore.DecodeKey(companyResponse.Key) var savedCompany = companyResponse datastore.Get(c1, key, &savedCompany) datastore.Delete(c1, key) }
link
Local Unit Testing for Go | App Engine standard environment for Go | Google Cloud Platform
しかし、おそいな、、もっと早くできなものか、、
GoogleAppEngineでプロジェクトを削除するには、
今のところ古いコンソール画面から確認する方法がいいみたい。 console.developers.google.com 新しいコンソールではまだ操作できないのかも、
Go言語 echo serverからtwitterクライアントのanacondaを利用する。
AppEngine上でecho serve から、twitterクライアントのanacondaを使用する時のメモ、
echo のContextからどうやって、*http.Requestを取得するのか迷ったのだけれど、以下でいけるみたい。
c.Request().(*standard.Request).Request
anacondaでapiを生成するサンプル。
c := appengine.NewContext(echo.Request().(*standard.Request).Request) api.HttpClient.Transport = &urlfetch.Transport{Context: c}
anaconda以外にも、*http.Requestが必要になる場面は多々ありそう。
Cloud SQL 第2世代に接続できない。
google app engineのcloud sql 第2世代に接続できなくて、メモ。
google app engine golang, driver: bad connection
見慣れないエラーが発生。。
regionnameを新たに設定する必要がありました。
return sql.Open("mysql", "root@cloudsql("projectid:regionname:instancename")/dbo")
ただ、cloud sql 第2世代になって全体的な使い勝手は良くなった印象。
Go言語 正規表現を使って文字数制限をかけてみる。
Go言語で文字数の制限をかけてみたサンプル。
19文字以上の文字数がある場合は、先頭から19文字までを抜き取ってみる。
もっとシンプルにできたりするのか?
package main import ( "fmt" "regexp" ) func main() { str :="Lorem Ipsum is simply dummy text of the printing and typesetting industry." if(len(str)>20){ r := regexp.MustCompile(`^(.){19}`) result := r.FindAllStringSubmatch(str, -1) fmt.Println(result[0][0]) } }
結果
Lorem Ipsum is simp
実際の動作はこちらから、
Linuxユーザーの追加 SSH公開鍵で接続する。
sshの設定、必須な割には度々忘れるのでメモをしておく。
Userの追加
sudo -s
root ユーザーになっておく。
useradd new_user passwd new_user su new_user
Keyの設置
~/.ssh/authorized_keys
ユーザーフォルダの配下にauthorized_keysを設置する。
パスワードログインの禁止
/etc/ssh/sshd_config
PasswordAuthentication no
noに変更。
# service sshd restart
serviceを再起動する。
Permission denied のエラーが発生する。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
/home/user/.ssh は 0700 /home/user/.ssh/authorized_keys は 0600
エラーが発生した場合は上記のパーミションと所有者を確認する。
chmod -R 700 <user>/.ssh/ chmod 600 <user>/.ssh/authorized_keys chown -R new_user <user>/.ssh/