返回文章列表
vps需要的时候启动
@admin
标签:
分类:
后端技术
创建: 2025-07-26 07:43
更新: 2025-07-26 07:43
浏览: --次
很好!Ubuntu 24对systemd支持很完善,我推荐几个最适合的方案:
方案1:systemd socket activation (最推荐)
1. 创建你的web应用
// app.js - 简单的Node.js示例
const http = require('http');
const mysql = require('mysql2/promise');
const server = http.createServer(async (req, res) => {
try {
// 按需连接数据库
const connection = await mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'your_password',
database: 'your_db'
});
const [rows] = await connection.execute('SELECT NOW() as time');
await connection.end();
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({message: 'Hello', time: rows[0].time}));
} catch (error) {
res.writeHead(500);
res.end('Error: ' + error.message);
}
});
// 重要:监听systemd传入的socket
server.listen(process.env.LISTEN_FDS ? {fd: 3} : 3000);
2. 配置systemd服务
# 创建socket配置
sudo tee /etc/systemd/system/myapp.socket > /dev/null << EOF
[Unit]
Description=MyApp Socket
Requires=myapp.service
[Socket]
ListenStream=3000
Accept=false
[Install]
WantedBy=sockets.target
EOF
# 创建服务配置
sudo tee /etc/systemd/system/myapp.service > /dev/null << EOF
[Unit]
Description=MyApp Service
Requires=myapp.socket
[Service]
Type=notify
ExecStart=/usr/bin/node /path/to/your/app.js
Restart=on-failure
RestartSec=3
User=www-data
Group=www-data
Environment=NODE_ENV=production
Environment=LISTEN_FDS=1
[Install]
WantedBy=multi-user.target
EOF
3. 启用服务
sudo systemctl daemon-reload
sudo systemctl enable myapp.socket
sudo systemctl start myapp.socket
# 检查状态
sudo systemctl status myapp.socket
方案2:Docker + 按需启动脚本
1. 创建Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
2. 创建启动脚本
# /usr/local/bin/start-myapp.sh
#!/bin/bash
CONTAINER_NAME="myapp"
IMAGE_NAME="myapp:latest"
# 检查容器是否运行
if ! docker ps | grep -q "$CONTAINER_NAME"; then
echo "Starting container..."
# 停止并删除已存在的容器
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
# 启动新容器
docker run -d --name "$CONTAINER_NAME" \
-p 3000:3000 \
--restart unless-stopped \
"$IMAGE_NAME"
# 等待服务启动
sleep 2
fi
3. 配置Nginx反向代理
sudo apt update
sudo apt install nginx
# 创建配置文件
sudo tee /etc/nginx/sites-available/myapp > /dev/null << EOF
server {
listen 80;
server_name your-domain.com; # 或者 localhost
location / {
# 启动应用
access_by_lua_block {
os.execute("/usr/local/bin/start-myapp.sh")
}
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
}
EOF
# 启用站点
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
方案3:使用faasd (轻量级OpenFaaS)
# 安装faasd
curl -sSL https://cli.openfaas.com | sudo sh
git clone https://github.com/openfaas/faasd --depth=1
cd faasd
sudo ./hack/install.sh
# 创建函数
mkdir my-function && cd my-function
cat > handler.js << EOF
'use strict'
module.exports = async (event, context) => {
const mysql = require('mysql2/promise');
const connection = await mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'your_password',
database: 'your_db'
});
const [rows] = await connection.execute('SELECT * FROM users LIMIT 10');
await connection.end();
return context.succeed({
statusCode: 200,
body: {users: rows}
});
}
EOF
# 部署
faas-cli up -f my-function.yml
推荐配置
对于Ubuntu 24,我最推荐方案1(systemd socket activation),因为:
- 真正零内存占用:服务不运行时完全不占内存
- 毫秒级启动:第一次请求时快速启动
- 系统原生:利用Ubuntu自带功能,稳定可靠
- 自动管理:systemd自动处理进程生命周期
你想试试哪个方案?我可以帮你详细配置!
绝对可以!这是个很棒的想法,类似于轻量级的PaaS平台。我来设计一个完整的管理系统架构:
项目架构设计
SystemD Socket Manager - 轻量级项目管理平台
核心功能
1. 项目管理
- 创建、删除、启停项目
- 支持多种技术栈:Flask, Node.js, Rails, Go Gin, Echo等
- 自动生成systemd配置文件
- 端口自动分配和管理
2. 技术栈适配器
支持的框架:
├── Python
│ ├── Flask
│ ├── Django
│ ├── FastAPI
│ └── Tornado
├── Node.js
│ ├── Express
│ ├── Koa
│ ├── Fastify
│ └── Next.js
├── Go
│ ├── Gin
│ ├── Echo
│ ├── Fiber
│ └── Chi
├── Ruby