go - 为什么systemd无法启动golang web app,没有答案

标签 go deployment supervisord systemd

我的 golang web 应用程序在使用 systemd 时无法启动,但在手动启动时可以正常运行。我的 systemd 配置有什么问题?

goweb.service

$ cat goweb.service 
[Unit]
Description=Backend service
After=network.target

[Service]
User=myapp
Group=myapp
Restart=on-failure
ExecStart=/u01/backend

[Install]
WantedBy=multi-user.target

backend 是一个用命令编译的二进制文件:env GOOS=linux GOARCH=amd64 go build -v bitbucket.org/myapp/backend

系统服务状态

$ sudo service goweb status
Redirecting to /bin/systemctl status  goweb.service
● goweb.service - Backend service
   Loaded: loaded (/usr/lib/systemd/system/goweb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 18 10:55:56 instance-1 systemd[1]: Started Backend service.
May 18 10:55:56 instance-1 systemd[1]: Starting Backend service...

P/S:看起来我的网络应用启动了,但随后立即停止了。

我尝试配置 Type=forking,然后服务状态显示如下。有人可以解释为什么日志 Started Backend service.Starting Backend service... 顺序颠倒了。

$ sudo service goweb status
Redirecting to /bin/systemctl status  goweb.service
● goweb.service - Backend service
   Loaded: loaded (/usr/lib/systemd/system/goweb.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2016-05-18 11:06:02 UTC; 2s ago
  Process: 25847 ExecStart=/u01/backend (code=exited, status=0/SUCCESS)

May 18 11:06:02 instance-1 systemd[1]: Starting Backend service...
May 18 11:06:02 instance-1 systemd[1]: Started Backend service.

我(从终端)手动运行网络应用程序时的结果:

$ /u01/backend
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /upload                   --> main.uploadFileHandler (3 handlers)
[GIN-debug] Environment variable PORT="9005"
[GIN-debug] Listening and serving HTTP on :9005

更新:

  1. 我试试supervisord它工作正常(相同的二进制文件)
  2. 使用 systemd,我将服务配置更改为 Restart=alwaysRestartSec=15systemd 不断重启我的网络应用。

有谁知道为什么 supervisord 工作正常但 systemd 不行?我认为 systemd 可以很好地完成这样的基本任务!

最佳答案

我会大胆猜测您的应用程序会在端口 80 和/或 443 上监听,因此最好的办法是对其使用 setcap 以授予其权限。

示例:sudo setcap 'cap_net_bind_service=+ep'/u01/backend,每次编译应用时都需要执行此操作。

关于go - 为什么systemd无法启动golang web app,没有答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297714/

相关文章:

django - 带有主管的环境变量

celery - 错误 : Unable to load celery application. 找不到模块主模块。主管+ celery

go - 使用 Go 的 socket.io 客户端

pointers - 指向 Golang 中的结构

iphone - 如何发布应用程序进行测试

css - Vuetify 部署后无法正常显示

Django Apache Hello World

go - Golang中的Web应用程序供离线/浏览器使用

Golang - slice 追加(需要时)不起作用

python - 故意将 flask 放下