Node.js 倒计时图片服务部署与 Nginx 反向代理实战总结
Node.js 倒计时图片服务部署与 Nginx 反向代理实战总结
场景描述
我们希望实现一个倒计时图片接口,供邮件等外部平台引用,如:
https://your-domain.com/countdown/countdown.png?end=2025-09-30T00:00:00
通过访问该链接生成实时倒计时 PNG 图,用于促销活动倒计时展示。
技术栈与组件
- Node.js + Express
- canvas 模块绘制 PNG
- Nginx 反向代理(启用 HTTPS)
- Let’s Encrypt 免费 SSL 证书
- curl 用于调试
Node.js 服务核心逻辑
监听路径:
app.get('/countdown/countdown.png', (req, res) => { ... })
监听端口:
app.listen(7897, '0.0.0.0', () => {console.log(`Countdown image server running`);
});
遇到的问题
1. curl
本地访问正常,但通过 nginx 转发返回 404
http://127.0.0.1:7897/countdown/countdown.png?...
→ 正常返回图片https://182.92.100.57/countdown/countdown.png?...
→404 Not Found
(nginx)
问题排查过程
检查点 1:Node 是否监听公网(0.0.0.0
)
app.listen(7897, '0.0.0.0')
否则 nginx 无法连接
127.0.0.1:7897
(仅限本地)
检查点 2:Nginx location
匹配是否命中
原配置示例(错误):
location /countdown/ {proxy_pass http://127.0.0.1:7897/countdown/;
}
此配置导致路径变成:
http://127.0.0.1:7897/countdown/countdown.png → 实际访问 /countdown/countdown/countdown.png ❌
最终解决方案
正确 Nginx 配置示例
location ^~ /countdown/ {proxy_pass http://127.0.0.1:7897;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 可选:禁止缓存,确保每次图片实时更新add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
关键点总结:
配置项 | 是否正确 | 说明 |
---|---|---|
proxy_pass 末尾是否 没有加/countdown/ | ✅ | 确保拼接路径不重复 |
是否使用 ^~ 提前匹配 | ✅ | 避免被 / 的 Vue 路由兜底 |
Node 是否监听 0.0.0.0 | ✅ | 否则 nginx 无法访问 |
Node 路由是否正好是 /countdown/countdown.png | ✅ | 保证路径一致 |
是否 reload 了 nginx | ✅ | 修改配置后记得运行:nginx -t && nginx -s reload |
成功效果
访问:
https://your-domain.com/countdown/countdown.png?end=2025-09-30T00:00:00
返回状态码:
200 OK
Content-Type: image/png
可嵌入邮箱、网页、推广活动页面等使用。
优化
功能 | 说明 |
---|---|
支持中文字体 | registerFont() 引入字体解决中文显示 |
可配置颜色 / 样式 | 支持 query 参数自定义文字颜色、背景等 |
支持透明背景 / GIF 动画 | 使用 canvas+GIFEncoder 生成动态图 |
域名绑定 | 用 innorapidzs.cn 替代 IP,便于引用 |
测试命令
curl -v "https://your-domain.com/countdown/countdown.png?end=2025-09-30T00:00:00" --insecure
Node 服务快速启动脚本(如 pm2)
pm2 start countdown-server.js --name countdown-server