如何在端口80运行 Beego 应用并使用 Apache 作为反向代理

beego 默认无法直接绑定到 80 端口(因需 root 权限),推荐通过 apache 反向代理将 80 端口请求转发至 beego 的本地端口(如 8080),既安全又符合生产部署规范。

在 Linux 系统(如 Google Compute Engine 实例)中,端口号小于 1024(包括 80)属于特权端口,普通用户进程无权监听——这是内核强制的安全策略。因此,直接修改 Beego 的 conf/app.conf 中 httpport = 80 并以非 root 用户启动(如 bee run 或 ./myapp),将触发 ListenAndServe: permission denied 错误。

✅ 正确做法:保持 Beego 运行在非特权端口(如 8080),由 Apache 充当反向代理统一对外提供 80 端口服务。该方案无需提升应用权限、便于 SSL 终止、支持多站点共存,且符合云环境最佳实践。

一、配置 Beego 监听本地端口

确保 Beego 应用仅监听 127.0.0.1:8080(而非 0.0.0.0:8080),增强安全性:

# conf/app.conf
httpport = 8080
runmode = prod
autorender = false
copyrequestbody = true

构建并后台运行(禁用 bee run,改用编译后二进制):

bee build -o myapp
nohup ./myapp > app.log 2>&1 &

二、配置 Apache 反向代理

启用必要模块(Ubuntu/Debian):

sudo a2enmod proxy proxy_http proxy_balancer
sudo systemctl restart apache2

在虚拟主机配置中(如 /etc/apache2/sites-available/mybeego.conf)添加:


    ServerName your-domain.com
    ServerAlias www.your-domain.com

    # 静态资源可选:让 Apache 直接服务 public/ 下文件(提升性能)
    Alias /static /var/www/mybeego/static
    
        Require all granted
    

    # 反向代理核心配置
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass /static !
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    # 可选:添加请求头,便于 Beego 识别真实客户端信息
    RequestHeader set X-Forwarded-Proto "http"

启用站点并重载:

sudo a2ensite mybeego.conf
sudo systemctl reload apache2

三、注意事项与加固建议

  • 切勿使用 sudo ./myapp 启动 Beego:以 root 运行 Go 应用存在严重安全风险(如文件写入、系统调用越权);
  • 务必限制 Beego 绑定地址为 127.0.0.1(默认行为),避免外部直连内部端口;
  • ? 若需 HTTPS,请在 Apache 层配置 Let’s Encrypt(certbot),Beego 无需改动;
  • ? 生产环境建议配合 systemd

    管理 Beego 进程(自动重启、日志轮转),而非 nohup;
  • ⚠️ 检查防火墙(如 gcloud compute firewall-rules)是否放行 TCP 80 端口。

通过此架构,Apache 承担网络入口、负载均衡、SSL 终止等职责,Beego 专注业务逻辑,分工清晰、安全可控,是部署 Go Web 应用的标准范式。