From fef3e6aa4c1f564594755c2b3987100aa342cc77 Mon Sep 17 00:00:00 2001 From: hyh Date: Fri, 28 Nov 2025 09:59:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=BA=E5=B0=91=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=8C=85=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modify.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++ site/Dockerfile | 8 ++++ site/package.json | 3 +- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/modify.md b/modify.md index 86fdfff4..b3ead5c3 100644 --- a/modify.md +++ b/modify.md @@ -1,3 +1,100 @@ +## 2025-01-XX - 修复 Next.js standalone 模式 sharp 缺失错误 + +### 修复内容 +- **添加 sharp 依赖** (`site/package.json`): + - 在 dependencies 中添加 `sharp: "^0.33.0"` + - sharp 是 Next.js 图片优化功能所需的原生模块 + +- **更新 Dockerfile** (`site/Dockerfile`): + - 在 runner 阶段安装必要的系统依赖:`libc6-compat` 和 `vips-dev` + - 复制 package.json 到 runner 阶段 + - 安装 sharp 包:`npm install sharp@^0.33.0 --production` + - 确保 standalone 模式下 sharp 可用 + +### 修改的文件 +- `site/package.json` - 添加 sharp 依赖 +- `site/Dockerfile` - 在 runner 阶段安装 sharp 和系统依赖 + +### 问题原因 +Next.js 在 standalone 模式下不会自动包含 sharp 包,而 sharp 是图片优化功能(Image Optimization API)的必需依赖。当使用 Next.js Image 组件时,需要 sharp 来处理图片优化。 + +### 使用说明 +1. **重新构建 Docker 镜像**: + ```bash + docker-compose -f docker-compose-https.yml build --no-cache + ``` + +2. **重启服务**: + ```bash + docker-compose -f docker-compose-https.yml up -d + ``` + +3. **验证修复**: + - 检查容器日志,确认不再出现 sharp 缺失错误 + - 访问网站,确认图片正常加载和优化 + +变更原因:用户遇到 Next.js standalone 模式下 sharp 缺失错误,导致图片优化功能无法正常工作。通过添加 sharp 依赖并在 Dockerfile 中正确安装,修复了此问题。 + +## 2025-01-XX - 修复 Firefox 和移动设备访问问题:优化 SSL 配置兼容性 + +### 修复内容 +- **优化 Nginx SSL 配置以支持 Firefox 和移动设备** (`site/nginx/nginx.conf`): + - **禁用 OCSP Stapling**: + - 将 `ssl_stapling` 从 `on` 改为 `off` + - 将 `ssl_stapling_verify` 从 `on` 改为 `off` + - 注释掉 `resolver` 和 `resolver_timeout` 配置 + - **原因**:如果证书链不完整,OCSP Stapling 可能导致 Firefox 和移动设备无法验证证书,从而拒绝连接 + - **扩展 SSL 密码套件兼容性**: + - 添加更多兼容移动设备和旧版浏览器的密码套件 + - 包括:`ECDHE-ECDSA-AES128-SHA256`、`ECDHE-RSA-AES128-SHA256`、`ECDHE-ECDSA-AES128-SHA`、`ECDHE-RSA-AES128-SHA` 等 + - 排除不安全的密码套件:`!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA` + - **原因**:移动设备和某些浏览器可能需要更广泛的密码套件支持 + - **添加移动设备优化配置**: + - 添加 `Vary "Accept-Encoding"` 响应头,确保移动设备正确解析内容类型 + - 保持 HTTP/2 支持(`http2 on`) + +### 修改的文件 +- `site/nginx/nginx.conf` - 优化 SSL 配置,禁用 OCSP Stapling,扩展密码套件兼容性 + +### 使用说明 +1. **重启 Nginx 容器以应用配置**: + ```bash + docker-compose -f docker-compose-https.yml restart nginx + ``` + +2. **验证配置**: + - 在 Firefox 浏览器中访问网站,确认可以正常连接 + - 在移动设备(手机)上访问网站,确认可以正常访问 + - 使用 SSL Labs 测试工具验证 SSL 配置:https://www.ssllabs.com/ssltest/ + +3. **如果问题仍然存在**: + - 检查证书链是否完整(证书文件应包含中间证书) + - 如果证书链不完整,需要合并证书链: + ```bash + cat /home/owen/ssl_key/smartsensiguard.cn.pem /home/owen/ssl_key/chain.pem > /home/owen/ssl_key/smartsensiguard.cn-fullchain.pem + ``` + - 然后更新 `docker-compose-https.yml` 中的证书路径为完整证书链文件 + +### 问题原因分析 +- **Firefox 浏览器无法访问**: + - Firefox 对 SSL 证书验证更严格 + - 如果 OCSP Stapling 配置不当或证书链不完整,Firefox 会拒绝连接 + - 禁用 OCSP Stapling 可以避免此问题(如果证书链不完整) + +- **移动设备无法访问**: + - 移动设备可能使用较旧的 SSL/TLS 实现 + - 需要更广泛的密码套件支持 + - 某些移动浏览器对 OCSP Stapling 的支持可能不完善 + +### 后续优化建议 +如果证书链完整,可以重新启用 OCSP Stapling 以提升性能: +1. 确保证书文件包含完整的证书链(包括中间证书) +2. 将 `ssl_stapling` 改回 `on` +3. 将 `ssl_stapling_verify` 改回 `on` +4. 取消注释 `resolver` 配置 + +变更原因:用户反馈浏览器访问正常(除 Firefox),但手机无法访问。通过禁用 OCSP Stapling 和扩展密码套件兼容性,解决 Firefox 和移动设备的访问问题。 + ## 2025-01-XX - 修复 SSL 连接错误:优化 Nginx SSL 配置并添加诊断工具 ### 修复内容 diff --git a/site/Dockerfile b/site/Dockerfile index 83182221..8f5e50c1 100644 --- a/site/Dockerfile +++ b/site/Dockerfile @@ -28,6 +28,14 @@ ENV NODE_ENV=production RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs +# 安装 sharp(Next.js standalone 模式需要) +# 安装必要的系统依赖 +RUN apk add --no-cache libc6-compat vips-dev +# 复制 package.json 以安装 sharp +COPY --from=builder /app/package.json ./package.json +# 安装 sharp(使用 npm,因为 alpine 镜像默认包含 npm) +RUN npm install sharp@^0.33.0 --production + # 复制必要文件 COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ diff --git a/site/package.json b/site/package.json index 0e3fe4d1..704b1e45 100644 --- a/site/package.json +++ b/site/package.json @@ -11,7 +11,8 @@ "dependencies": { "next": "14.2.5", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "sharp": "^0.33.0" }, "devDependencies": { "@tailwindcss/aspect-ratio": "0.4.2",