在腾讯云轻量应用服务器上部署 Python 网站并使用 SQLite进行数据持久化,是一个常见且高效的方案。SQLite 是文件级数据库,无需单独安装数据库服务(如 MySQL/PostgreSQL),非常适合轻量级应用、个人博客、小型管理系统等场景。
以下是完整的实施指南,涵盖环境配置、代码示例、安全注意事项和最佳实践。
✅ 一、前提条件
- 腾讯云轻量应用服务器已创建并运行 Linux 系统(推荐 Ubuntu 20.04+ 或 CentOS 7+)。
- 已安装 Python 3.8+ 和 pip。
- 已部署 Web 框架(如 Flask、Django、FastAPI 等)。
- 服务器防火墙已开放所需端口(如 80/443 用于 HTTP/HTTPS,或通过 Nginx/Gunicorn 反向X_X)。
✅ 二、安装依赖
1. 安装 Python 和 pip(若未安装)
# Ubuntu/Debian
sudo apt update
sudo apt install python3 python3-pip python3-venv
# CentOS/RHEL
sudo yum install python3 python3-pip
2. 创建虚拟环境(推荐)
python3 -m venv venv
source venv/bin/activate
3. 安装 Web 框架和 SQLite 支持
SQLite 是 Python 内置模块(sqlite3),无需额外安装。但你需要安装 Web 框架:
# 以 Flask 为例
pip install flask gunicorn
# 以 Django 为例
pip install django gunicorn
# 以 FastAPI 为例
pip install fastapi uvicorn[standard]
✅ 三、SQLite 数据持久化实现示例(Flask + SQLite)
1. 项目结构
myapp/
├── app.py
├── instance/
│ └── app.db # SQLite 数据库文件(由程序自动创建)
└── requirements.txt
⚠️
instance/目录是 Flask 默认存放实例相关数据(如数据库)的位置,建议不要提交到 Git。
2. app.py 示例代码
import sqlite3
from flask import Flask, request, jsonify, g
app = Flask(__name__)
def get_db():
"""获取数据库连接"""
if 'db' not in g:
g.db = sqlite3.connect('instance/app.db')
g.db.row_factory = sqlite3.Row
return g.db
@app.teardown_appcontext
def close_db(exception):
"""关闭数据库连接"""
db = g.pop('db', None)
if db is not None:
db.close()
def init_db():
"""初始化数据库表"""
db = get_db()
db.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
)
''')
db.commit()
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
username = data.get('username')
email = data.get('email')
if not username or not email:
return jsonify({'error': 'Username and email are required'}), 400
try:
db = get_db()
db.execute(
'INSERT INTO users (username, email) VALUES (?, ?)',
(username, email)
)
db.commit()
return jsonify({'message': 'User created successfully'}), 201
except sqlite3.IntegrityError:
return jsonify({'error': 'Username already exists'}), 409
@app.route('/users', methods=['GET'])
def get_users():
db = get_db()
users = db.execute('SELECT * FROM users').fetchall()
return jsonify([dict(user) for user in users])
if __name__ == '__main__':
with app.app_context():
init_db()
app.run(host='0.0.0.0', port=5000)
3. 使用 Gunicorn 启动生产环境
gunicorn --bind 0.0.0.0:8000 app:app
✅ 四、Nginx 反向X_X(可选但推荐)
1. 安装 Nginx
sudo apt install nginx # Ubuntu
sudo yum install nginx # CentOS
2. 配置 Nginx 反向X_X
编辑 /etc/nginx/sites-available/myapp:
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用配置并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
✅ 五、安全与最佳实践
1. 数据库文件权限
确保只有 Web 用户能读写数据库文件:
sudo chown www-data:www-data instance/app.db
sudo chmod 660 instance/app.db
注意:如果使用 Gunicorn,需确认其运行用户(默认可能是
www-data或当前用户)。
2. 定期备份 SQLite 数据库
SQLite 是单文件数据库,可直接复制备份:
# 手动备份
cp instance/app.db instance/app_backup_$(date +%Y%m%d).db
# 自动化备份(crontab)
crontab -e
# 添加以下行,每天凌晨2点备份
0 2 * * * cp /path/to/your/project/instance/app.db /backup/dir/app_$(date +%Y%m%d).db
3. 避免并发写入问题
SQLite 在高并发写入时可能遇到锁竞争。解决方案:
- 使用 WAL 模式提升并发性能:
db.execute('PRAGMA journal_mode=WAL;')
-
考虑将写操作队列化或使用消息队列(如 Redis + Celery)异步处理。
-
如果数据量增长快,考虑迁移到 PostgreSQL 或 MySQL。
4. 使用环境变量管理配置
import os
DATABASE_PATH = os.getenv('DATABASE_PATH', 'instance/app.db')
5. 启用 HTTPS(推荐)
使用 Let’s Encrypt 免费证书:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com
✅ 六、监控与维护
1. 查看日志
# Gunicorn 日志
tail -f /var/log/gunicorn/error.log
# Nginx 日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
2. 检查磁盘空间
SQLite 数据库随数据增长而变大,定期检查:
du -sh instance/app.db
3. 监控数据库健康
可集成 SQLAlchemy 或 Peewee 等 ORM,便于后续迁移和扩展。
✅ 七、常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
OperationalError: database is locked |
并发写入冲突 | 启用 WAL 模式;减少并发写;改用其他数据库 |
Permission denied |
文件权限不足 | 检查 chown/chmod;确认 Gunicorn 运行用户 |
| 数据库未创建 | 未调用 init_db() |
确保在应用启动时执行初始化 |
| 静态资源无法访问 | Nginx 未配置静态文件 | 在 Nginx 中添加 location /static/ 块 |
✅ 八、总结
| 步骤 | 内容 |
|---|---|
| 1 | 安装 Python、pip、Web 框架 |
| 2 | 创建虚拟环境,安装依赖 |
| 3 | 编写 Python 代码,使用 sqlite3 模块 |
| 4 | 初始化数据库表 |
| 5 | 使用 Gunicorn 启动应用 |
| 6 | 配置 Nginx 反向X_X |
| 7 | 设置权限、备份、监控 |
| 8 | 启用 HTTPS,优化性能 |
如需进一步扩展(如用户认证、分页查询、ORM 集成、容器化部署等),可继续深入。欢迎提供具体需求,我可给出更针对性的方案。
云服务器