101 lines
2.3 KiB
Markdown
101 lines
2.3 KiB
Markdown
# 部署问题修复记录
|
|
|
|
## 问题描述
|
|
|
|
部署后访问 http://115.190.235.230:8006 时出现严重的重定向循环问题:
|
|
- URL被重复拼接多次:`http://115.190.235.230:8006/115.190.235.230:8006/115.190.235.230:8006/...`
|
|
- 浏览器报错:`ERR_TOO_MANY_REDIRECTS`
|
|
- Service Worker 不被支持警告
|
|
|
|
## 根本原因
|
|
|
|
Next.js 配置文件中使用了 `output: 'standalone'` 配置,但部署时使用的是 `next start` 命令启动,两者不兼容导致:
|
|
1. Next.js 警告:`"next start" does not work with "output: standalone" configuration`
|
|
2. 路由处理异常,导致URL重复拼接
|
|
3. 重定向循环
|
|
|
|
## 解决方案
|
|
|
|
### 1. 修改 Next.js 配置
|
|
|
|
**文件**: `next.config.mjs`
|
|
|
|
**修改前**:
|
|
```javascript
|
|
const nextConfig = {
|
|
output: 'standalone', // 问题所在
|
|
images: {
|
|
unoptimized: true,
|
|
},
|
|
}
|
|
```
|
|
|
|
**修改后**:
|
|
```javascript
|
|
const nextConfig = {
|
|
images: {
|
|
unoptimized: true,
|
|
},
|
|
}
|
|
```
|
|
|
|
### 2. 清理服务器缓存并重新构建
|
|
|
|
```bash
|
|
# 连接服务器
|
|
ssh -p 22 root@115.190.235.230
|
|
|
|
# 进入项目目录
|
|
cd /var/www/chinese-family-tree
|
|
|
|
# 停止应用
|
|
pm2 stop chinese-family-tree
|
|
|
|
# 删除旧的构建文件
|
|
rm -rf .next
|
|
|
|
# 重新构建
|
|
pnpm build
|
|
|
|
# 重启应用
|
|
PORT=8006 pm2 restart chinese-family-tree --update-env
|
|
```
|
|
|
|
### 3. 验证修复
|
|
|
|
```bash
|
|
# 检查HTTP响应
|
|
curl -I http://115.190.235.230:8006/
|
|
# 应该返回: HTTP/1.1 200 OK
|
|
|
|
# 检查应用日志
|
|
pm2 logs chinese-family-tree --lines 20
|
|
# 不应该再有 standalone 警告
|
|
```
|
|
|
|
## 修复结果
|
|
|
|
✅ 重定向循环问题已解决
|
|
✅ 应用正常启动在 8006 端口
|
|
✅ 页面可以正常访问
|
|
✅ 没有 standalone 配置警告
|
|
|
|
## 经验教训
|
|
|
|
1. **不要混用 standalone 和 next start**
|
|
- `output: 'standalone'` 需要使用 `node .next/standalone/server.js` 启动
|
|
- 使用 `next start` 时不要配置 `output: 'standalone'`
|
|
|
|
2. **部署后清理缓存**
|
|
- 修改配置后必须删除 `.next` 目录重新构建
|
|
- 否则会使用旧的缓存文件
|
|
|
|
3. **验证环境变量**
|
|
- 确保 `NEXTAUTH_URL` 与实际访问URL一致
|
|
- 使用 `pm2 env <id>` 检查运行时环境变量
|
|
|
|
## 相关文档
|
|
|
|
- [Next.js Standalone Output](https://nextjs.org/docs/app/api-reference/config/next-config-js/output)
|
|
- [Next.js Deployment](https://nextjs.org/docs/app/building-your-application/deploying)
|