使用环境介绍:树莓派3B+,Python3.7
一:Nginx、uWSGI、Flask
为什么要使用Nginx+uWSGI+Flask?
本身来讲使用Flaks就足以算是一个web服务了,即便是没有其他的也并不影响基本的访问,但是Flask本身并不用于生产环境,而是用于开发环境,毕竟你不能让Flask既设计web框架,还要兼顾服务器搭建的完善。而uWSGI就是一个实现了WSGI和uwsgi协议的web服务器,所以使用uWSGI可以实现更强大的功能,负载均衡、处理动态数据等…。而Nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
具体的区别可以看这些:
1. Flask
- 先下载Flask:
sudo pip3 install flask
- 接着部署一个简单的Flask的web服务,文件为test.py:(可以host改为0.0.0.0,这样在同一局域网下的其他电脑才可以访问这个网站,主要用于查看网址是否可用,网址本身是否存在问题!使用树莓派的IP:5000访问,参考:Flask解决5000端口远程访问的问题)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello!'
if __name__ == '__main__':
app.debug = True
app.run(host="0.0.0.0")
- 最后Python3 test.py运行没报错就成功了。
2. uWSGI
- 下载uWSGI:
sudo apt-get install uwsgi uwsgi-plugin-python3
- 建立uWSGI的配置文件uwsgi_config.ini,和test.py同一目录下:
[uwsgi]
socket = 127.0.0.1:5000 # 表示和Nginx通信的地址和端口,和Nginx配置里的uwsgi_pass一致。
processes = 4 # 表示开启多少个子进程处理请求。
threads = 2 # 每个进程的线程数。
plugin = python3 # 加载指定插件
master = true # 启动主进程
pythonpath = /home/pi/.local/lib/python3.7/site-packages # 你的python版本对应库的路径
module = test # 加载项目启动模块,刚才我们创建了test.py,这里就为test
callable = app # Flask项目的实例名称,就是刚才我们创建的实例名
wsgi-file = /home/pi/Code_Statistics_System/manage.py # 启动程序的绝对路径
daemonize = /home/pi/Code_Statistics_System/server.log # 把uwsgi服务器作为后台进程启动,项的值指向一个文件表明后台中的所有输出都重定向到这个日志中去。
py-autoreload = 1 # 当Python文件改动的时候自动更新,不再需要手动重启uWSGI
chdir = /home/pi/Code_Statistics_System # 项目的路径
- 使用命令启动uWSGI服务:
sudo uwsgi --ini uwsgi_config.ini
- 不报错就成功!
- 其实这里面有一个很大的坑在,因为树莓派有Python3和Python2,所以很容易把库安装错了地方导致运行的时候找不到库。并且uWSGI还不太一样,即便你用Python3能正确运行程序不报错,但是你一运行uWSGI就还是报错找不到对应库。这里很关键的地方在于配置文件里的pythonpath属性,使用以下命令可以找到你安装对应Python版本库的地方,把那个地址给pythonpath属性就可以解决问题了! 一般来讲不大用虚拟环境来运行,也有很多坑,除非你很清楚内部的运行逻辑,不然会迷失在文章里!参考:uwsgi no python application found错误的解决(python3+centos6)
pip3 show flask|grep -i location
3. Nginx
- 下载Nginx:
sudo apt-get install nginx
- 修改默认的配置文件/etc/nginx/sites-available/default 如下的地方,我只显示了需要改的地方:
server {
listen 80; # 一般都是默认端口80,访问网站用的
server_name raspberry; # 服务器名称
location / {
include /etc/nginx/uwsgi_params; # 默认填写是这样
uwsgi_pass 127.0.0.1:5000; # 表示和uWSGI通信的地址和端口
}
}
- 保存后启动Nginx服务:
sudo /etc/init.d/nginx start
如此使用树莓派IP:80来访问网站,没有问题就成功了!
4. 开机启动
方法一:向rc.local文件添加启动代码
- 修改rc.local文件:
sudo nano /etc/rc.local
- 在打开的rc.local找到exit 0,在exit 0 之前添加一行代码:
#双引号里面是程序的路径
sudo uwsgi --ini /xxxx绝对路径xxxx/uwsgi_config.ini &
-
特别注意,如果程序是阻塞的,则须加上 & 符号以在后台运行,否则系统无法启动
-
sudo reboot ,重启系统测试
方法二:将程序作为服务启动
- 在/etc/init.d/目录下新建一个服务脚本文件:
#start_test是启动服务文件的名称,自定义
sudo nano /etc/init.d/uwsgi.sh
#!/bin/bash -e
### BEGIN INIT INFO
# Provides: uwsgi_ini
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description: Linux ADB
### END INIT INFO
sudo uwsgi --ini /xxxx绝对路径xxxx/uwsgi_config.ini
- 设置脚本权限:
sudo chmod 777 /etc/init.d/uwsgi.sh
- 将该脚本作为服务设置开机自动加载:
sudo update-rc.d uwsgi.sh defaults
- sudo reboot 重启测试.
Nginx也一样,我推荐第一种方案更简单!
二:参考博文
【Flask】 利用uWSGI和Nginx发布Flask应用