Go アプリのデプロイ(シングルバイナリ + Nginx)
『Go』はシングルバイナリとしてコンパイルされるため、ランタイムや依存ライブラリを別途インストールせずにサーバーへ配置するだけで動作します。クロスコンパイルで Linux 向けバイナリをローカルでビルドし、『scp』や『rsync』でサーバーに転送、systemd でサービス登録、Nginx でリバースプロキシを設定するという流れが一般的なデプロイ手順です。
構文
# -----------------------------------------------
# ローカル(Mac/Linux)でのビルド
# -----------------------------------------------
# go build -o {出力バイナリ名} {パッケージパス}
# → カレントディレクトリのGoアプリをビルドします
# 例: go build -o kiryu-api .
# GOOS=linux GOARCH=amd64 go build -o {出力バイナリ名} {パッケージパス}
# → Linux AMD64 向けにクロスコンパイルします
# → macOS や Windows の開発機から Linux サーバー用バイナリを生成できます
# 例: GOOS=linux GOARCH=amd64 go build -o kiryu-api .
# -----------------------------------------------
# バイナリのサーバーへの転送と配置
# -----------------------------------------------
# scp {バイナリ} {ユーザー}@{サーバー}:{配置先パス}
# → ローカルのバイナリをサーバーに転送します
# 例: scp kiryu-api kiryu@192.168.1.10:/usr/local/bin/kiryu-api
# chmod {パーミッション} {バイナリパス}
# → バイナリに実行権限を付与します
# 例: sudo chmod 755 /usr/local/bin/kiryu-api
# -----------------------------------------------
# systemd サービスの登録と管理
# -----------------------------------------------
# systemctl daemon-reload
# → systemd の設定を再読み込みします
# → サービスファイルを新規作成・変更した後に必ず実行します
# systemctl enable {サービス名}
# → サーバー起動時にサービスを自動起動するよう設定します
# 例: sudo systemctl enable kiryu-api
# systemctl start {サービス名}
# → サービスを即時起動します
# 例: sudo systemctl start kiryu-api
# systemctl restart {サービス名}
# → サービスを再起動します(バイナリ更新後に使用します)
# 例: sudo systemctl restart kiryu-api
# systemctl status {サービス名}
# → サービスの稼働状況とログを確認します
# 例: sudo systemctl status kiryu-api
# -----------------------------------------------
# Nginx リバースプロキシの設定反映
# -----------------------------------------------
# nginx -t
# → 設定ファイルの構文チェックを行います
# → 反映前に必ず実行して文法エラーがないか確認します
# systemctl reload nginx
# → Nginx の設定を無停止で再読み込みします
# → reload が使えない場合は restart を使用します
構文一覧
| 手順 | 説明 |
|---|---|
| ローカルビルド | go build -o kiryu-api . でバイナリを生成します。実行環境と同じ OS・アーキテクチャ向けにコンパイルされます。 |
| クロスコンパイル | GOOS=linux GOARCH=amd64 go build -o kiryu-api . で Linux AMD64 向けバイナリを生成します。Mac や Windows の開発機から直接 Linux 用バイナリを作成できます。 |
| バイナリ転送 | scp kiryu-api kiryu@サーバーIP:/usr/local/bin/kiryu-api でサーバーにコピーします。rsync を使うと差分転送できます。 |
| 実行権限の付与 | sudo chmod 755 /usr/local/bin/kiryu-api でバイナリに実行権限を付与します。 |
| systemd サービスファイルの作成 | /etc/systemd/system/kiryu-api.service にサービス定義を記述します。Restart=always でクラッシュ時の自動再起動を設定できます。 |
| 設定の再読み込み | sudo systemctl daemon-reload でサービスファイルの変更を systemd に認識させます。 |
| 自動起動の有効化 | sudo systemctl enable kiryu-api でサーバー再起動後も自動起動するよう登録します。 |
| サービスの起動 | sudo systemctl start kiryu-api でサービスを起動します。 |
| Nginx 設定の作成 | /etc/nginx/sites-available/kiryu-go.conf にリバースプロキシ設定を記述し、sites-enabled にシンボリックリンクを作成します。 |
| Nginx 構文チェック | sudo nginx -t で設定ファイルの文法を確認します。反映前に必ず実行してください。 |
| Nginx の再読み込み | sudo systemctl reload nginx で設定を無停止で反映します。 |
| 稼働確認 | sudo systemctl status kiryu-api でサービスの状態とログを確認します。curl http://localhost:8080/health でアプリの応答も検証できます。 |
使用例
/etc/systemd/system/kiryu-api.service
# ----------------------------------------------- # 桐生一馬の Go API サーバー用 systemd サービスファイル # ----------------------------------------------- [Unit] # サービスの説明を記述します Description=Kiryu API Server (Go) # ネットワークが利用可能になってから起動します After=network.target [Service] # サービスを実行するユーザー・グループを指定します # root での実行は避け、専用ユーザーを作成するのが推奨です User=kiryu Group=kiryu # バイナリの絶対パスを指定します ExecStart=/usr/local/bin/kiryu-api # 環境変数でポート番号やデータベース接続情報などを渡します Environment=PORT=8080 Environment=APP_ENV=production Environment=DB_PATH=/var/lib/kiryu-api/kiryu.db # クラッシュ時に自動再起動します Restart=always # 再起動までの待機時間(秒)を設定します RestartSec=5 # 標準出力・標準エラーをジャーナルに記録します StandardOutput=journal StandardError=journal # ワーキングディレクトリを指定します(設定ファイルの相対パス解決に使用します) WorkingDirectory=/var/lib/kiryu-api [Install] # multi-user.target(通常の起動ターゲット)で自動起動します WantedBy=multi-user.target
/etc/nginx/sites-available/kiryu-go.conf
# -----------------------------------------------
# 桐生 Go API サーバーへの Nginx リバースプロキシ設定
# -----------------------------------------------
server {
listen 80;
# 公開するドメイン名を指定します
server_name kiryu-api.example.com;
# アクセスログとエラーログをアプリ専用ファイルに出力します
access_log /var/log/nginx/kiryu-api.access.log;
error_log /var/log/nginx/kiryu-api.error.log;
location / {
# Go アプリが listen しているアドレスに転送します
proxy_pass http://127.0.0.1:8080;
# プロキシ経由でも実際のクライアント情報を Go 側で取得できるよう設定します
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# タイムアウトを設定します(デフォルト 60 秒より長い処理がある場合は調整します)
proxy_connect_timeout 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# ヘルスチェックエンドポイントのログを無効にしてアクセスログを削減します
location /health {
proxy_pass http://127.0.0.1:8080/health;
access_log off;
}
}
実行するコマンドは次の通りです。
$ # ローカルでクロスコンパイルしてサーバーに転送します
$ GOOS=linux GOARCH=amd64 go build -o kiryu-api .
$ scp kiryu-api kiryu@192.168.1.10:/usr/local/bin/kiryu-api
$ # サーバー上でデプロイ作業を行います(以降はサーバー上の操作です)
$ sudo chmod 755 /usr/local/bin/kiryu-api
$ # systemd サービスファイルを配置して設定を再読み込みします
$ sudo cp kiryu-api.service /etc/systemd/system/kiryu-api.service
$ sudo systemctl daemon-reload
$ # 自動起動を有効化してサービスを起動します
$ sudo systemctl enable kiryu-api
Created symlink /etc/systemd/system/multi-user.target.wants/kiryu-api.service → /etc/systemd/system/kiryu-api.service.
$ sudo systemctl start kiryu-api
$ # サービスの稼働状況を確認します
$ sudo systemctl status kiryu-api
● kiryu-api.service - Kiryu API Server (Go)
Loaded: loaded (/etc/systemd/system/kiryu-api.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-03-25 10:42:17 JST; 3s ago
Main PID: 12847 (kiryu-api)
Tasks: 5 (limit: 2308)
Memory: 8.2M
CPU: 12ms
CGroup: /system.slice/kiryu-api.service
└─12847 /usr/local/bin/kiryu-api
$ # Go アプリが正常に応答するか確認します
$ curl http://localhost:8080/health
{"status":"ok","server":"Kiryu API","version":"1.0.0"}
$ # Nginx の設定を反映します
$ sudo ln -s /etc/nginx/sites-available/kiryu-go.conf /etc/nginx/sites-enabled/
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl reload nginx
$ # 外部から Nginx 経由でアクセスできるか確認します
$ curl http://kiryu-api.example.com/health
{"status":"ok","server":"Kiryu API","version":"1.0.0"}
概要
『Go』アプリのデプロイは、シングルバイナリという特性を活かして「ビルド → 転送 → systemd 登録 → Nginx 設定」という4ステップで完結します。クロスコンパイルにより開発機の OS に関わらず Linux 向けバイナリを生成できるため、Docker などのコンテナ環境を用意しなくてもシンプルなデプロイが実現できます。systemd によるプロセス管理では『Restart=always』で予期せぬクラッシュからの自動復旧を設定し、『User=』で専用ユーザーを指定することで不要な権限を持たせない運用が推奨されます。Nginx のリバースプロキシを挟むことで SSL 終端・ログ集約・ロードバランシングを Nginx 側に委ね、Go アプリはビジネスロジックに集中できる構成になります。systemd サービスファイルの詳細については systemd ユニットファイル、Nginx リバースプロキシの設定については Nginx リバースプロキシ のページも参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。