You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04 Apache多虚拟主机环境下Golang WebApp部署失败求助

我来帮你一步步搞定这个问题!这种Apache多虚拟主机下部署Go Web应用的场景我碰过好多次,咱们从最基础的环节开始排查,肯定能找到问题所在:

第一步:先确认Go Web应用本身能正常运行

先把守护进程和代理的事放一边,先确保你的代码本身能跑、能响应请求:

  • 首先编译你的Go代码:go build -o gotest main.go
  • 直接运行编译好的二进制:./gotest
  • 打开另一个终端,用curl测试本地访问:curl http://localhost:8080(这里假设你的Go程序监听8080端口,要是你用了别的端口就改成对应的)

⚠️ 重点:你的Go代码里一定要监听0.0.0.0:端口,而不是localhost:端口!比如:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello from Go!")
}

func main() {
    http.HandleFunc("/", handler)
    // 这里一定要用0.0.0.0,允许所有IP访问(包括Apache的转发请求)
    http.ListenAndServe("0.0.0.0:8080", nil)
}

如果这一步curl能返回正确内容,再往下走;如果不行,先把代码的问题解决。

第二步:配置Systemd守护进程,让Go应用后台稳定运行

现在把应用做成守护进程,确保服务器重启或者应用崩溃时能自动恢复:

  1. 创建Systemd服务文件:sudo nano /etc/systemd/system/gotest.service
  2. 粘贴下面的配置(记得根据你的实际路径修改):
[Unit]
Description=Go Test Web Application
After=network.target  # 等网络启动完再启动应用

[Service]
User=www-data  # 用Apache的用户,避免权限冲突
Group=www-data
WorkingDirectory=/var/www/gotest  # 你的二进制文件所在目录
ExecStart=/var/www/gotest/gotest  # 二进制文件的绝对路径
Restart=always  # 应用崩溃自动重启
# 如果你的应用需要Go环境变量,就加上这行,不需要可以删掉
Environment="GOPATH=/usr/local/go"

[Install]
WantedBy=multi-user.target  # 开机自启的目标级别
  1. 执行命令生效:
    • sudo systemctl daemon-reload # 让Systemd识别新的服务文件
    • sudo systemctl start gotest # 启动服务
    • sudo systemctl enable gotest # 设置开机自启
  2. 检查服务状态:sudo systemctl status gotest,确保显示active (running),没有报错。
第三步:配置Apache虚拟主机反向代理(这是你之前可能错的地方!)

你之前访问域名显示文件内容,大概率是因为虚拟主机配置成了指向静态文件目录,而没有把请求转发到Go应用。现在改成反向代理配置:

  1. 创建虚拟主机配置文件:sudo nano /etc/apache2/sites-enabled/gotest.domain2.com.conf
  2. 粘贴下面的配置:
<VirtualHost *:80>
    ServerName gotest.domain2.com

    # 核心:把所有请求转发到Go应用的端口
    ProxyPreserveHost On  # 保留原始请求的Host头,Go应用能拿到域名信息
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    # 日志配置,方便排查问题
    ErrorLog ${APACHE_LOG_DIR}/gotest.error.log
    CustomLog ${APACHE_LOG_DIR}/gotest.access.log combined
</VirtualHost>
  1. 启用Apache的反向代理模块(默认可能没开):
    • sudo a2enmod proxy
    • sudo a2enmod proxy_http
  2. 重启Apache让配置生效:sudo systemctl restart apache2
第四步:检查权限和防火墙

最后再确认一下权限和网络问题:

  • 给Go应用的目录和二进制文件设置正确的权限:sudo chown -R www-data:www-data /var/www/gotest,避免因为权限不够导致应用启动失败或者无法被Apache访问。
  • 防火墙方面,Ubuntu16.04默认用ufw,只要80端口是开放的(Apache已经在运行,应该没问题),Go应用监听的8080端口只需要本地访问,不需要对外开放,所以不用额外配置。
常见问题排查

如果还是不行,试试这些方法:

  • 检查虚拟主机是否启用:sudo a2ensite gotest.domain2.com.conf,然后重启Apache。
  • 看Go应用的Systemd日志:sudo journalctl -u gotest,有没有端口被占用、权限不足之类的报错。
  • 检查Apache的错误日志:cat /var/log/apache2/gotest.error.log,看有没有反向代理相关的错误。

内容的提问来源于stack exchange,提问作者Odd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:53:20