返回文章列表

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),因为:

  1. 真正零内存占用:服务不运行时完全不占内存
  2. 毫秒级启动:第一次请求时快速启动
  3. 系统原生:利用Ubuntu自带功能,稳定可靠
  4. 自动管理: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