Tech Blog - mixross
環境
- 開発:Mac
- サーバ:CentOS7
GoでAPI
今回の本質じゃないのでサンプルとしてミニマム実装
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
log.Println("start api server")
http.HandleFunc("/", handleIndex)
http.ListenAndServe(":8080", nil)
}
func handleIndex(w http.ResponseWriter, r *http.Request) {
log.Println("index is called", r.Method, r.URL)
fmt.Fprintf(w, "Hello API")
}
Goアプリのビルド
Linux(64bit CentOS)用にビルド
GOOS=linux GOARCH=amd64 go build -o goapi
Nginxのconfig
ポート8080で待ち受ける設定になっているGoアプリケーションに http://goapi.mixross.jp でアクセスするとした場合、以下のようなserverディレクティブをNginxのconfigに設定する。
ログやSSLの設定などは割愛。
server {
listen 80;
server_name goapi.mixross.jp;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
Nginxを再起動
$ systemctl restart nginx
Goアプリを手動実行(疎通確認)
ここで作成したgoapiファイルをサーバにアップしてコマンドで実行する。
$ ./goapi
2020/05/16 13:29:56 start api server
ローカルで下のコマンドを打って
$ curl http://goapi.mixross.jp
「Hello API」が返ってきたら成功
サーバ側のターミナルにはAPIが呼ばれたログが1行増えているはず
$ ./goapi
2020/05/16 13:29:56 start api server
2020/05/16 13:34:07 index is called GET /
これでNginxによるプロキシの設定は確認できたので、Ctrl + C でgoapiを停止する。
SystemdのUnitファイル作成
goapiをSystemdで管理するための準備をしていく。
まず、goapiファイルを /usr/local/bin に配置する。(ここでなくてはいけないということではないが、違う場所にする場合には続いて作成するUnitファイルのパスを読み替える)
/etc/systemd/system に以下の内容でgoapi.serviceファイルを作成する。
[Unit]
Description = goapi.mixross.jp
[Service]
ExecStart = /usr/local/bin/goapi
ExecStop = /bin/kill -SIGTERM $MAINPID
ExecReload = /bin/kill -SIGTERM $MAINPID && /usr/local/bin/goapi
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
Unitがインストールされていることを確認
$ systemctl list-unit-files | grep goapi
goapi.service disabled
Unitの有効化
有効化するとシステム起動時に立ち上がるサービスとして登録される
$ systemctl enable goapi
Created symlink from /etc/systemd/system/multi-user.target.wants/goapi.service to /etc/systemd/system/goapi.service.
再度systemctl list-unit-filesで確認するとenabledに変更されている。
$ systemctl list-unit-files | grep goapi
goapi.service enabled
起動
$ systemctl start goapi.service
正常に起動できているか確認
$ systemctl status goapi.service
$ sudo systemctl status goapi.service
● goapi.service - goapi.mixross.jp
Loaded: loaded (/etc/systemd/system/goapi.service; enabled; vendor preset: disabled)
Active: active (running) since 土 2020-05-16 23:41:06 JST; 1min 6s ago
Main PID: 21253 (goapi)
CGroup: /system.slice/goapi.service
└─21253 /usr/local/bin/goapi
5月 16 23:41:06 tcw-web systemd[1]: Started goapi.mixross.jp.
5月 16 23:41:06 tcw-web goapi[21253]: 2020/05/16 23:41:06 start api server
Activeが「active (running)」となっているので正常に動いていることが分かる。
また、最後にログが表示され、これでも確認できる。
さっきと同様にAPIを呼び出して
$ curl http://goapi.mixross.jp
「Hello API」が返ってきたら成功
ログ確認
$ journalctl -u goapi
-- Logs begin at 土 2020-05-09 04:11:01 JST, end at 土 2020-05-16 23:45:25 JST. --
5月 16 23:41:06 tcw-web systemd[1]: Started goapi.mixross.jp.
5月 16 23:41:06 tcw-web goapi[21253]: 2020/05/16 23:41:06 start api server
5月 16 23:44:14 tcw-web goapi[21253]: 2020/05/16 23:44:14 index is called GET /
直近の特定行数のみ表示する時は
$ journalctl -u goapi -n 100
tail -f のように監視したい時は
$ journalctl -u goapi -f
その他
Unitファイルを修正
修正後に以下のコマンドを叩くことで反映される
$ systemctl daemon-reload
サービス停止
$ systemctl stop goapi
サービス再起動
$ systemctl restart goapi
サービス自動起動無効化
$ systemctl disable goapi
サービス自動起動設定確認
$ systemctl is-enabled goapi