树莓派上Flask生产服务器与主程序并行运行方案咨询
树莓派Flask应用生产部署方案(同网设备可访问)
你的当前方案在开发环境运行没问题,但生产环境需要更稳定的服务管理、性能更强的Web服务器,同时要保证开机自启和异常恢复能力,以下是具体落地步骤:
一、替换Flask内置开发服务器
Flask自带的app.run()仅适用于开发,生产环境必须用WSGI服务器,这里推荐Gunicorn(轻量易配置),先安装:
pip install gunicorn
代码拆分(规范生产结构)
把数据采集逻辑和Web服务拆成两个独立脚本,避免线程耦合:
data_collector.py(数据采集脚本)
import time import sqlite3 from datetime import datetime import random as rand def databaseSetup(): connSensor = sqlite3.connect('sensorVariables.db') cSensor = connSensor.cursor() cSensor.execute('''CREATE TABLE IF NOT EXISTS sensorVariables (timestamp TEXT, temperature REAL, pressure REAL, humidity REAL)''') return connSensor, cSensor def main(): connSensor, cSensor = databaseSetup() i = 0 while True: print("Still running main worker: ", i) temperature = rand.randint(12,25) pressure = rand.randint(1020, 1200) humidity = rand.randint(40,80) timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cSensor.execute("INSERT INTO sensorVariables VALUES (?, ?, ?, ?)", (timestamp, temperature, pressure, humidity)) connSensor.commit() print("Sensor variables saved") i += 1 time.sleep(5) if __name__ == '__main__': main()
app.py(Flask Web服务)
from flask import Flask import sqlite3 app = Flask(__name__) @app.route('/') def index(): conn = sqlite3.connect('sensorVariables.db') c = conn.cursor() c.execute('SELECT temperature, humidity, pressure, timestamp FROM sensorVariables ORDER BY timestamp DESC LIMIT 1') latest_data = c.fetchone() conn.close() if latest_data: temperature, humidity, pressure, timestamp = latest_data return f'Time: {timestamp}, Temperature: {temperature}, Humidity: {humidity}, Pressure: {pressure}' return 'No data available yet'
二、用Gunicorn启动Web服务
在项目目录下执行命令,启动多进程Web服务:
gunicorn -w 2 -b 0.0.0.0:5000 app:app
-w 2:启动2个工作进程(根据树莓派核心数调整,比如Pi 4可设为4)-b 0.0.0.0:5000:绑定所有网卡的5000端口,确保同网设备能访问
三、后台托管+开机自启
用systemd管理两个进程,确保它们后台运行、异常崩溃自动重启、开机自动启动。
1. 创建数据采集服务配置
编辑/etc/systemd/system/data-collector.service:
[Unit] Description=Sensor Data Collector After=network.target [Service] User=pi WorkingDirectory=/home/pi/你的项目目录路径 ExecStart=/usr/bin/python3 /home/pi/你的项目目录路径/data_collector.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
2. 创建Flask服务配置
编辑/etc/systemd/system/flask-sensor.service:
[Unit] Description=Flask Sensor Dashboard After=network.target data-collector.service [Service] User=pi WorkingDirectory=/home/pi/你的项目目录路径 ExecStart=/usr/local/bin/gunicorn -w 2 -b 0.0.0.0:5000 app:app Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
3. 启动并启用服务
# 重新加载systemd配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start data-collector.service sudo systemctl start flask-sensor.service # 设置开机自启 sudo systemctl enable data-collector.service sudo systemctl enable flask-sensor.service
四、确保同网设备可访问
- 获取树莓派局域网IP:执行
hostname -I,得到类似192.168.1.100的地址 - 同网设备在浏览器访问
http://192.168.1.100:5000即可查看数据 - 若访问失败,检查防火墙:树莓派默认无防火墙,若手动开启则放行5000端口:
sudo ufw allow 5000/tcp
五、额外优化建议
- SQLite连接优化:在Flask中启用连接池,避免每次请求新建连接,可添加
check_same_thread=False参数,或使用Flask-SQLAlchemy简化操作 - 端口简化:若想不用加端口访问,可将Gunicorn绑定80端口(需授权):
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/gunicorn
之后修改服务配置中的-b 0.0.0.0:80即可
内容的提问来源于stack exchange,提问作者Hjalte
相关产品推荐
相关产品推荐

