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

しかし、おそいな、、もっと早くできなものか、、

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が必要になる場面は多々ありそう。

github.com github.com

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世代になって全体的な使い勝手は良くなった印象。

stackoverflow.com

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

実際の動作はこちらから、

The Go Playground

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/