在 Linux 上进行 Node.js API 开发
一 环境准备与安装
- 选择 Node.js LTS 版本,优先使用 nvm 管理多版本,便于切换与回滚。示例:
- 安装 nvm:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
- 重新加载:source ~/.bashrc
- 安装与切换:nvm install 18 && nvm use 18
- 验证:node -v、npm -v
- 可选二进制安装(无 nvm 时):下载 Node.js Linux 64 位包,解压并将 bin 目录软链到 /usr/local/bin,便于全局使用。
二 初始化项目与最小 API
- 初始化与依赖:
- mkdir my-api && cd my-api
- npm init -y
- npm i express cors helmet morgan
- npm i -D nodemon
- 最小 Express 服务(app.js):
- 代码示例:
- const express = require(‘express’); const cors = require(‘cors’); const helmet = require(‘helmet’); const morgan = require(‘morgan’);
- const app = express(); const port = process.env.PORT || 3000;
- app.use(helmet()); app.use(morgan(‘combined’)); app.use(cors()); app.use(express.json());
- app.get(‘/api/hello’, (req, res) => res.json({ message: ‘Hello, World’ }));
- app.listen(port, () => console.log(
Server running on :${port}));
- 开发运行:npx nodemon app.js(代码变更自动重启)
三 连接数据库与数据校验
- 数据库示例(以 MySQL 为例):
- 安装驱动:npm i mysql2
- 连接池示例:
- const mysql = require(‘mysql2/promise’);
- const pool = mysql.createPool({ host: ‘localhost’, user: ‘root’, password: ‘pwd’, database: ‘test’, waitForConnections: true, connectionLimit: 10, queueLimit: 0 });
- app.get(‘/api/users’, async (req, res, next) => {
try {
const [rows] = await pool.query(‘SELECT id, name FROM users’);
res.json({ data: rows });
} catch (err) { next(err); }
});
- 数据校验与错误处理:
- 校验:npm i joi 或 express-validator
- 统一错误处理中间件(示例):
- app.use((err, req, res, next) => {
const status = err.status || 500;
res.status(status).json({ error: err.message });
});
四 运行与进程守护
- 使用 PM2 守护与集群:
- 全局安装:npm i -g pm2
- 启动与集群:pm2 start app.js -i max --name my-api
- 常用:pm2 status、pm2 logs my-api、pm2 startup(开机自启)
- 使用 systemd 托管(可选):
- 创建服务文件 /etc/systemd/system/node-api.service:
- [Unit] Description=Node.js API Service
- After=network.target
- [Service] ExecStart=/usr/bin/node /opt/my-api/app.js
- Restart=always User=nodejs Group=nodejs Environment=NODE_ENV=production
- WorkingDirectory=/opt/my-api
- [Install] WantedBy=multi-user.target
- 启用:systemctl daemon-reload && systemctl enable --now node-api
五 反向代理 安全与部署
- Nginx 反向代理与静态资源:
- 安装:sudo apt-get install nginx
- 配置示例(/etc/nginx/sites-available/default):
- server { listen 80; server_name your_domain.com;
- location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’; }
- location /static/ { alias /opt/my-api/public/; expires 1y; add_header Cache-Control “public, immutable”; }
- }
- 重启:sudo systemctl restart nginx
- HTTPS:使用 Certbot 获取 Let’s Encrypt 证书,Nginx 终止 TLS,提升安全与性能
- 防火墙与安全组:
- 云服务器需放通对应端口(如 80/443/3000);如使用云厂商安全组,添加入站规则
- 容器化(可选):
- Dockerfile 示例:
- FROM node:18-alpine
- WORKDIR /app
- COPY package*.json ./
- RUN npm ci --only=production
- COPY . .
- EXPOSE 3000
- CMD [“node”,“app.js”]
- 构建与运行:docker build -t my-api . && docker run -p 3000:3000 my-api
- API 设计与运维要点:
- 遵循 REST 语义与状态码;启用 CORS 策略;为接口增加 限流;对外提供 健康检查 /health;结构化日志(如 Winston/Pino);监控告警(如 Prometheus/Grafana)