Tech Blog - mixross

Goで作ったAPIのNginx連携とSystemd管理

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

環境

  • 開発:Mac
  • サーバ:CentOS7

GoでAPI

今回の本質じゃないのでサンプルとしてミニマム実装

main.go
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の設定などは割愛。

/etc/nginx/conf.d/xxxx.conf
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ファイルを作成する。

/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
RSS