当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/597009.html

相关文章:

  • The History of Computers
  • 用 Phi-3 Mini 4K Instruct 实现轻量级模型量化与加载
  • WWDC 25 给自定义 SwiftUI 视图穿上“玻璃外衣”:最新 Liquid Glass 皮肤详解
  • 漫画机器学习播客对话图文版
  • OpenHarmony BUILD.gn中执行脚本
  • 趣玩-Ollama-Llm-Chatrbot
  • 第四章 Freertos物联网实战DHT11温湿度模块
  • 利用aruco标定板标定相机
  • EDoF-ToF: extended depth of field time-of-flight imaging解读, OE 2021
  • C Primer Plus 第6版 编程练习——第10章(上)
  • 2025暑期—05神经网络-BP网络
  • 深入解析预训练语言模型在文本生成中的革命性应用:技术全景与未来挑战
  • 工业微控制器的启动过程以及安全设计所面临的挑战
  • TODAY()-WEEKDAY(TODAY(),2)+1
  • 数据结构系列之二叉搜索树
  • 关于针对 DT_REG 出现红色波浪线的问题(编译错误/IDE警告),以下是 精准解决方案,保持你的代码功能完全不变:
  • LeetCode11~20题解
  • 动态递归之正则表达式
  • 西安电子科技大学金融学431考研经历分享
  • 分布式任务调度实战:XXL-JOB与Elastic-Job深度解析
  • 一次Oracle集群脑裂问题分析处理
  • PetaLinux 使用技巧与缓存配置
  • Oracle迁移到高斯,查询字段默认小写,解决办法
  • Zookeeper学习专栏(七):集群监控与管理
  • MySQL binlog解析
  • IDEA maven加载依赖失败不展示Dependencies项
  • 华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑
  • Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践
  • 【矩阵专题】Leetcode73.矩阵置零
  • 华为云开发者空间 × DeepSeek-R1 智能融合测评:云端开发与AI客服的协同进化