0%

Linux服务器部署API的方法

在构建应用程序时,部署API是一个关键的步骤。API部署允许其他应用程序或用户与您的服务进行交互,并访问所需的功能和数据。本文将介绍一个示例,展示如何使用Node.js和Express框架来部署一个简单的API。

准备工作

  • 安装Node.js:用于运行JavaScript代码的运行时环境。
    1
    2
    sudo apt update
    sudo apt install nodejs
  • 安装npm(Node Package Manager):用于管理和安装Node.js模块。
    1
    sudo apt install npm

创建API脚本

编写脚本

在服务器想要存放API脚本的目录下,创建API脚本(这里我用的是server.js),其中{ TemplateName, site }为请求API传递的json参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const express = require('express');
const cors = require('cors');
const { exec } = require('child_process');
const { updateHostConfigs } = require('./configManager');

const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());
app.use(cors());

app.post('/deploy', (req, res) => {
const { TemplateName, site } = req.body;
if (!TemplateName || !site) {
console.log({ message: 'TemplateName或site未定义' });
res.status(200).json({ message: '拒绝请求,缺乏必要参数!' });
} else {
// 执行deploy.bat脚本的API端点
const command = `bash deploy.sh ${TemplateName} ${site}`;
console.log(`接收到请求指令:${command}`);
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`执行命令时出错:${error.message}`);
}

console.log(`命令执行成功:${stdout}`);
res.status(200).json({ message: '部署脚本成功执行' });
});
}
});

// 启动服务器
app.listen(PORT, () => {
console.log(`API服务器正在运行,监听端口:${PORT}`);
});

我是在本地写完传到服务器指定目的了,在本地创建server.js的根目录,右键打开Windows Powershell终端,你要用vs code或者git bash,执行以下指令scp server.js qianduan@124.0.0.0:~/H5/server/

1
scp server.js qianduan@112.124.59.167:~/H5/server/

其中qianduan@124.0.0.0是你配置好本地能够远程连接的服务器地址:用ssh不知道怎么操作的可以看下(windows系统ssh连接服务器(免密+私钥)

另外假如linux批处理不是使用.bat而是.sh,假如有用到deploy.sh文件头要加上#!/bin/bash,然后再执行以下命令为deploy.sh剔除Window本地上传发生的格式冲突

1
2
# sed -i -e 's/\r$//' scriptname.sh
sed -i -e 's/\r$//' deploy.sh

安装依赖项

server.js脚本需要安装express依赖项

1
2
3
4
5
6
npm install express

## 相关代码行
const express = require('express');
const app = express();
app.use(express.json());

安装cors依赖项

1
2
3
4
5
npm install cors

## 相关代码行
const cors = require('cors');
app.use(cors());

启动API服务器

在存放API脚本目录下执行以下命令:

1
node server.js

如果启动成功,你会看的脚本返回的输出:

1
API服务器正在运行,监听端口:3000

长期启用API

安装PM2进程:

1
2
3
4
5
6
npm install pm2 -g
# 如果没法下载,使用淘宝镜像源 建议搜索nrm提前修改npm注册表
npm install pm2 -g --registry=https://registry.npmmirror.com

//进入serverjs根目录
pm2 start server.js

重启且更新环节变量

1
pm2 restart --update-env server.js

定个时,每天凌晨0.30重启:

1
2
3
4
5
# 添加定时任务
crontab -e
# 写入
30 0 * * * pm2 restart --update-env server.js
# ctrl+X后Y保存

重启主要时为了防止长时间启用api写入进程被关闭问题。

设置开机启动

例如我在根目录cd H5/server,要启用的是server目录下的server.js,本次启动的名字我定义为my-server,在进入H5/server目录执行如下pm2命令:

1
pm2 start server.js --name my-server

回车继续输入:

1
pm2 startup

运行后,你会看到一条输出命令,它会根据你的系统生成适合的命令,复制系统给你返回的输入,例如:

1
sudo env PATH=$PATH:/home/qianduan/.nvm/versions/node/v16.19.0/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u qianduan --hp /home/qianduan

**注意上条命令是执行pm2 startup返回的,不是复制我上面的,最后保存进程:

1
pm2 save

重启服务器试试,如果设置成功,稍后你就可以直接客户端请求API成功了,后面再不需要手动启动。

1
sudo reboot

附:删除自启配置
进入到当初设定的对应目录,删除my-server进程,执行:

1
2
3
pm2 unstartup
pm2 delete my-server
pm2 save

测试API端点

使用本地测试

要测试API的/deploy端点,您可以使用工具如cURL或Postman发送POST请求。确保请求体中包含必要的参数TemplateName和site。
示例cURL请求:

1
curl -X POST -H "Content-Type: application/json" -d '{"TemplateName": "example", "site": "example.com"}' http://localhost:3000/deploy

示例powershell请求:

1
Invoke-RestMethod -Uri 'http://localhost:3000/deploy' -Method Post -Body '{"TemplateName":"YourTemplateName","site":"YourSite"}' -ContentType 'application/json'

如果启动成功,你会看的脚本返回的输出:

1
2
3
message
-------
部署脚本成功执行

使用公网IP测试

假如我的公网IP是:124.0.0.0,示例cURL请求:

1
curl -X POST -H "Content-Type: application/json" -d '{"TemplateName": "example", "site": "example.com"}' http://124.0.0.0:3000/deploy

注意:使用公网IP需要在阿里云和腾讯云服务器后台添加安全组规则开放对应端口(如果你检查服务器内防火墙没问题后已经无法请求,检查安全组是否开放对应端口例如server.js使用的3000端口很重要)。

使用方法

javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
fetch(http://124.0.0.0:3000/deploy, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ TemplateName:AAA, site:BBB })
})
.then(response => {
console.log("成功接收:", response);
})
.catch(error => {
console.log("Error:", error);
});

使用https请求API

如果你使用https协议的网址请求http协议的api,那么遇到请求失败报错:

1
This request has been blocked: the content must be served over HITPS!

解决办法是换成把api换成https协议,或者在html的header加上下面的代码:

1
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />

但我在webpack项目试下了直接报错,最佳办法还是给api加上换成https协议也就是绑定域名,并安装证书。

绑定域名

首先你需要有自己的域名,其次你在国内要使用域名还得备案过审后可以使用。

到域名后台—>解析:添加记录—>api.yoursitename.com 记录类型A 记录值:你的服务器地址(例如:124.0.0.0)—>确定

SSL证书

在将域名api.yoursitename.com解析到服务器IP地址后,开启服务器80和443端口允许入站连接
然后为域名申请证书,好像不同服务器流程不一样,我用到是Ubuntu 18.04.6 LTS服务器:
1.运行以下命令来安装Certbot:

1
2
sudo apt update
sudo apt install certbot

2.安装Certbot后,运行以下命令以获取证书:

1
2
sudo certbot certonly --standalone -d api.rfcode.top
# 期间要输入自己的邮箱绑定

申请成功后,配置下路径,就可以使用https://api.yoursitename.com/deploy了。

其他Linux相关指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 列出正在运行的所有网络连接和监听端口
sudo netstat -tuln

## 查看是否有其他进程正在使用端口3000
sudo lsof -i :3000

## 列出所有进程信息
netstat -tuln

## 列出正在使用指定端口的进程信息
netstat -tuln | grep 3000

## 查看使用端口3000的进程并关掉
sudo lsof -i :3000
## 假如存在进程IDS:00000 关闭进程
kill 00000
-------------本文结束感谢您的阅读-------------