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 が表示されている。と思う。