努力
奋斗

腾讯云轻量应用服务器Python网站SQLite数据持久化?

服务器

在腾讯云轻量应用服务器上部署 Python 网站并实现 SQLite 数据持久化,是一个常见且高效的技术方案。SQLite 是嵌入式数据库,无需独立服务进程,非常适合轻量级应用。

以下是完整、可操作的步骤指南,涵盖环境搭建、代码示例、数据持久化保障及最佳实践。


✅ 一、前提条件

  1. 已创建腾讯云轻量应用服务器(推荐 Ubuntu 20.04/22.04 或 Debian 11+)
  2. SSH 登录服务器
  3. Python 3.8+ 已安装(大多数 Linux 发行版默认自带或可通过 apt 安装)
# 检查 Python 版本
python3 --version

# 如未安装,执行:
sudo apt update
sudo apt install python3 python3-pip python3-venv -y

✅ 二、项目结构建议

my_webapp/
├── app.py              # Flask/Django 主应用
├── requirements.txt    # 依赖包
├── db/                 # 数据库文件目录(可选,便于管理)
│   └── app.db          # SQLite 数据库文件(自动生成)
└── static/             # 静态资源(CSS/JS/Images)

✅ 三、使用 Flask + SQLite 示例(最小可行项目)

1. 创建虚拟环境并安装依赖

cd ~
mkdir my_webapp && cd my_webapp
python3 -m venv venv
source venv/bin/activate

pip install flask gunicorn
echo "flaskngunicorn" > requirements.txt

2. 编写 app.py

import sqlite3
from flask import Flask, request, jsonify, render_template_string
import os

app = Flask(__name__)

# 设置数据库路径(建议使用绝对路径,避免工作目录问题)
DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'db', 'app.db')

def get_db():
    """获取数据库连接"""
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row  # 支持字典式访问
    return conn

def init_db():
    """初始化数据库表"""
    os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
    conn = get_db()
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            email TEXT NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    ''')
    conn.commit()
    conn.close()

@app.route('/')
def index():
    conn = get_db()
    users = conn.execute('SELECT * FROM users').fetchall()
    conn.close()

    html = '''
    <!DOCTYPE html>
    <html>
    <head><title>User List</title></head>
    <body>
        <h1>Users</h1>
        <form action="/add" method="POST">
            <input name="username" placeholder="Username" required>
            <input name="email" placeholder="Email" required>
            <button type="submit">Add User</button>
        </form>
        <ul>
        {% for user in users %}
            <li>{{ user['username'] }} - {{ user['email'] }}</li>
        {% endfor %}
        </ul>
    </body>
    </html>
    '''
    return render_template_string(html, users=users)

@app.route('/add', methods=['POST'])
def add_user():
    username = request.form.get('username')
    email = request.form.get('email')

    try:
        conn = get_db()
        conn.execute(
            'INSERT INTO users (username, email) VALUES (?, ?)',
            (username, email)
        )
        conn.commit()
        conn.close()
        return f'User {username} added successfully!'
    except sqlite3.IntegrityError:
        return 'Username already exists!', 409

if __name__ == '__main__':
    init_db()
    app.run(host='0.0.0.0', port=5000, debug=True)

3. 测试运行

python app.py

访问 http://<你的服务器公网IP>:5000 即可看到页面。


✅ 四、生产环境部署(使用 Gunicorn)

Flask 开发服务器不适合生产环境,改用 Gunicorn。

1. 安装 Gunicorn

已在 requirements.txt 中声明,确保已安装:

pip install -r requirements.txt

2. 启动 Gunicorn

gunicorn --bind 0.0.0.0:8000 --workers 3 --timeout 120 app:app

⚠️ 注意:

  • --bind 0.0.0.0:8000 表示监听所有接口端口 8000
  • --workers 3 根据 CPU 核心数调整(一般 2~4)
  • --timeout 120 防止长时间请求被杀

3. (可选)配置 Nginx 反向X_X + HTTPS

安装 Nginx

sudo apt install nginx -y

创建 Nginx 配置文件 /etc/nginx/sites-available/mywebapp

server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名或 IP

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/mywebapp /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default  # 移除默认配置
sudo nginx -t  # 测试配置
sudo systemctl restart nginx

(推荐)申请免费 SSL 证书(Let’s Encrypt)

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your_domain.com

✅ 五、SQLite 数据持久化关键要点

1. 数据库文件位置

  • 不要放在 /tmp 或临时目录,重启会丢失。
  • 建议放在项目目录下,如 ./db/app.db,并通过 os.path.abspath() 获取绝对路径。

2. 写入时同步与事务管理

SQLite 默认使用 WAL(Write-Ahead Logging)模式,提升并发性能并确保崩溃恢复能力。

在 init_db() 中启用 WAL:

conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("PRAGMA journal_mode=WAL;")
conn.commit()
conn.close()

3. 备份策略

定期备份 .db 文件:

# 手动备份
cp db/app.db db/app_backup_$(date +%Y%m%d).db

# 或使用 cron 自动备份
crontab -e
# 添加:0 2 * * * cp ~/my_webapp/db/app.db ~/backups/app_$(date +%Y%m%d).db

4. 权限与安全

  • 确保 Web 用户(如 www-data 或运行 Gunicorn 的用户)对 db/ 目录有读写权限:
sudo chown -R $USER:$USER ~/my_webapp/db
chmod 755 ~/my_webapp/db
  • 如果通过 Gunicorn 以非 root 用户运行,确保该用户对数据库文件有写权限。

5. 避免并发写入冲突

SQLite 不支持高并发写入。若预期 QPS > 100,考虑迁移到 PostgreSQL/MySQL。

对于低并发场景,WAL 模式 + 合理超时即可稳定运行。


✅ 六、常见问题排查

问题 解决方案
sqlite3.OperationalError: database is locked 减少并发写入;检查是否有多个进程同时写库;确认使用 WAL 模式
数据库文件为空 确认 init_db() 在项目启动时被调用;检查路径是否正确
权限拒绝 检查文件所有者和权限:ls -l db/app.db,必要时 chmod/chown
Gunicorn 启动失败 检查 app:app 是否指向正确的模块和实例;查看日志:gunicorn ... --log-file -
Nginx 502 Bad Gateway 确认 Gunicorn 正在运行且监听正确端口;检查防火墙规则

✅ 七、进阶优化建议

  1. 使用 Alembic 进行数据库迁移(适合 Django 或大型 Flask 项目)
  2. 引入 Redis 缓存热点数据,减轻 SQLite 压力
  3. 监控磁盘 I/O 和数据库文件大小,设置告警
  4. 使用 systemd 管理 Gunicorn 服务,实现开机自启和崩溃重启

systemd 服务示例 /etc/systemd/system/mywebapp.service

[Unit]
Description=Gunicorn instance to serve my webapp
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/my_webapp
Environment="PATH=/home/ubuntu/my_webapp/venv/bin"
ExecStart=/home/ubuntu/my_webapp/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 --timeout 120 app:app

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable mywebapp
sudo systemctl start mywebapp
sudo systemctl status mywebapp

✅ 总结

步骤 内容
1 创建 Python 虚拟环境,安装 Flask/Gunicorn
2 编写含 SQLite 操作的 Flask 应用,使用绝对路径存储 .db 文件
3 启用 WAL 模式提升并发与安全性
4 使用 Gunicorn + Nginx 部署生产环境
5 配置定期备份、权限控制、systemd 服务管理

SQLite 在轻量级场景中表现优异,只要注意路径、权限、备份、并发限制四大要点,即可实现稳定可靠的数据持久化。

如需进一步扩展(如用户认证、API 接口、Docker 容器化等),可在此基础上继续深化。

未经允许不得转载:轻量云Cloud » 腾讯云轻量应用服务器Python网站SQLite数据持久化?