部署go项目到linux服务器(简易版)

部署go项目到linux服务器(简易版)

前提条件:

  1. 本地已经有go语言的运行环境,可以参考GO语言下载与安装
  2. 有编辑器(如vscode)
  3. 有服务器,如阿里云服务器
  4. 服务器安装了宝塔面板

本地新建项目并运行

新建一个main.go文件

go 复制代码
package main

import (
	"encoding/json"
	"log"
	"net/http"
	"os"
)

type Response struct {
	Status  string `json:"status"`
	Message string `json:"message"`
	Data    any    `json:"data,omitempty"`
}

func main() {
	// 设置路由
	http.HandleFunc("/", handleRequest)
	http.HandleFunc("/api/test", handleTestRequest)

	// 获取端口(默认为 8080)
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}

	// 启动服务器
	log.Printf("Server starting on :%s...", port)
	log.Fatal(http.ListenAndServe(":"+port, nil))
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
	response := Response{
		Status:  "success",
		Message: "Welcome to the test API",
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(response)
}

func handleTestRequest(w http.ResponseWriter, r *http.Request) {
	var response Response

	switch r.Method {
	case http.MethodGet:
		response = Response{
			Status:  "success",
			Message: "GET request received",
			Data: map[string]string{
				"method":  "GET",
				"example": "This is a GET response",
			},
		}
	case http.MethodPost:
		var requestData map[string]interface{}
		if err := json.NewDecoder(r.Body).Decode(&requestData); err != nil {
			response = Response{
				Status:  "error",
				Message: "Invalid JSON payload",
			}
			w.WriteHeader(http.StatusBadRequest)
		} else {
			response = Response{
				Status:  "success",
				Message: "POST request received",
				Data: map[string]interface{}{
					"method":  "POST",
					"payload": requestData,
				},
			}
		}
	default:
		response = Response{
			Status:  "error",
			Message: "Method not allowed",
		}
		w.WriteHeader(http.StatusMethodNotAllowed)
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(response)
}

本地运行:go run main.go

如果正常打印Server starting on :8080...,则启动成功

打包项目

为了在linux服务器正常运行项目,我们需要在打包时设置目标为linux

bash 复制代码
# CMD 命令提示符
set GOOS=linux
set GOARCH=amd64
go build -o myapp-linux main.go

# PowerShell
$env:GOOS = "linux"
$env:GOARCH = "amd64"
go build -o myapp-linux main.go

逐行执行上述命令,即可完成打包,在同级目录输出一个可执行文件myapp-linux

上传到服务器

将可执行文件myapp-linux上传到服务器的某个目录下,以/www/serverFiles/goServer为例。然后在宝塔面板中新建一个go服务。

第一步:

第二步:

第三步:

访问接口

在浏览器输入${你上面填的的ip地址或域名} + /api/test,如果提示{"status":"success","message":"GET request received","data":{"example":"This is a GET response","method":"GET"}},则服务启动成功。

遇到的问题

  • 如果提示域名绑定失败,域名已被占用,则可以检查一下宝塔面板的本站其他项目,是否用了这个域名。
  • 如果部署后访问提示502 bad getway,则检查一下宝塔面板的配置文件中的端口,是不是跟项目里设置的端口一致(本文这个项目是8080)。
相关推荐
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
步行cgn6 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
桦说编程8 小时前
【AtomicAgent系列1】变异测试——过去做不起,现在 agent 做得起
后端·ai编程·vibecoding
考虑考虑9 小时前
nginx打印请求日志
运维·后端·nginx
IT_陈寒9 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
CoderLiu9 小时前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端
fireworks9910 小时前
SpringBoot2接入Knife4j
后端
wei_shuo10 小时前
数据迁移工具实战:KDMS自动化评估与量化决策体系解析
后端
Lightpwd10 小时前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
数据库·后端
乱码三千10 小时前
使用ComfyUI+MinMax-H3音视频模型生成视频
前端·后端·github