Windows 上的 Go:一个二进制、一个服务、一个反代
把 Go HTTP 服务做成 Windows 服务,用环境变量传配置,优雅关闭,并安全反代。
测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1- 版本号
- 26100.33650
- 版本
- Standard / Datacenter
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 任务
Go 服务就是一个 .exe,服务器不用装 runtime:
go build -trimpath -ldflags="-s -w" -o C:\apps\api\api.exe .\cmd\api用 WinSW/NSSM 做成 Windows 服务,让 IIS/Nginx 占 443。
为目标平台构建
Section titled “为目标平台构建”$env:GOOS='windows'; $env:GOARCH='amd64'go build -trimpath -ldflags="-s -w" -o C:\build\api.exe .\cmd\api按目标架构构建;不要发错 OS/arch 的二进制。-trimpath 去本地路径,-s -w 去符号(需要栈追踪就留 debug 构建)。
WinSW:
<service> <id>api</id> <executable>C:\apps\api\api.exe</executable> <workingdirectory>C:\apps\api</workingdirectory> <env name="APP_ENV" value="production"/> <env name="LISTEN_ADDR" value="127.0.0.1:8080"/> <logpath>C:\logs\api</logpath> <onfailure action="restart" delay="10 sec"/></service>应用从环境变量或 exe 旁边配置文件读 LISTEN_ADDR/配置。不要把生产密钥硬编码进二进制。
处理 SIGTERM/控制台关闭,调用带超时的 server.Shutdown(ctx)。Windows 服务停止会发控制事件;忽略它的 Go 应用在服务超时后被强杀,可能丢在途请求。
location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;}Go 应用只信任来自代理的转发头。绑 localhost,不暴露 8080。
sc.exe qc apiGet-CimInstance Win32_Process -Filter "Name='api.exe'" | Select-Object ProcessId, ExecutablePath, CommandLinecurl.exe -I http://127.0.0.1:8080/healthzGet-Content C:\logs\api\api.err.log -Tail 50查二进制路径、健康端点、日志。代理 502 通常是没有监听。
E1。实验室没有构建/运行 Go 服务;命令是 Server 2025 上待验证的部署模式。