
go 程序无法直接在同一服务器上多个进程同时监听 80 端口,需借助反向代理(如 nginx)按 host 头将不同域名请求分发至本地不同端口的 go 服务。本文详解配置步骤、go 服务示例及关键注意事项。
go 程序无法直接在同一服务器上多个进程同时监听 80 端口,需借助反向代理(如 nginx)按 host 头将不同域名请求分发至本地不同端口的 go 服务。本文详解配置步骤、go 服务示例及关键注意事项。
在生产环境中,单台服务器托管多个域名(如 www.domain1.com 和 www.domain2.com)并分别由独立的 Go 应用处理,是常见需求。但 Go 程序本身不能共享同一端口(如 80)——操作系统禁止多个进程绑定相同 IP+端口组合。因此,必须引入反向代理层作为统一入口,依据 HTTP 请求头中的 Host 字段进行路由分发。
✅ 推荐架构:Nginx + 多端口 Go 服务
Nginx 作为轻量、高性能的反向代理,监听 80(和 443)端口,接收所有入站请求,并根据 server_name 指令精准匹配域名,再将流量转发至本机不同端口上运行的 Go 服务。
▶ 示例 Nginx 配置(/etc/nginx/sites-enabled/multi-domain)
# 域名1:www.domain1.com → 转发至 localhost:8080
server {
listen 80;
server_name www.domain1.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600;
proxy_connect_timeout 60;
}
}
# 域名2:www.domain2.com → 转发至 localhost:8081
server {
listen 80;
server_name www.domain2.com;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 600;
proxy_connect_timeout 60;
}
}✅ 配置后执行
sudo nginx -t && sudo systemctl reload nginx生效。
▶ 对应 Go 服务示例(domain1.go)
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from domain1.com! Path: %s", r.URL.Path)
}
func main() {
http.HandleFunc("/", handler)
log.Println("Domain1 service listening on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}▶ 同理,domain2.go 监听 :8081:
// ... 类似逻辑,仅端口改为 8081
log.Fatal(http.ListenAndServe(":8081", nil))⚠ 关键注意事项
- 端口隔离:每个 Go 服务必须监听不同本地端口(如 8080、8081、8082…),避免端口冲突;
-
Host 头透传:务必设置
proxy_set_header Host $host;,确保 Go 服务能正确获取原始域名(例如用于生成绝对 URL 或多租户识别); -
安全与超时:
proxy_read_timeout和proxy_connect_timeout应根据业务调整,防止长连接阻塞; -
HTTPS 支持:若启用 HTTPS,Nginx 需配置 SSL 证书,并添加
listen 443 ssl;及ssl_certificate指令;Go 后端仍可保持 HTTP 内网通信(更高效); - 健康检查与负载均衡(进阶):Nginx 还可集成 upstream 组、健康探测、限流等能力,提升多域名服务的健壮性。
通过该方案,你既能保持各 Go 服务完全解耦、独立部署与升级,又能实现专业级的多域名路由,兼顾灵活性与生产可用性。


















