在树莓派上部署Nginx+uWSGI+Flask

第二季度接了一个有意思的任务——用机器学习算法做数据拟合,算法本身没什么,但是如何让一个在python中的算法变成一个有界面的服务就比较有意思了。我刚好又买了一块树莓派3,于是打算把后端程序放在树莓派上运行。经过上一篇的工作,树莓派已经具备python等工具的运行环境,接下来该调试发布程序了……

1. 部署Nginx

安装并启动Nginx

1
2
sudo apt-get install nginx
sudo /etc/init.d/nginx start

创建Nginx配置文件~/webapp/helloflask.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
#==========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发布的内容。

删除默认配置的软链接:

1
sudo rm /etc/nginx/sites-enabled/default

备份默认配置:

1
sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

将配置用软链接配置在sites-enabled文件夹中:

1
sudo ln -s /home/pi/webapp/helloflask_nginx.conf /etc/nginx/sites-enabled/

重启Nginx服务:

1
sudo /etc/init.d/nginx restart

此时由于没有运行uwsgi,所以访问 http://192.168.1.106 会出现502错误。(原因很明显,配置文件中的unix:/home/pi/webapp/helloflask_uwsgi.sock并没有被创建)

2. 测试Flask

1
pip install flask

创建flask的hello world程序~/webapp/helloflask.py,内容如下:

1
2
3
4
5
6
7
8
9
10
11
#==========helloflask.py==========
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

if __name__ == "__main__":
app.run(host='0.0.0.0', port=5001)
#==========helloflask.py==========

测试这个小程序:

1
python helloflask.py

访问 http://192.168.1.106:5001 (我的树莓派IP)出现Hello World!

3. 部署uWSGI

为了编译uwsgi,需要安装build-essential以及python3.4-dev

1
sudo apt-get install build-essential python3.4-dev

为了便于包管理,我们依然使用webenv环境,在conda的python3.4.3下uWSGI:

1
2
source activate webenv
pip install uwsgi

为uWSGI编写配置文件,方便以后使用~/webapp/helloflask_uwsgi.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#==========helloflask_uwsgi.ini==========
[uwsgi]

chdir = /home/pi/webapp
module = helloflask:app

master = true
processes = 1
threads = 2

socket = /home/pi/webapp/helloflask_uwsgi.sock
chmod-socket = 666
vacuum = true

die-on-term = true
#==========helloflask_uwsgi.ini==========

运行uWSGI:

1
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命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 启动:
sudo nginx
# 重载:
sudo nginx -s reload
# 停止:
sudo nginx -s stop
# 启动服务:
sudo service nginx start
# 重启服务:
sudo service nginx restart
# 停止服务:
sudo service nginx stop

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×