systemd 启动 iris 服务需绝对路径、高位端口或反向代理、绝对化模板/静态资源路径、standardoutput=journal 等配置,否则易因路径错误、权限不足、日志丢失导致启动失败或 404。

用 systemd 启动 Iris 服务时,ExecStart 路径必须绝对化
常见错误是把 ExecStart 写成 ./myapp 或 myapp,systemd 默认工作目录不一定是你的应用目录,会导致启动失败并报 failed to start process: no such file or directory。
实操建议:
-
WorkingDirectory设为应用所在目录(如/opt/myapp),但ExecStart仍需写全路径,例如/opt/myapp/myapp --port=8080 - 确保二进制文件有可执行权限:
chmod +x /opt/myapp/myapp - 用
sudo systemctl daemon-reload刷新配置后,再sudo systemctl start myapp,否则修改无效
iris.Run() 的监听地址不能写 0.0.0.0:80 而不加 root 权限
Iris 默认调用 Go 的 http.ListenAndServe,绑定端口 需要 root。直接跑 <code>iris.Addr("0.0.0.0:80") 在非 root 用户下会 panic,错误信息类似:listen tcp :80: bind: permission denied。
实操建议:
- 开发或测试环境用
:8080、:3000等高位端口,避免权限问题 - 生产环境推荐反向代理:Nginx 监听
80/443,转发到 Iris 的127.0.0.1:8080,这样 Iris 进程无需 root - 若坚持用低端口,必须在 systemd service 文件中加
CapabilityBoundingSet=CAP_NET_BIND_SERVICE并启用ambient,但风险更高,不推荐
模板与静态文件路径在部署后容易 404
本地开发时用 ./views 或 ./assets 能跑通,但部署到 /opt/myapp 后,Iris 仍按相对路径找,找不到就返回 template not found 或静态资源 404。
实操建议:
- 模板注册时用绝对路径:
iris.HTML("/opt/myapp/views", ".html"),而非"./views" - 静态文件用
app.HandleDir("/assets", iris.Dir("/opt/myapp/assets")) - 更稳妥的做法是把路径做成配置项,通过命令行参数或环境变量传入,比如
app.Run(iris.Addr(":8080"), iris.WithConfiguration(iris.Configuration{ ... }))
日志输出没进 journal,StandardOutput 和 StandardError 必须设为 journal
很多教程漏写这一项,导致 app.Logger().Infof(...) 输出消失,systemd 里查不到任何运行痕迹,只能靠 ps aux | grep myapp 确认进程是否活着。
实操建议:
- service 文件中必须包含这两行:
StandardOutput=journalStandardError=journal - 同时在代码里开启 debug 日志:
app.Logger().SetLevel("debug"),方便排查路由注册、中间件加载等初始化问题 - 检查日志用:
sudo journalctl -u myapp -f,不是cat /var/log/syslog
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











