Goバイナリサービス
コンパイル済みGoバイナリをsystemdサービスとしてデプロイします。静的バイナリの利点、高同時接続サーバーのファイルディスクリプタ制限、ハードニングオプションについて解説します。
Application Services
詳細な説明
systemdでGoアプリケーションをデプロイする
Goアプリケーションは静的バイナリにコンパイルされるため、systemdデプロイに最適です。インストールするランタイムも、管理する仮想環境も、デプロイ時の依存関係解決もありません。
[Unit]
Description=Go API Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapi
Restart=always
RestartSec=3
User=apiuser
Group=apiuser
WorkingDirectory=/opt/myapi
Environment="GIN_MODE=release"
Environment="PORT=8080"
LimitNOFILE=65535
StandardOutput=journal
StandardError=journal
# ハードニング
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/opt/myapi/data
[Install]
WantedBy=multi-user.target
Goバイナリがsystemdに最適な理由
- シングルファイルデプロイ: バイナリをコピーし、ユニットファイルを作成するだけ
- ランタイム依存なし: JVM、Pythonインタプリタ、Node.jsが不要
- 高速起動: Goバイナリはミリ秒で起動
- 静的リンク: すべての依存関係がバイナリにコンパイル
- シグナル処理: Goは
os.Signalによる正常シャットダウンをビルトインサポート
セキュリティハードニング
ハードニングディレクティブはサービスができることを制限します:
NoNewPrivileges=yes: setuid/setgidバイナリによる追加権限の取得を防止ProtectSystem=strict: ファイルシステム全体を読み取り専用としてマウントProtectHome=yes:/home、/root、/run/userをアクセス不可にReadWritePaths=: 特定のディレクトリへの書き込みアクセスを明示的に許可
ユースケース
多数の同時接続を処理し、高速再起動が必要で、セキュリティハードニングにより最小限のシステム権限で実行すべき高性能Go APIサーバーをデプロイする場合に使用します。