部署 Express.js 应用
生产 Node.js Express 服务器,使用 PM2、Docker 或 serverless 适配器,含集群和优雅关闭。
平台进阶
为什么
Express 是最久经考验的 Node.js Web 框架,中间件生态最大。作为长运行 Node 进程(PM2/Docker)部署可完全控制运行时,不像 serverless 有冷启动和超时限制。
何时使用
REST API、BFF 层和需要 WebSocket 或长时任务的应用用 Express。边缘部署避免 — 改用 Hono。
如何做
1. 构建 — tsc 或 esbuild 编译 TS 到 dist/
2. PM2 — pm2 start dist/server.js -i max(集群模式,全核)
3. Docker — node:20-alpine 镜像,CMD ["node", "dist/server.js"]
4. Serverless — @vendia/serverless-express 适配 Lambda
5. 集群 — 用 cluster 模块或 PM2 多核利用
6. 优雅关闭 — 监听 SIGTERM,关服务器,干净退出
7. 反向代理 — Nginx/Caddy 前置做 TLS、限流、静态
示例
// src/server.ts — Express 优雅关闭
import express from "express";
const app = express();
app.get("/health", (req, res) => res.json({ ok: true }));
const server = app.listen(3000, () => console.log("listening :3000"));
process.on("SIGTERM", () => {
server.close(() => process.exit(0));
});
// ecosystem.config.js — PM2 集群
module.exports = {
apps: [{
name: "api", script: "dist/server.js",
instances: "max", exec_mode: "cluster",
max_memory_restart: "500M",
}],
};
// Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY dist/ ./dist/
COPY node_modules/ ./node_modules/
EXPOSE 3000
CMD ["node", "dist/server.js"]
常见问题
- ⚠仅单核 — 无集群模式,一个 Node 进程无法用多核 CPU
- ⚠内存泄漏崩溃 — 无 max_memory_restart,OOM 杀进程不重启
- ⚠部署时丢连接 — 无优雅关闭,在途请求被终止
最佳实践
- ✓用 PM2 集群模式或 Node cluster — Express 单线程,多核需多进程
- ✓始终在 SIGTERM 实现优雅关闭 — 退出前排空连接实现零停机部署
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求