部署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)。
相关推荐
cyforkk2 小时前
Spring Boot @RestController 注解详解
java·spring boot·后端
canonical_entropy3 小时前
可逆计算:一场软件构造的世界观革命
后端·aigc·ai编程
重庆穿山甲3 小时前
从0到1:用 Akka 持久化 Actor + Outbox + RocketMQ 做到“订单-库存最终一致”
后端
我不只是切图仔5 小时前
我只是想给网站加个注册验证码,咋就那么难!
前端·后端
专注VB编程开发20年5 小时前
CSS 的命名方式像是 PowerShell 的动词-名词结构,缺乏面向对象的层级关系
开发语言·后端·rust
野犬寒鸦5 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
爱吃烤鸡翅的酸菜鱼5 小时前
【Spring】原理:Bean的作用域与生命周期
后端·spring
JohnYan5 小时前
工作笔记 - 微信消息发送和处理
javascript·后端·微信