无法在Heroku部署Go后端应用:MySQL连接被拒求助
Go应用部署Heroku失败:MySQL连接被拒绝
问题详情
- Procfile内容:
web: studentData - 应用启动时反复出现以下错误,导致进程退出、应用崩溃(返回H10错误):
dial tcp 127.0.0.1:3306: connect: connection refused
问题根源
你的Go应用硬编码了本地MySQL连接地址(127.0.0.1:3306),但Heroku运行环境中没有本地MySQL服务。必须使用Heroku提供的数据库附加组件,并通过环境变量读取数据库连接参数。
解决步骤
添加Heroku数据库附加组件
通过Heroku CLI安装ClearDB(MySQL兼容):heroku addons:create cleardb:ignite也可以登录Heroku控制台,手动添加ClearDB或Heroku MySQL插件。
修改数据库连接逻辑
移除硬编码的连接信息,读取Heroku提供的环境变量:- ClearDB使用
CLEARDB_DATABASE_URL - Heroku MySQL使用
DATABASE_URL
示例代码:
import ( "database/sql" "fmt" "net/url" "os" _ "github.com/go-sql-driver/mysql" ) func initDB() (*sql.DB, error) { // 优先读取ClearDB,其次是Heroku MySQL的环境变量 dbURL := os.Getenv("CLEARDB_DATABASE_URL") if dbURL == "" { dbURL = os.Getenv("DATABASE_URL") } // 解析数据库URL u, err := url.Parse(dbURL) if err != nil { return nil, fmt.Errorf("failed to parse DB URL: %w", err) } username := u.User.Username() password, _ := u.User.Password() host := u.Host dbName := u.Path[1:] // 移除路径开头的斜杠 // 构建MySQL DSN dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", username, password, host, dbName) db, err := sql.Open("mysql", dsn) if err != nil { return nil, fmt.Errorf("failed to open DB: %w", err) } // 验证连接 if err := db.Ping(); err != nil { return nil, fmt.Errorf("failed to ping DB: %w", err) } return db, nil }- ClearDB使用
确保应用监听正确端口
Heroku通过PORT环境变量指定应用监听端口,不能硬编码:import ( "log" "net/http" "os" ) func main() { port := os.Getenv("PORT") if port == "" { port = "8080" // 本地开发默认端口 } // 初始化路由等逻辑... log.Printf("Starting server on :%s", port) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Server failed to start: %v", err) } }重新部署应用
提交代码修改后重新部署:git add . git commit -m "fix: use Heroku database env vars and dynamic port" git push heroku main
验证
部署完成后,通过日志确认连接状态:
heroku logs --tail
内容的提问来源于stack exchange,提问作者Arjun Malhotra
相关产品推荐
相关产品推荐

