如何将Golang后端部署到网络主机?

如何将Golang后端部署到网络主机? 你好,

抱歉问这么基础的问题。我完全是个新手,无论是Go还是其他语言。

我能将Go后端部署到常规的虚拟主机上吗?我的意思是,例如我使用的虚拟主机提供商允许部署各种CMS实例,显然也支持PHP代码。我之所以知道这个,是因为PHP版本在我的网站空间设置中是一个非常显眼的选项。

那Go呢?它能在常规的Web服务器上运行吗?

背景:我想开始学习编程。出于某些原因,我更倾向于用Go来学。我对网页编程不是特别感兴趣,但“不幸的是”,我目前唯一实际的应用场景就是一个带有后台数据库功能的网页。而且我发现,如果没有一个实际的问题去解决,学习编程是徒劳的,所以这将是我的第一个项目。

提前感谢!


更多关于如何将Golang后端部署到网络主机?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

嗯,当然,但这听起来对我来说像是在虚拟Linux服务器上安装一个应用程序,而不是在Web服务器上安装什么东西。我是不是搞混了?

更多关于如何将Golang后端部署到网络主机?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


reach:

我可以将Go后端部署到常规的虚拟主机上吗?

如果你拥有root访问权限,这应该是可行的。但我想你可能需要使用VPS或类似的服务。

我的服务提供商恰好与我们合唱团页面运行在同一个平台上,每月收费超过4美元(我认为是8欧元),所以这个论点确实站不住脚。我想,为了这8欧元,我也获得了服务器的SSH访问权限,但我不知道是否能在上面执行代码。 所以就用Go了。请不要指望我很快在这里展示成果——这肯定是一个长期项目。

哈哈,你写的内容正是我选择 Go 的原因之一。我今年 47 岁,不会用任何语言写一行代码,但我对这件事有相当好的理解。理解得足够好,以至于弱类型语言对我来说就像巫术一样。我怎么能不先声明就直接使用一个变量呢? slight_smile 感觉很不舒服。 但这跑题了,也不应该引发原则性的讨论。我当然明白每个问题都需要合适的工具,这些语言的存在也都有充分的理由。

我想开始学习编程。出于某些原因,我更倾向于使用 Go 语言。我对网页编程不是特别感兴趣。

正如 Dean 指出的那样,无论它是否是解决你提出的问题的最直接方案,Go 都是一门相对简单的语言,它提倡编写直接的代码,并且其主要应用场景之一就是网页开发。通过实现网页相关功能来学习 Go 编程,听起来是个很好的开始。学习 Go 的一个优势在于它是强类型和静态类型的语言。这可能与当前的趋势相悖,也许只是因为我年纪大了,但我认为尽早学习类型系统是有益的。我见过一些年轻的开发者,他们最初使用动态语言学习编程,后来在掌握静态类型时遇到了困难。

Dean_Davidson:

这听起来像是静态内容。如果是这种情况,Go 可能不是最理想的选择。

我持不同意见。在我看来,Go 非常适合构建静态网站。不过 Hugo 可能也是一个选择。

reach:

如果这个网站(我们旧版合唱团页面的重写)是一个值得做的第一个项目,并且 Go 是它的理想选择,

总的来说,Go 是 Web 开发的一个好选择,但我无法对你的网站下定论,因为我从未见过它。但这个网站是用 Go 构建的,并且这里是我托管它的方法。基本上,一个 Go 网站是由 Go 的 HTML 模板以及 CSS 和 JavaScript(如果需要的话)构建的。

抱歉,可能我表达得不够清楚(我的母语不是英语。我对技术有很好的理解,但编程技能为零——目前如此)。让我再试一次: 我当前的供应商支持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

你计划使用什么主机?这是一个非常宽泛的问题,类似于“我如何构建一个应用程序?”。我会专注于你试图构建什么,以及你想在哪里部署它,然后开始提出具体问题。不过,这里有一些想法:

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))
}

注意事项

  1. 检查主机提供商限制:有些共享主机可能限制长时间运行的进程
  2. 端口选择:使用非特权端口(如8080、3000等)
  3. 数据库连接:确保数据库配置正确,虚拟主机通常提供MySQL等数据库
  4. 文件权限:Go应用需要适当的文件系统权限来读写文件

Go的部署优势在于单文件部署,不需要安装运行时环境。只要虚拟主机提供商允许执行二进制文件(大多数Linux主机都允许),就可以运行Go应用。

回到顶部