新手刚拿到一台 Ubuntu 系统的 VPS,完成系统初始化后(参考:新服务器初始化教程),通常会面临下一个问题:
“我开发好的 Web 程序,怎么部署到服务器上?怎么用自己的域名访问它?还能自动支持 HTTPS 吗?”
这篇文章将以实际案例为例,教你如何使用 Caddy 来部署你的 Go Web 后端服务。支持自动 HTTPS、安全、简单、可拓展,让你快速上线项目,未来部署更多服务也不成问题。
对于已经完成服务器初始化的新手开发者来说,下一步通常就是上线你的第一个项目。你可能已经完成了自己的 Golang Web 服务编译,现在你需要的是一个 安全、稳定、自动续签 HTTPS 证书、支持多站点扩展 的生产环境部署方案。
本教程将以 Caddy + Systemd + Golang 服务 为核心,教你如何构建生产可用的网站服务环境。
👉 点击查看《建站系列教程》文章目录
在《建站系列教程》系列文章中,我们将详细介绍如何从0到1搭建自己的网站。以下是该系列文章的全部内容:
前提准备
- 一台已经初始化的 VPS,系统为 Ubuntu 22.04+
- 一个已备案(或国外使用可免备案)的域名
- 已完成 DNS 设置,将
example.com
和www.example.com
指向服务器公网 IP - 你已经编译好一个 Go 的 Web 后端程序,生成了可执行文件(比如
myapp
)
为什么选择 Caddy?
Caddy 是一个现代、自动化、默认支持 HTTPS 的 Web 服务器。相比 Nginx 它更加简洁智能,适合新手快速部署,同时又具备强大功能。
Caddy 的最大优势就是:
- 自动获取并续签 HTTPS 证书
- 配置简单(一个文件搞定所有反代规则)
- 默认支持 HTTP/2 / TLS 1.3
- 内置静态文件服务器、反向代理、负载均衡等功能
- 支持热更新,不重启服务即可更改配置
为什么要使用 HTTPS?Caddy 自动开启 HTTPS 的 4 大好处
Caddy 的最大优势就是自动配置 HTTPS,你只写了个域名,它就搞定了证书获取、安装、续签。
那 HTTPS 有什么用?必须得用吗?
答案是:当然必须。
1. 加密数据传输,防止中间人攻击
HTTP 是明文传输的,HTTPS 能有效防止信息被劫持或篡改。
2. 浏览器不会显示“不安全”警告
没启用 HTTPS 的网站会被 Chrome、Firefox 直接打红叉,大大影响用户体验。
3. 提高 SEO 排名
Google 明确表示:HTTPS 是搜索排名的正向因素,启用 HTTPS 更容易被收录和排名靠前。
4. 支持新技术
现代前端功能(如 HTTP/2、Service Worker)很多都强制要求 HTTPS 才能使用。
第一步:安装 Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -y
第二步:上传你的 Go 可执行程序
假设你的程序是 myapp
,上传到服务器的 /opt/myapp/
目录:
mkdir -p /opt/myapp/
scp ./myapp user@your-server-ip:/opt/myapp/
第三步:设置 systemd 服务守护你的程序
创建 systemd 启动服务文件:
sudo vim /etc/systemd/system/myapp.service
内容如下:
[Unit]
Description=My Go Web App
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
RestartSec=3
LimitNOFILE=4096
Environment=GOTRACEBACK=crash
[Install]
WantedBy=multi-user.target
配置说明:
配置项 | 含义 |
---|---|
User=www-data / Group=www-data |
以普通非 root 用户运行程序,提高安全性 |
Restart=on-failure |
程序异常退出(非正常退出码)时自动重启,避免误重启 |
RestartSec=3 |
失败重启前等待 3 秒,避免疯狂重启 |
LimitNOFILE=4096 |
调高可打开文件句柄数,预防高并发时的资源限制问题 |
Environment=PORT=8080 |
设置环境变量,可用于 Go 程序动态读取 |
GOTRACEBACK=crash |
捕捉崩溃日志,有利于诊断问题 |
延伸阅读:linux systemd 配置项详解
保存并启用服务:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
检查服务状态:
sudo systemctl status myapp
相关阅读:Linux 后端守护进程方案对比:systemd vs supervisord vs pm2
第四步:配置 Caddy 实现反向代理和 HTTPS
用 Caddy 暴露你的服务,支持 HTTPS + 域名
编辑配置文件:
sudo vim /etc/caddy/Caddyfile
将原有的内容全部替换为以下配置:
# 主站 HTTPS 反向代理
example.com {
reverse_proxy localhost:8080
log {
output file /var/log/caddy/example.access.log
format json
}
}
# 将 www 重定向到主域名
www.example.com {
redir https://example.com{uri} permanent
}
🔒 如果你还没换域名记得改
example.com
成你自己的域名!
重启 Caddy:
sudo systemctl restart caddy
Caddy 会自动获取并启用 HTTPS 证书。
了解更多关于 Caddy 的配置,请查看文章:Caddy 配置详解
第五步:打开浏览器测试访问
在浏览器中访问:
https://example.com
可以看到你自己的 Go 后端页面或返回的数据,且已经自动启用 HTTPS 加密。
第六步:更新你的 Go 程序(部署更新)
每次你更新了本地程序后,只需上传替换原文件并重启服务:
# 上传新版本
scp ./myapp user@your-server-ip:/opt/myapp/
# 重启服务(不中断已有请求)
sudo systemctl restart myapp
若更新频繁,推荐使用 CI/CD 自动部署,或写一个简单的 Shell 脚本做版本切换。
附加建议:扩展你的 Caddy 为多服务门户
你可以在 Caddyfile 中添加多个站点或子域名配置,例如:
api.example.com {
reverse_proxy localhost:8081
}
admin.example.com {
reverse_proxy localhost:8082
}
你也可以配置静态页面站点(如你的个人主页):
example.com {
root * /var/www/personal
file_server
}
总结
部署 Go 项目不必复杂。用好 Caddy,配置清晰、HTTPS 自动、易于维护和拓展。
如果你还在用 nginx 手动配证书,是时候换成 Caddy 了。
如果你觉得本文有用,欢迎收藏本站或查看其他相关教程:
如需完整示例或遇到问题欢迎留言!