iris部署需cgo_enabled=0静态编译确保无libc依赖,systemd服务须配置standardoutput/standarderror=journal、user权限及workingdirectory,反向代理由nginx处理tls与头透传,日志需自行落地。

直接打包成单个静态二进制文件,传到 Linux 服务器上就能跑,不需要装 Go 环境、不依赖 libc 动态库(除非你明确需要 cgo)、也不用管依赖包管理——这是 Iris 部署最核心的确定性。
CGO_ENABLED=0 静态编译必须关掉
Go 默认启用 cgo,会导致生成的二进制依赖系统 libc(比如 getaddrinfo DNS 解析),在 Alpine 或极简 CentOS 镜像里会报 standard_init_linux.go:228: exec user process caused: no such file or directory 这类错误。
- 生产环境强烈建议用
CGO_ENABLED=0编译,确保完全静态链接 - 如果项目用了
net.Resolver、sqlite3、或任何带 C binding 的包,就得设为1,并确认目标服务器有对应版本的glibc(例如 RHEL 7 用 glibc 2.17,不能跑在 Alpine 上) - 命令示例:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp ./main.go
systemd 服务配置要避开常见陷阱
很多人在 ExecStart 里直接写 /opt/myapp/myapp --port=8080,结果服务启动失败却看不到错误——因为 StandardOutput=journal 没配,日志全丢掉了。
- 务必加上
StandardOutput=journal和StandardError=journal,否则journalctl -u myapp查不到任何输出 -
User=www-data要提前创建,且该用户对/opt/myapp/有读+执行权限(chmod 755 /opt/myapp),不然permission denied - 别漏掉
WorkingDirectory=/opt/myapp,否则 Iris 的静态文件路径、配置文件加载可能出错
端口和反向代理不是可选项
直接让 Iris 监听 0.0.0.0:80 或 :443 是危险操作:没有 TLS 终止、没有请求限速、没有静态资源缓存、也没有 X-Forwarded-* 头透传,前端 Nginx/Caddy 一加,后端 ctx.Request().Host 就变成 localhost:8080。
- Iris 只监听内网端口(如
--port=8080),由 Nginx 做反代,配置里加proxy_set_header X-Forwarded-For $remote_addr;和proxy_set_header X-Forwarded-Proto $scheme; - 如果要用 HTTPS,证书一定配在 Nginx 层,不要让 Iris 自己 load cert —— 它不处理 SNI、OCSP stapling、TLS 1.3 优化等生产级需求
- 记得在 Nginx 里设
proxy_buffering off;如果 Iris 返回的是流式响应(比如 SSE 或大文件下载)
真正容易被忽略的点是:Iris 二进制本身不记录访问日志到文件,iris.Logger() 默认只打到 stdout;而 systemd 会截断长日志行,所以别指望靠 journalctl 看完整 JSON 格式日志——得自己接 logrus 或 zerolog 写文件,或者用 rsyslog 抓 journal 输出再落地。











