如何将Golang后端部署到网络主机?
如何将Golang后端部署到网络主机? 你好,
抱歉问这么基础的问题。我完全是个新手,无论是Go还是其他语言。
我能将Go后端部署到常规的虚拟主机上吗?我的意思是,例如我使用的虚拟主机提供商允许部署各种CMS实例,显然也支持PHP代码。我之所以知道这个,是因为PHP版本在我的网站空间设置中是一个非常显眼的选项。
那Go呢?它能在常规的Web服务器上运行吗?
背景:我想开始学习编程。出于某些原因,我更倾向于用Go来学。我对网页编程不是特别感兴趣,但“不幸的是”,我目前唯一实际的应用场景就是一个带有后台数据库功能的网页。而且我发现,如果没有一个实际的问题去解决,学习编程是徒劳的,所以这将是我的第一个项目。
提前感谢!
更多关于如何将Golang后端部署到网络主机?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
reach:
我可以将Go后端部署到常规的虚拟主机上吗?
如果你拥有root访问权限,这应该是可行的。但我想你可能需要使用VPS或类似的服务。
我的服务提供商恰好与我们合唱团页面运行在同一个平台上,每月收费超过4美元(我认为是8欧元),所以这个论点确实站不住脚。我想,为了这8欧元,我也获得了服务器的SSH访问权限,但我不知道是否能在上面执行代码。 所以就用Go了。请不要指望我很快在这里展示成果——这肯定是一个长期项目。
哈哈,你写的内容正是我选择 Go 的原因之一。我今年 47 岁,不会用任何语言写一行代码,但我对这件事有相当好的理解。理解得足够好,以至于弱类型语言对我来说就像巫术一样。我怎么能不先声明就直接使用一个变量呢?
感觉很不舒服。
但这跑题了,也不应该引发原则性的讨论。我当然明白每个问题都需要合适的工具,这些语言的存在也都有充分的理由。
我想开始学习编程。出于某些原因,我更倾向于使用 Go 语言。我对网页编程不是特别感兴趣。
正如 Dean 指出的那样,无论它是否是解决你提出的问题的最直接方案,Go 都是一门相对简单的语言,它提倡编写直接的代码,并且其主要应用场景之一就是网页开发。通过实现网页相关功能来学习 Go 编程,听起来是个很好的开始。学习 Go 的一个优势在于它是强类型和静态类型的语言。这可能与当前的趋势相悖,也许只是因为我年纪大了,但我认为尽早学习类型系统是有益的。我见过一些年轻的开发者,他们最初使用动态语言学习编程,后来在掌握静态类型时遇到了困难。
抱歉,可能我表达得不够清楚(我的母语不是英语。我对技术有很好的理解,但编程技能为零——目前如此)。让我再试一次: 我当前的供应商支持PHP。我上传网站的文件,包括HTML和.PHP文件,网站就能直接“运行”。 据我所知,自托管的Apache服务器也是如此。它直接就能“理解”PHP。
是否有以同样方式支持Go的供应商? 我快速看了一下Vultr,乍一看这像是一个云主机。所以我租用的是操作系统的一部分,可以让它做任何事情,包括解释Go。但据我所知,这是完全不同的事情,而且比仅仅购买一些网页空间要昂贵得多。
我提出这个问题的目的只是为了弄清楚,这个网站(对我们旧合唱团页面的重写)是否是一个有价值的第一个项目,并且Go是它的理想选择,或者这类事情是否仍然更适合用PHP编写。如果是后者,我就找点别的项目开始。
是否有提供商以相同方式支持Go?
据我所知,没有完全相同的,但你可以找到某种程度上接近的方案。看看Google Cloud Run(我在上面链接了它)。它稍微复杂一点,但你可以采用类似的“部署后无需担心服务器”的方法。它可以缩容到0,并且有免费层级,这也很不错。
但据我所知,这完全是另一回事,而且比仅仅购买一些网络空间要昂贵得多。
这真的要看情况。你可以每月花大约5美元租一台服务器。但根据你的托管地点,你或许可以免费托管便宜的静态网站。
我提问的目的只是想弄清楚,这个网站(我们旧合唱团页面的重写版)是否值得作为第一个项目,并且Go是否是其理想选择,或者这类东西是否仍然更适合用PHP编写。如果是后者,我就找点别的项目开始。
这听起来像是静态内容。如果是这样的话,Go可能并不理想。你或许可以使用静态内容生成器(看看Hugo和Jekyll + GitHub Pages!)。
为了让你开始提供静态内容(稍后你可以开始添加更多动态功能),请查看这个文件服务器的示例:
http package - net/http - Go Packages
Package http provides HTTP client and server implementations.
这大概是最简单的方法了。如果你想开始在其中混合一些逻辑,可以查看我前段时间写的一篇博客文章,其中介绍了一种混合方法:
Serving Static Content Using Golang HTTP
A quick and easy tutorial on how to serve protected static content via Golang.
或者直接克隆这个仓库并运行它:
GitHub - DeanPDX/go-http-static-example: A quick example for serving up…
A quick example for serving up static content using http.ServeFile - GitHub - DeanPDX/go-http-static-example: A quick example for serving up static content using http.ServeFile
你计划使用什么主机?这是一个非常宽泛的问题,类似于“我如何构建一个应用程序?”。我会专注于你试图构建什么,以及你想在哪里部署它,然后开始提出具体问题。不过,这里有一些想法:
- Vultr 非常经济实惠。这可能是一个不错的起点。
- 你也可以从 Google Cloud Run 的免费层级开始,并且很可能在那里停留很长时间。查看这个部署 Go 服务的快速入门指南。
- DigitalOcean 是另一个很好的选择。例如,查看本指南。还有一些不错的讨论在这里。
Sibert:
我有不同的看法。在我看来,Go 非常适合静态网站。但 Hugo 可能是一个选择。
这没问题,但它并不是我为此目的的首选工具。就像——你也可以用 Rust 来构建一个提供静态内容的可执行文件,但我不会建议这样做,除非你有理由(也许你想学习 Rust,也许你已经非常了解 Rust,所以用 Rust 构建对你来说很快,等等)。
举个例子,在你的指南中,部署需要 9 个步骤(设置反向代理等)。如果你使用像 GitHub Pages 和静态网站生成器这样的东西,那将简化为类似“将代码签入你的仓库,它会自动构建并自动托管”。我并不是想打击任何人,Go 是一个非常有用的工具,我在职业生涯中每天都在使用它,但我也不会说 Go 是所有工作的最佳工具。
话虽如此,@reach 如果你想学习 Go,这将是一个不错的项目。也许可以告诉我们你认为在托管方面什么是便宜的,我们可以推荐一些主机(我认为 Digital Ocean 有每月 4 美元的 Droplet)。然后你可以在这个过程中开始提出更具体的问题。
是的,完全可以将Go后端部署到常规虚拟主机上。Go编译后生成的是独立的二进制可执行文件,不依赖运行时环境,这使得部署比PHP等解释型语言更简单。
部署Go应用到虚拟主机的步骤:
1. 首先编译Go程序
在本地开发环境中,针对目标服务器的操作系统架构进行交叉编译:
// 假设你的主程序文件是 main.go
// 为Linux服务器编译(大多数虚拟主机使用Linux)
GOOS=linux GOARCH=amd64 go build -o myapp main.go
// 如果服务器是64位ARM架构
// GOOS=linux GOARCH=arm64 go build -o myapp main.go
2. 上传文件到服务器
将编译好的二进制文件(如myapp)和必要的配置文件上传到虚拟主机。通常可以通过FTP、SFTP或控制面板的文件管理器完成。
3. 设置执行权限
通过SSH连接到服务器(如果提供商支持):
chmod +x myapp
4. 运行Go应用
直接运行二进制文件:
./myapp
如果你的应用监听HTTP端口(如:8080),它就会开始处理请求。
5. 使用反向代理(推荐)
大多数虚拟主机不允许直接绑定到80或443端口。可以通过以下方式配置:
使用nginx作为反向代理的示例配置:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
使用Apache的.htaccess配置:
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:8080/$1 [P,L]
6. 保持应用运行
使用进程管理工具确保应用持续运行:
使用systemd(如果可用):
# /etc/systemd/system/myapp.service
[Unit]
Description=My Go Application
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/your/app
ExecStart=/path/to/your/app/myapp
Restart=always
[Install]
WantedBy=multi-user.target
使用nohup(简单方法):
nohup ./myapp > app.log 2>&1 &
简单的Go Web服务器示例
package main
import (
"fmt"
"net/http"
"log"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, your Go app is running!")
})
http.HandleFunc("/api/data", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprintf(w, `{"status": "ok", "message": "API is working"}`)
})
port := ":8080"
fmt.Printf("Server starting on port %s\n", port)
log.Fatal(http.ListenAndServe(port, nil))
}
注意事项
- 检查主机提供商限制:有些共享主机可能限制长时间运行的进程
- 端口选择:使用非特权端口(如8080、3000等)
- 数据库连接:确保数据库配置正确,虚拟主机通常提供MySQL等数据库
- 文件权限:Go应用需要适当的文件系统权限来读写文件
Go的部署优势在于单文件部署,不需要安装运行时环境。只要虚拟主机提供商允许执行二进制文件(大多数Linux主机都允许),就可以运行Go应用。


