Node.js 倒计时图片服务部署与 Nginx 反向代理实战总结

发布于:2025-07-28 ⋅ 阅读:(19) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到