第二季度接了一个有意思的任务——用机器学习算法做数据拟合,算法本身没什么,但是如何让一个在python中的算法变成一个有界面的服务就比较有意思了。我刚好又买了一块树莓派3,于是打算把后端程序放在树莓派上运行。经过上一篇的工作,树莓派已经具备python等工具的运行环境,接下来该调试发布程序了……
1. 部署Nginx
安装并启动Nginx
sudo apt-get install nginxsudo /etc/init.d/nginx start创建Nginx配置文件~/webapp/helloflask.conf:
#==========helloflask.conf==========server { listen 80; server_name localhost; charset utf-8; client_max_body_size 75M; location / { try_files $uri @app; } location @app { include uwsgi_params; uwsgi_pass unix:/home/pi/webapp/helloflask_uwsgi.sock; }}#==========helloflask.conf==========这里使用80端口是为了配合Dataplicity的Wormhole:),这样可以直接通过互联网访问Nginx发布的内容。
删除默认配置的软链接:
sudo rm /etc/nginx/sites-enabled/default备份默认配置:
sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak将配置用软链接配置在sites-enabled文件夹中:
sudo ln -s /home/pi/webapp/helloflask_nginx.conf /etc/nginx/sites-enabled/重启Nginx服务:
sudo /etc/init.d/nginx restart此时由于没有运行uwsgi,所以访问 http://192.168.1.106 会出现502错误。(原因很明显,配置文件中的unix:/home/pi/webapp/helloflask_uwsgi.sock并没有被创建)
2. 测试Flask
pip install flask创建flask的hello world程序~/webapp/helloflask.py,内容如下:
#==========helloflask.py==========from flask import Flaskapp = Flask(__name__)
@app.route("/")def hello(): return "Hello World!"
if __name__ == "__main__": app.run(host='0.0.0.0', port=5001)#==========helloflask.py==========测试这个小程序:
python helloflask.py访问 http://192.168.1.106:5001 (我的树莓派IP)出现Hello World!。
3. 部署uWSGI
为了编译uwsgi,需要安装build-essential以及python3.4-dev:
sudo apt-get install build-essential python3.4-dev为了便于包管理,我们依然使用webenv环境,在conda的python3.4.3下uWSGI:
source activate webenvpip install uwsgi为uWSGI编写配置文件,方便以后使用~/webapp/helloflask_uwsgi.ini:
#==========helloflask_uwsgi.ini==========[uwsgi]
chdir = /home/pi/webappmodule = helloflask:app
master = trueprocesses = 1threads = 2
socket = /home/pi/webapp/helloflask_uwsgi.sockchmod-socket = 666vacuum = true
die-on-term = true#==========helloflask_uwsgi.ini==========运行uWSGI:
uwsgi --ini helloflask_uwsgi.ini此时可以看到/home/pi/webapp/helloflask_uwsgi.sock文件生成,再访问http://192.168.1.106则会看到我们的Hello World。
此时在Dataplicity上将Wormhole设为Enabled,就可以通过Wormhole看到这个Hello World了。
另外:常用Nginx命令:
# 启动:sudo nginx# 重载:sudo nginx -s reload# 停止:sudo nginx -s stop# 启动服务:sudo service nginx start# 重启服务:sudo service nginx restart# 停止服务:sudo service nginx stop