
beego 默认无法直接绑定到 80 端口(因需 root 权限),推荐使用 apache 作为反向代理:beego 仍运行于普通端口(如 8080),由 apache 监听 80 端口并转发请求,兼顾安全与灵活性。
在 Linux 系统(如 Google Compute Engine 实例)中,端口号小于 1024(包括 80)属于特权端口,普通用户进程无权直接监听。若强行以非 root 用户启动 bee run 并设置 httpport = 80,将触发 ListenAndServe: permission denied 错误。不建议通过 sudo bee run 或 sudo ./myapp 方式绕过权限限制——这会带来安全隐患(如应用代码意外获得 root 权限),且不符合生产环境最佳实践。
✅ 正确方案:Beego 独立运行 + Apache 反向代理
Beego 应用保持在非特权端口(如 8080)稳定运行,Apache 作为前置 Web 服务器监听 80(或 443),接收外部请求后透明转发至 Beego。该架构解耦清晰、便于扩展 HTTPS、负载均衡及静态资源处理。
✅ 配置步骤(Ubuntu/Debian 示例)
-
确保 Beego 应用正常运行在 8080 端口
修改 conf/app.conf:httpport = 8080 runmode = prod
构建并后台运行(避免 bee run):
go build -o myapp . nohup ./myapp > app.log 2>&1 &
-
启用 Apache 代理模块
sudo a2enmod proxy proxy_http headers sudo systemctl restart apache2
-
配置虚拟主机(如 /etc/apache2/sites-available/beego.conf)
ServerName your-domain.com ProxyPreserveHost On ProxyRequests Off # 转发所有请求到本地 Beego ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ # 可选:添加安全头 Header always set X-Frame-Options "DENY" Header always set X-Content-Type-Options "nosniff" 启用站点并重载:
sudo a2ensite beego.conf sudo systemctl reload apache2
⚠️ 注意事项
- 确保 Beego 的 app.conf 中 enablegzip = true(如需压缩)且 runmode = prod,关闭调试信息;
- 生产环境务必禁用 bee run(仅用于开发),改用 go build 后守护进程管理(如 systemd);
- 若需 HTTPS,可复用上述配置,配合 mod_ssl 和 Let’s Encrypt(certbot)自动签发证书;
- Apache 日志(/var/log/apache2/error.log)和 Beego 日志(app.log)应共同排查转发异常。
该方案既规避了特权端口权限问题,又充分利用了 Apache 的成熟生态,是 Beego 生产部署的推荐模式。
