在腾讯云轻量应用服务器上部署 Python 网站并实现 SQLite 数据持久化,是一个常见且高效的技术方案。SQLite 是嵌入式数据库,无需独立服务进程,非常适合轻量级应用。
以下是完整、可操作的步骤指南,涵盖环境搭建、代码示例、数据持久化保障及最佳实践。
✅ 一、前提条件
- 已创建腾讯云轻量应用服务器(推荐 Ubuntu 20.04/22.04 或 Debian 11+)
- SSH 登录服务器
- 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 正在运行且监听正确端口;检查防火墙规则 |
✅ 七、进阶优化建议
- 使用 Alembic 进行数据库迁移(适合 Django 或大型 Flask 项目)
- 引入 Redis 缓存热点数据,减轻 SQLite 压力
- 监控磁盘 I/O 和数据库文件大小,设置告警
- 使用 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