Skip to content

服务器部署

  • 手动打包,然后发布到服务器上

打包环境

参数含义示例
CGO_ENABLED是否Cgo标志CGO_ENABLED=0
GOOS打包平台linux/windows/darwin...GOOS=linux
GOARCH打包架构 amd64/arm64GOARCH=amd64

打包命令

  • go build [参数] [包路径/文件列表]

-o

  • 指定输出文件路径
bash
# 打包backend.go文件, 输出到backend文件
go build -o backend backend.go

-v

  • 显示详细的编译信息
bash
# 编译当前项目并显示详细包名
go build  -v ./...

-x

  • 显示详细的编译过程
bash
# 编译当前项目并显示详细编译过程
go build -x -o backend backend.go

-race

  • 编译后的程序运行时会自动检测并发数据竞争问题(适合调试,性能会降低)。
bash
# 编译并启用竞争检测,运行时若有并发问题会报错
go build -race -o backend && ./backend

-ldflags

  • 用于设置编译时的链接参数,如设置版本信息、编译时间等。
  • 通过 -X 向包变量注入值,常用于设置程序版本、编译时间等元信息。
bash
# 编译时设置版本信息为1.0.0
go build -ldflags "-X main.Version=1.0.0" -o backend backend.go

# 编译时去除符号表和调试信息(减小二进制体积)
# -s 去除符号表,-w 去除调试信息
go build -ldflags "-s -w" -o backend backend.go

-tags

  • 编译时指定标签,用于条件编译(如不同环境下的代码)。
  • 可以在代码中使用 // +build 注释指定标签,也可以在编译时使用 -tags 参数。
go
// 下面的代码只有在dev标签下才会编译
// +build dev

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, World!")
}
bash
# 编译包含 "debug" 标签的代码(如调试日志、额外检查)
go build -tags debug -o backend_debug backend.go

# 同时指定多个标签(用逗号分隔)
go build -tags "prod,mysql" -o backend_prod backend.go

-trimpath

  • 编译时去除二进制文件中嵌入的绝对路径(避免暴露本地开发路径,增强安全性)。
bash
# 生成的二进制文件中不含本地路径信息
go build -trimpath -o backend backend.go

-gcflags

  • 向 Go 编译器传递参数,如禁用优化和内联(方便断点调试)。
bash
# 禁用优化和内联,适合调试(否则调试时可能跳行)
go build -gcflags "-N -l" -o backend backend.go

-work

  • 打印临时工作目录路径,并在编译后不删除(可查看中间产物,如 .o 文件)。
bash
go build -work

完整示例

bash
# 指定环境打包
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -trimpath -ldflags="-s -w" -o backend backend.go

部署

守护进程

  • 安装nohup守护进程工具,让go能持续后台运行
bash
# 一般系统默认自带nohup工具
nohup --version

上传代码

  • 把打好的包上传到linux服务器
bash
# scp [账号]@[目标服务器]:/[本地包的地址] [服务器地址]
scp root@192.168.1.100:/Users/project/bao /www/wwwroot/test

配置文件

  • 更新正式环境配置文件
bash
# 把开发环境的配置文件上传到[包]的同级目录
# 更改配置文件的配置

后台运行包

bash
# & 是指后台运行
# 2>&1 是吧bao运行产生的日志 记在bao.log中
nohup ./test > test.log 2>&1 &

配置代理

ini
server{
    listen 80
    access_log /var/log/nginx/base_access.log;
    error_log /var/log/nginx/base_error.log;

    location ~ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 配置文件的端口
        proxy_pass http://127.0.0.1:8080;
    }
}

关闭进程

bash
# 查找test包的进程id
ps -aux | grep test
# 杀死进程
kill 26081