使用 Caddy 实现 Next.js 无停机部署(本地服务器)

힘센캥거루
2026년 1월 4일(수정됨)
3
10

每次一有想在主页上加点什么的念头就去 build,结果中间好像偶尔会有人访问。

于是 Search Console 上的分数开始一点点往下掉。

觉得这样不行,就开始思考要怎么做无停机部署。

使用 Caddy 实现 Next.js 无停机部署(本地服务器)-1

1. 两个项目文件夹 + 两个终端

答案出乎意料地简单:开两个终端。

在一个终端里 build,另一个终端里让服务器跑着。

问题是,在同一个项目里开两个终端会产生冲突

即使一个已经在正常运行,只要在另一个终端里开始 build,就会重新生成 .next 文件夹,从而引发内部错误,最终导致主页中断。

使用 Caddy 实现 Next.js 无停机部署(本地服务器)-2

所以需要再多一个和现有项目一模一样的文件夹。

因为我把图片也都存成了本地文件,所以把名为 blogCopy 的复制项目改成去读取原始文件夹。

接下来只要稍微改一下 Caddy 就行了。

2. Caddy 官方文档

ChatGPT 和 Claude 好像都不太懂,不停地一起说些奇怪的方案,最后只好去看官方文档。

官方文档里的示例如下:

example.com {
	reverse_proxy node1:80 node2:80 node3:80 {
		health_uri /healthz
		lb_try_duration 5s
	}
}

但这个是把请求平均分配到三个节点上的,需要用别的方式。

AI 一直执着于下面这种写法,但一放进去 reverse proxy 就直接挂了。

example.com {
    reverse_proxy localhost:3000 localhost:3001 {
        health_uri /health
        health_interval 5s
        health_timeout 2s
        health_status 200
    }
}

这个写法的问题之一,是没有定义到底哪个端口是主端口。

而且因为 Caddy 每 5 秒检查一次端口,所以启动后 5 秒之内是没法正常连到正确端口上的。

所以干脆改成手动指定。

example.com {
	reverse_proxy localhost:3000 localhost:3001 {
		lb_policy first
	
   		fail_duration 20s
   		max_fails 2
	}
}

就改成通过读取用户访问失败来切换端口的方式。

这样一来就运作得很好。

3. 后记

现在总算可以尽情(?)build 了。

以前一边 build 一边报错的时候,总觉得是不是把服务器停太久了,心里挺忐忑的。

以后应该不会再有这种事了。

每天都在学习,但要学的东西还在不断冒出来,真是神奇。

使用 Caddy 实现 Next.js 无停机部署(本地服务器)-3

관련 글

Next.js 全栈博客开发记
Next.js 全栈博客开发记
在第一次接触网页开发大约 1 年之后,我开始想着想要拥有一个属于自己的博客。于是我就大概花了 6 个月几乎只埋头做这件事。前端部分的功能,参考金度亨先生的博客就已经足够了。我用 mdx 搭建起一个博客,其实连一周都没花到。事实上,仅靠前端也并不会给博客运营带来什么大问题。有一阵子我也觉得,只要写 m...
谷歌搜索索引自动化 - Web Search Indexing API
谷歌搜索索引自动化 - Web Search Indexing API
继上次搞完 IndexNow 之后,也决定在谷歌这边做一下自动化。查了一下,发现谷歌是通过一个叫 Web Search Indexing 的 API 来支持这个功能的。1. 适用范围官方文档中,这个 API 正式支持的范围是招聘公告和流媒体视频服务。说是为了给对实时性要求高的内容创建索引用的,但搜了...
搜索索引生成自动化 - IndexNow
搜索索引生成自动化 - IndexNow
在向 Bing 提交站点收录时才发现,Bing 提供了一个叫做 IndexNow 的功能。核心在于,可以利用 API Key,在写完文章的瞬间就立刻发起索引请求。只要用 fetch 写出类似下面这样的请求,并把它串联到「写文章」流程里,就可以在把文章保存到 DB 的同时发送索引生成请求。POST /...
被入侵的 Nextjs、React 服务器经历
被入侵的 Nextjs、React 服务器经历
我最初接触到这次安全问题是在 12 月 5 日凌晨。据说在 React 中可以在未认证的情况下进行远程代码执行。看到这条新闻后,我虽然告诉了别人,但总觉得自己应该没事,就什么想法也没有地略过了。1. 发现被入侵的痕迹结果当我想登录更新博客代码时,在终端里发现了有命令被执行过的痕迹。/bin/sh:...
在博客中添加多语言功能(NextJS、next-intl、Vercel AI SDK)
在博客中添加多语言功能(NextJS、next-intl、Vercel AI SDK)
最近我觉得博客需要多语言功能。于是决定用 next-intl 来实现多语言服务。1.i18n首先,在做多语言服务时有一些必须遵守的原则。这被称为 internationalization,单词太长,所以把首字母 i 和尾字母 n,以及中间 18 个字母合在一起,写成 i18n。1) i18n 的原则...
配置 Nextjs 的多语言支持
配置 Nextjs 的多语言支持
为了增加我的博客的访问量,我考虑尝试设置多语言。找到了多种方法,首先的一步是为语言设置不同的路由。决定使用 next-intl 来实现。1. 安装 yarn add next-intl 2. 应用...

댓글을 불러오는 중...