环境准备与安装
1. 安装宝塔面板
参考以下命令:
# CentOS安装命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh # Ubuntu/Debian安装命令 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
2. 登录宝塔面板
安装完成后按照提示,通过浏览器访问链接,使用安装时显示的账号密码登录。
3. 安装必要软件
在宝塔面板中安装:
Nginx 1.20+
MySQL 5.7+
PHP 7.4+ (安装后安装Fileinfo和Redis扩展)
PM2管理器 (宝塔软件商店)
需要验证是否装上pm2,同时保证node环境安装(可使用node.js版本管理器)
pm2 --version node -v npm -v # 使用淘宝镜像源 npm config set registry https://registry.npmmirror.com # pm2安装 npm install -g pm2@latest
创建数据库
点击宝塔面板菜单”数据库” → “添加数据库”
填写信息示例:
数据库名:myapi_db
用户名:api_user
密码:StrongPassword123!
点击”提交”创建数据库
设置权限:选择”所有人”
点击管理 使用phpMyAdmin创建数据表
点击创建的数据库名,点击SQL,输入SQL语句运行查询
以下为示例SQL语句创建数据表和内容:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `email` varchar(100) NOT NULL, `created_at` timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `users` (`name`, `email`) VALUES ('张三', 'zhangsan@example.com'), ('李四', 'lisi@example.com');
创建API项目
1. 创建项目目录
在/www/wwwroot下创建api目录,在目录中创建app.js文件
2. 安装依赖
cd /www/wwwroot/api npm init -y npm install express mysql body-parser cors
3.编写API代码 (app.js)
以下为示例参考:
const express = require('express'); const mysql = require('mysql'); const bodyParser = require('body-parser'); const cors = require('cors'); const app = express(); app.use(cors()); app.use(bodyParser.json()); // 数据库配置 - 使用环境变量更安全 const db = mysql.createConnection({ host: process.env.DB_HOST || 'localhost', user: process.env.DB_USER || 'api_user', password: process.env.DB_PASSWORD || 'StrongPassword123!', database: process.env.DB_NAME || 'myapi_db' }); // 连接数据库 db.connect(err => { if (err) { console.error('数据库连接失败:', err.message); // 更友好的处理方式,而不是直接抛出错误 process.exit(1); // 退出进程 } console.log('MySQL数据库连接成功!'); }); // 添加根路由处理 app.get('/', (req, res) => { res.json({ status: 'success', message: 'API is running!', endpoints: [ '/api/users', '/api/users/:id' ] }); }); // 获取所有用户 app.get('/api/users', (req, res) => { const sql = 'SELECT * FROM users'; db.query(sql, (err, results) => { if (err) { console.error('查询用户失败:', err); return res.status(500).json({ error: '数据库查询失败' }); } res.json(results); }); }); // 获取单个用户 - 防止SQL注入 app.get('/api/users/:id', (req, res) => { const userId = parseInt(req.params.id); if (isNaN(userId)) { return res.status(400).json({ error: '无效的用户ID' }); } const sql = 'SELECT * FROM users WHERE id = ?'; db.query(sql, [userId], (err, results) => { if (err) { console.error('查询用户失败:', err); return res.status(500).json({ error: '数据库查询失败' }); } if (results.length === 0) { return res.status(404).json({ error: '用户不存在' }); } res.json(results[0]); }); }); // 创建用户 - 添加输入验证 app.post('/api/users', (req, res) => { const { name, email } = req.body; // 验证输入 if (!name || !email) { return res.status(400).json({ error: '姓名和邮箱不能为空' }); } const sql = 'INSERT INTO users (name, email) VALUES (?, ?)'; db.query(sql, [name, email], (err, result) => { if (err) { console.error('创建用户失败:', err); return res.status(500).json({ error: '创建用户失败' }); } res.status(201).json({ id: result.insertId, name, email, message: '用户创建成功' }); }); }); // 更新用户 - 防止SQL注入 app.put('/api/users/:id', (req, res) => { const userId = parseInt(req.params.id); if (isNaN(userId)) { return res.status(400).json({ error: '无效的用户ID' }); } const { name, email } = req.body; // 验证输入 if (!name || !email) { return res.status(400).json({ error: '姓名和邮箱不能为空' }); } const sql = 'UPDATE users SET name = ?, email = ? WHERE id = ?'; db.query(sql, [name, email, userId], (err, result) => { if (err) { console.error('更新用户失败:', err); return res.status(500).json({ error: '更新用户失败' }); } if (result.affectedRows === 0) { return res.status(404).json({ error: '用户不存在' }); } res.json({ id: userId, name, email, message: '用户更新成功' }); }); }); // 删除用户 - 防止SQL注入 app.delete('/api/users/:id', (req, res) => { const userId = parseInt(req.params.id); if (isNaN(userId)) { return res.status(400).json({ error: '无效的用户ID' }); } const sql = 'DELETE FROM users WHERE id = ?'; db.query(sql, [userId], (err, result) => { if (err) { console.error('删除用户失败:', err); return res.status(500).json({ error: '删除用户失败' }); } if (result.affectedRows === 0) { return res.status(404).json({ error: '用户不存在' }); } res.json({ id: userId, message: '用户删除成功' }); }); }); // 404 处理 app.use((req, res) => { res.status(404).json({ error: 'API端点不存在' }); }); // 错误处理中间件 app.use((err, req, res, next) => { console.error('服务器错误:', err.stack); res.status(500).json({ error: '服务器内部错误' }); }); const PORT = process.env.PORT || 3000; app.listen(PORT, '0.0.0.0', () => { console.log(`API服务运行在 http://0.0.0.0:${PORT}`); console.log(`外部访问地址: http://${getPublicIp()}:${PORT}`); }); // 获取公网IP的辅助函数 function getPublicIp() { // 在实际部署中,您可能需要从环境变量获取或使用外部服务 return '192.168.1.1'; // 替换为您的实际公网IP }
配置PM2管理API服务
打开宝塔面板的PM2管理器
添加新项目:
项目名称:api-server
运行目录:/www/wwwroot/api
启动文件:/www/wwwroot/api/app.js
点击”添加”启动服务
配置Nginx反向代理
点击宝塔面板菜单”网站” → “添加站点”
填写信息示例:
域名:api.yourdomain.com (或使用服务器IP)
根目录:/www/wwwroot/api
PHP版本:选择”纯静态”
点击”提交”创建站点
配置反向代理:
进入站点设置 → “反向代理” → “添加反向代理”
代理名称:api-proxy
目标URL:http://127.0.0.1:3000
发送域名:$host
其他保持默认 → 提交
配置防火墙和端口
在宝塔面板的“安全”界面,确保开放 3000 端口
测试 API
在浏览器中访问 http://your-server-ip:3000 检查是否能正常访问 API。
使用 Postman 或其他工具测试 /api/data 等具体 API 路径。
原创文章,作者:czhdawn,如若转载,请注明出处:https://www.czhdawn.cn/archives/4803