🚚 如何在任何 GNU/Linux 系统上部署 Golang 应用程序,而无需使用 Docker?
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
介绍
嘿,嘿!👋 又一篇关于部署和 Golang 的有趣文章来了。
假设我们需要在远程服务器上运行一个用 Go 编写的应用程序,但是配置 Docker 的时间太长(或者只是懒得配置)。
我们应该怎么做?看看这篇文章吧!😉
📝 目录
我为什么需要这个?
首先,了解服务应用程序在 GNU/Linux 上的工作原理至关重要。此外,对于规模很小的项目(例如初创公司、REST API 微服务等),由于这些项目尚不具备使用 Docker 和部署自动化的能力,了解这些内容也很有帮助。
我们服务的基础
好了,现在来编写一个简单的 Web 服务,当收到请求时,它会返回一些内容。例如,我将使用我最喜欢的 Web 框架Fiber(v2),它运行速度极快且易于学习。
如果您还不熟悉,请阅读代码中的注释:
package main
import (
"log"
"github.com/gofiber/fiber/v2"
)
func main() {
// Create new Fiber instance
app := fiber.New()
// Make path with some content
app.Get("/hello", func(c *fiber.Ctx) error {
// Return a string with a dummy text
return c.SendString("Hello, World 👋!")
})
// Start server on http://localhost:3000 or error
log.Fatal(app.Listen(":3000"))
}
将此文件另存为main.go,并在名称相似的文件夹中构建适用于 GNU/Linux x64 的二进制文件hello_world:
GOOS=linux GOARCH=amd64 go build main.go -o ./hello_world
好的。现在,只需将此二进制文件复制到远程服务器的相应/root/go文件夹中即可。
关于纤维的几句话
你或许会问,那我为什么如此钟爱Fiber Web 框架呢?答案就在于它的主要特性:
- 稳健路由
- 极致性能
- 具备 API 接口的 Web 框架
- 灵活的中间件支持
- 内存占用低
尤其值得一提的是,Discord社区非常友好,而且文档详尽(已翻译成多种世界语言)!
创建systemd服务
这systemd是一个为 Linux 操作系统提供一系列系统组件的软件套件。
[...] 它的主要目标是统一 Linux 发行版的服务配置和行为;systemd 的主要组件是“系统和服务管理器”——一个用于引导用户空间和管理系统用户的初始化系统。
— 维基百科
太好了!现在我们来创建一个新服务。
root以(超级用户)身份连接到远程服务器*.service在文件夹内创建一个扩展名为 .htm 的文件systemd:
nano /etc/systemd/system/hello_world.service
- 将此代码复制到此处:
[Unit]
Description=Go sample web app
After=multi-user.target
[Service]
User=root
Group=root
ExecStart=/root/go/hello_world
[Install]
WantedBy=multi-user.target
- 点击
Ctrl+O保存,Ctrl+X点击关闭编辑器 - 接下来,启动并启用此服务:
systemctl start hello_world.service
systemctl enable hello_world.service
☝️ 即使远程服务器重启,服务也会自动启动。
设置反向代理服务器
我将使用Nginx作为反向代理服务器,但您可以选择任何其他代理服务器。
- 使用软件包管理器进行安装
nginx。对于类 Debian 系统,它看起来会像这样:
apt install nginx -y
- 开始
nginx服务:
systemctl start nginx
/etc/nginx/sites-available/hello_world在文件中创建配置:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /root/go/hello_world {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
- 创建指向该文件夹的配置文件符号链接
sites-enabled:
ln -s /etc/nginx/sites-available/hello_world /etc/nginx/sites-enabled
- 最后,重新加载
nginx以应用配置:
nginx -t && nginx -s reload
🔥 有时可能是
3000远程服务器上的端口不可用。请检查防火墙设置。
最终结果
没错,就是这样!快去http://your_server_ip:3000看看结果吧🎉
照片由
- Simon Abrams https://unsplash.com/@flysi3000
PS
如果你想在这个博客上看到更多类似的文章,请在下方留言并订阅我。谢谢!😻
❗️您可以通过Boosty平台支持我,既可以长期支持,也可以一次性支持。所有收益都将用于支持我的开源软件项目,并激励我为社区创作新的产品和文章。
当然,您也可以帮助我让开发者的工作变得更好!只需以贡献者的身份加入我的项目即可。很简单!
我最需要你帮助(和点赞)的项目👇
- 🔥 gowebly:一款新一代 CLI 工具,可轻松使用 Go 在后端创建出色的 Web 应用程序,使用 htmx、hyperscript 或 Alpine.js 以及最流行的 CSS 框架在前端进行开发。
- ✨ create-go-app:通过运行一条 CLI 命令,创建一个包含 Go 后端、前端和部署自动化功能的新生产就绪项目。
我的其他一些小项目:yatr、gosl、json2csv、csv2api。
文章来源:https://dev.to/koddr/how-to-deploy-golang-application-on-any-gnu-linux-system-but-without-docker-59m1
