GO项目部署Linux服务器教程

Golang项目与Java项目部署对比:流程、优势与注意事项,
本文详细比较了Golang项目与Java项目的部署流程,强调了Golang的静态链接、跨平台支持和内置运行时环境的优势,以及部署步骤,包括设置环境变量、编译生成可执行文件、调整权限和检查端口等。

目录

Golang项目和Java项目部署的不同

 部署流程


最近在学习golang,和前端小伙伴一起写了个H5小游戏,游戏数据采用websocket进行通信。由于是第一次部署go语言项目,在部署过程中遇到很多问题,写下这篇文章进行总结,希望可以帮助到部署遇到问题的朋友。

Golang项目和Java项目部署的不同

Golang项目相比于Java项目部署流程更加的简单,不需要在服务器上下载语言环境,我们可以直接在服务器上运行编译好的二进制文件

go语言能够做到这一点的原因如下:

  1. 静态链接:Go 语言的编译器会将程序的所有依赖包括在最终的可执行文件中,这种方式称为静态链接。因此,生成的可执行文件不需要依赖外部的动态链接库或其他运行时环境,可以在没有 Go 语言环境的服务器上直接运行。

  2. 跨平台支持:Go 语言的编译器可以生成不同操作系统和架构的可执行文件,比如 Windows、Linux 和 macOS 等。这意味着你可以在开发机器上编译生成 Linux 下运行的可执行文件,然后将其拷贝到 Linux 服务器上直接运行,而无需关心服务器上是否安装了 Go 语言环境。

  3. 内置运行时环境:Go 语言的可执行文件中内置了运行时环境,包括垃圾回收、调度器等,因此它们可以独立运行,不需要额外的运行时支持。

对于Java来说,Java 语言在编译时生成的是字节码文件(以 .class 格式存储),而不是直接生成可执行的二进制文件。这些字节码文件需要在 Java 虚拟机(JVM)上执行,因此在服务器上运行 Java 程序仍然需要安装 Java 运行时环境(JRE)或者 Java 开发工具包(JDK)。

 部署流程

1.确保自己的项目在本地可以正常运行和访问;

2.查看自己的项目监听的端口号,本项目监听的是服务器私网IP的8090端口

 3.之后开始我们的编译,设置编译时候的环境变量,依次执行下面命令

D:\SoftwareDevelop\GoFamily\GoWorks\klotski>set CGO_ENABLED=0

D:\SoftwareDevelop\GoFamily\GoWorks\klotski>set GOOS=linux

D:\SoftwareDevelop\GoFamily\GoWorks\klotski>set GOARCH=amd64

D:\SoftwareDevelop\GoFamily\GoWorks\klotski>go build
  1. set CGO_ENABLED=0

    • 这个命令是在 Windows 系统下设置一个环境变量 CGO_ENABLED 的值为 0CGO_ENABLED 是 Go 语言中用来控制是否启用 C 语言的交互能力的环境变量,0 表示禁用了 CGO(Cgo 是一个 Go 包,用于调用 C 代码)。
  2. set GOOS=linux

    • 这个命令是设置一个环境变量 GOOS 的值为 linuxGOOS 是 Go 语言中用来指定目标操作系统的环境变量,这里将目标操作系统设置为 Linux。
  3. set GOARCH=amd64

    • 这个命令是设置一个环境变量 GOARCH 的值为 amd64GOARCH 是 Go 语言中用来指定目标体系结构的环境变量,这里将目标体系结构设置为 AMD64 架构。
  4. go build

    • 这个命令是使用 Go 工具编译当前目录下的 Go 源代码文件,生成一个可执行文件。根据前面设置的环境变量,编译时会将目标操作系统和体系结构设置为 Linux 和 AMD64。

编译完成之后我们得到一个文件名为项目名无文件后缀的文件,我们将这一个文件传输到Linux系统上,在Linux中,我们找到上传的文件目录。

4.通过ls命令查看文件权限是否可执行,如果文件为绿色,代码可直接执行。

如果不可执行,使用chmod 755 ./klotski 更新文件权限

5.通过./文件名或者nohup命令执行文件

#在当前路径下执行文件
./klotski
#通过绝对路径执行文件,只要能够找到文件就可以
/opt/klotski/klotski

#通过上述方式虽然可以执行文件,并且通过公网访问项目,但是我们一旦关闭了当前连接,程序就会终止。通过让当前程序在后台运行的方式,可以解决这一问题
nohup ./klotski

程序运行成功会使服务器界面处于任务的状态,显示访问程序时的输出,如果不是此状态,说明程序运行失败,请检查自己的程序和更改监听的端口IP

6.查询程序运行时占用的端口

# 查询我们的go语言二进制文件是否被执行
# 注意我们程序运行的线程是随机分配的,并不是8090端口,我们的程序仅仅建成8090端口的访问情况
[root@wuqiong klotski]# ps aux | grep klotski 
root     29218  1.4  0.1 1230132 2512 ?        Sl   19:39   0:50 ./klotski
root     32492  0.0  0.0 112812   976 pts/0    S+   20:35   0:00 grep --color=auto klotski

# 关闭运行程序 后面的参数跟PID
kill 29218 

 7.别忘记放开服务器的安全组,开放我们程序监听的端口

GoFrame 是一个模块化、高性能、企业级的 Go 语言开发框架,适用于构建 Web 服务、API 服务和后台系统。将 GoFrame 项目部署Linux 系统是一个常见需求。以下是完整的部署流程,包括编译、配置、运行和守护进程管理。 --- ### ✅ 部署步骤 #### 1. 编译 GoFrame 项目Linux 可执行文件 在本地或 CI/CD 环境中,使用 `GOOS=linux` 编译生成 Linux 平台的二进制文件。 ```bash # 假设你的 main.go项目根目录 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app main.go ``` - `CGO_ENABLED=0`:禁用 CGO,使二进制文件静态链接,便于跨环境部署。 - `GOOS=linux`:目标操作系统为 Linux。 - `GOARCH=amd64`:目标架构为 64 位 x86(根据服务器调整,如 arm64)。 - 输出文件为 `bin/app`,可直接在 Linux 上运行。 > 📦 将 `bin/app` 和必要资源(如 `config/`, `public/`, `template/` 等)上传到 Linux 服务器。 --- #### 2. 上传文件到 Linux 服务器 使用 `scp` 或 `rsync` 上传: ```bash scp -r bin/app config/ public/ user@your-server:/home/user/goframe-app/ ``` 登录服务器并进入项目目录: ```bash ssh user@your-server cd /home/user/goframe-app ``` --- #### 3. 设置权限并测试运行 赋予可执行权限: ```bash chmod +x app ``` 测试运行(前台运行,查看日志): ```bash ./app ``` 如果使用了配置文件(如 `config.yaml`),确保路径正确。GoFrame 默认从 `config/` 目录加载配置。 --- #### 4. 使用 systemd 管理服务(推荐) 创建 systemd 服务文件,实现开机自启、崩溃重启等功能。 新建服务文件: ```bash sudo nano /etc/systemd/system/goframe.service ``` 写入以下内容(根据实际路径修改): ```ini [Unit] Description=GoFrame Application After=network.target [Service] Type=simple User=user Group=user WorkingDirectory=/home/user/goframe-app ExecStart=/home/user/goframe-app/app Restart=always RestartSec=5 Environment=GF_GCFG_FILE=config.yaml # 日志输出(可选) StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` > 🔍 `Environment=GF_GCFG_FILE=config.yaml` 可指定配置文件名,其他 GoFrame 环境变量也可在这里设置。 启用并启动服务: ```bash sudo systemctl daemon-reexec sudo systemctl enable goframe.service sudo systemctl start goframe.service ``` 查看服务状态: ```bash sudo systemctl status goframe.service ``` 查看日志: ```bash sudo journalctl -u goframe.service -f ``` --- #### 5. (可选)配置 Nginx 反向代理 如果你的应用监听 `:8000`,可以用 Nginx 做反向代理: ```nginx server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 重启 Nginx: ```bash sudo systemctl restart nginx ``` --- #### 6. (可选)使用防火墙开放端口 ```bash sudo ufw allow 80 sudo ufw allow 443 # 如果直接访问后端端口(如 8000) sudo ufw allow 8000 ``` --- ### ✅ 补充说明 - **日志管理**:GoFrame 默认输出日志到 `log/` 目录,确保该目录有写权限。 - **环境变量**:可通过 `.env` 文件或 `Environment=` 在 systemd 中设置。 - **热更新**:生产环境不建议使用 `gf run`,应使用编译后的二进制文件。 - **安全**:不要以 root 用户运行应用,使用普通用户 + 权限控制。 --- ### 示例项目结构 ``` goframe-app/ ├── app/ ├── config/ │ └── config.yaml ├── log/ ├── public/ ├── main.go └── app (二进制文件) ``` --- ### 完整示例代码(main.go 简单服务) ```go package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) func main() { s := g.Server() s.GET("/", func(r *ghttp.Request) { r.Response.Writeln("Hello from GoFrame on Linux!") }) s.SetPort(8000) s.Run() } ``` --- ### 总结 通过上述步骤,你可以成功将 GoFrame 项目部署Linux 服务器,并通过 `systemd` 实现稳定运行。整个过程包括交叉编译、文件传输、服务注册、反向代理等企业级部署要素。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值