Amazon Linux 2023 + Go + Supervisor で Hello World を表示させる

EC2 Amazon Linux 2023 にて Golang をインストールして、
ブラウザに hello world を表示させるまでのメモ。

環境

  • AWS
  • EC2 Amazon Linux 2023
  • Nginx 1.24.0
  • Golang 1.23.2
  • 作業ユーザーは ec2-user
  • 管理者は root

Golang のインストール

Supervisor

Supervisor とは

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

とのこと。
Golang 等で書かれたアプリケーションを常駐化するための便利なパッケージ。
プロセス管理ツール?というもの。だと思う。

Supervisor のインストール

yum で簡単に扱えた Supervisor は dnf でインストールできない。

# supervisor がない
$ dnf search supervisor
No matches found.

Python のパッケージ管理ツールである pip からインストールするらしい。

$ sudo dnf install -y python-pip
$ pip --version
$ sudo pip install supervisor

WARNING: Running pip as the 'root' user can result in broken permissions
and conflicting behaviour with the system package manager.
It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

上記 Warning に書かれているように、
pip で扱うパッケージをスーパーユーザー(root)上でインストールすると、
他のパッケージ管理ツールとバッティングを起こし、依存関係に影響があるので推奨されていない。

が、 Supervisor の場合、
他のディレクトリの権限の関係が色々めんどくさかったのと、
作業ユーザー(ec2-user)上にインストールした場合の、
bin の場所(~/.local/bin/)が微妙だったので、
スーパーユーザー(root)上でインストールした。

$ cd

# 一度だけ行うと公式に書いてあった。
# 設定ファイルの生成
$ echo_supervisord_conf > supervisord.conf

# 移動と権限変更
$ sudo mv supervisord.conf /etc/supervisord.conf
$ sudo chown root:root /etc/supervisord.conf

# ディレクトリ生成
$ cd /etc
$ sudo mkdir supervisord.d
$ cd /var/log
$ sudo mkdir supervisor

supervisord.conf

デフォルトの値から変更、追加した点

$ sudo vi /etc/supervisord.conf

# 変更
logfile=/tmp/supervisord.log
↓
logfile=/var/log/supervisor/supervisord.log

# 追加
[include]
files = /etc/supervisord.d/*.ini

/etc/supervisord.d/your-product.ini

[program:your-product]
command=/path/to/your-product/app/main
autostart = true
startsecs = 5
user = root
redirect_stderr = true
stdout_logfile = /var/log/supervisor/your-product.log

systemd で supervisor を管理

下記のように管理するやり方。

$ sudo systemctl start xxxxx.service
$ sudo systemctl enable xxxxx.service

管理したかったけど、
時間の都合上一旦やめる。

hello world をブラウザに表示させるための準備

やること

  • Go ファイル作成
  • Nginx の設定

/path/to/your-product/app/main.go

フレームワークは Gin Gonic を使用。

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {

	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "hello world!",
		})
	})

	// r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
	r.Run(":8080")
}

/etc/nginx/conf.d/your-product.conf

必要最低限の設定。

upstream your_product {
   server localhost:8080;
}

server {
    listen       80;
    listen  [::]:80;
    # server_name  your.prod.com;
    server_name  localhost;


    root /path/to/your-product/app;

    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://your_product/;
    }

    index index.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   /usr/share/nginx/html;
    }


    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
    	deny  all;
    }
}

ビルド

$ cd /path/to/your-product/app
$ go build main.go

アプリケーションの管理

Supervisord 起動

# systemd で管理している場合
$ sudo systemctl start supervisor
$ sudo systemctl enable supervisor

# systemd で管理していない場合
$ sudo supervisord -c /etc/supervisord.conf

Supervisord 停止

# systemd で管理している場合
$ sudo systemctl stop supervisor

# systemd で管理していない場合
$ sudo supervisorctl shutdown

kill する方法 もあるらしい。

$ ps -ef | grep supervisord
これで探してもいい
$ ps -x
$ sudo kill <NUMBER>

プロダクト起動

$ sudo supervisorctl start your-product

プロダクト再起動

$ sudo supervisorctl reload your-product

プロダクト停止

$ sudo supervisorctl stop your-product

プロダクト削除

$ sudo supervisorctl rempve your-product

確認

Supervisord を起動し、supervisorctl でプロダクト起動する。
該当サーバーの IP アドレスにアクセスすると、 hello world が表示されている。と思う。