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应用后台稳定运行
现在把应用做成守护进程,确保服务器重启或者应用崩溃时能自动恢复:
- 创建Systemd服务文件:
sudo nano /etc/systemd/system/gotest.service - 粘贴下面的配置(记得根据你的实际路径修改):
[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 # 开机自启的目标级别
- 执行命令生效:
sudo systemctl daemon-reload# 让Systemd识别新的服务文件sudo systemctl start gotest# 启动服务sudo systemctl enable gotest# 设置开机自启
- 检查服务状态:
sudo systemctl status gotest,确保显示active (running),没有报错。
第三步:配置Apache虚拟主机反向代理(这是你之前可能错的地方!)
你之前访问域名显示文件内容,大概率是因为虚拟主机配置成了指向静态文件目录,而没有把请求转发到Go应用。现在改成反向代理配置:
- 创建虚拟主机配置文件:
sudo nano /etc/apache2/sites-enabled/gotest.domain2.com.conf - 粘贴下面的配置:
<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>
- 启用Apache的反向代理模块(默认可能没开):
sudo a2enmod proxysudo a2enmod proxy_http
- 重启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
相关产品推荐
相关产品推荐

