前提准备
1 首先先去了解一下WSGI相关的概念
https://www.cnblogs.com/sunch/p/10711267.html
https://segmentfault.com/a/1190000011365430#articleHeader6
2 环境准备
ubuntu16.0.4 # linux 发行版本, 详情见google python3 # python3环境 nginx # web服务器, 是客户端与uWSGI中间的代理(桥梁)
# 更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。 wWSGI # web服务器, 是nginx与flask程序中间的代理(桥梁) # 实现了WSGI协议、uwsgi协议、http协议等。 virtualenv # 虚拟环境, 为了将程序的运行环境与全局的环境隔离开 supervisor # 是基于 python 的任务管理工具, 用来自动运行各种后台任务, 这里用来运行uWSGI(而uWSGI用来代理运行flask程序) flask # 基于flask框架编写出来的web程序 (flask项目通过 python manage.py runserver 启动 # 请使用flask-script)
流程
1 Web浏览器发送HTTP请求给Nginx
2 Nginx转发给uWSGI
3 uWSGI将其按照WSGI规范进行处理
4 uWSGI将HTTP请求给到Flask应用进行处理
5 Flask应用对HTTP请求进行处理
- 比如查询数据库获取信息
- 比如将信息拼装成HTML网页
6 Flask产生HTTP应答,按照WSGI规范给到uWSGI
7 uWSGI将HTTP应答以TCP方式发给Nginx
8 Nginx将HTTP应答以TCP方式发给Web浏览器
一 安装Python环境
1 先安装基础库,再安装python3
sudo apt-get install -y python3-dev build-essential libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev libcurl4-openssl-dev
sudo apt-get install -y python3
2 还需要安装pip3
sudo apt-get install -y python3-pip
二 上传项目
1 先创建文件夹 /home/www
mkdir /home/www
2 先进到/home/www/
cd /home/www
3 把项目上传到此目录
可以使用ftp工具, lrzsz
4 解压项目文件
apt install unzip
unzip movie_top.zip
5 进入项目目录
cd movie_top
三 创建虚拟环境venv
0 先安装virtualenv
pip3 install virtualenv
1 创建虚拟环境venv
### 指定python3版本
sudo virtualenv -p /usr/bin/python3 venv
2 启动虚拟环境
source /home/www/movie_top/venv/bin/activate
3 安装项目依赖
pip3 install -r requirements.txt
四 使用uWSGI对接Flask
1 进入虚拟环境后安装uwsgi
# 在虚拟环境下不需要使用 sudo ,因为virtualenv 是没有权限要求的。
pip3 install uwsgi
2 配置uwsgi
vi wsgi.ini
[uwsgi] # uwsgi 启动时所使用的地址与端口 socket = 127.0.0.1:5000 # 指向网站目录 chdir = /home/www/movie_top # python 启动程序文件 wsgi-file = manage.py # python 程序内用以启动的 application 变量名 callable = app # 处理器数 processes = 4 # 线程数 threads = 2 #状态检测地址 stats = 127.0.0.1:9191
五 安装和配置nginx
1 安装nginx
sudo apt-get install nginx
2 配置 nginx
a,先看一下nginx的配置文件在哪
/usr/sbin/nginx -t
b,覆盖默认配置文件
vi /etc/nginx/sites-available/default
server { listen 80; server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:5000; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理 uwsgi_param UWSGI_PYHOME /home/www/movie_top/venv; # 指向虚拟环境目录 uwsgi_param UWSGI_CHDIR /home/www/movie_top; # 指向网站根目录 uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序 } }
3 重启 nginx
随便选择一种方式重启
方式一
/usr/sbin/nginx -t # 先测试一下配置文件有没有问题
sudo service nginx restart # 重启 等同 --> systemctl restart nginx
方式二
/usr/sbin/nginx -t # 先测试一下配置文件有没有问题 systemctl stop nginx # 先停止nginx systemctl start nginx # 再启动nginx
六 启动Flask程序
方式一: 使用uwsgi启动程序
方式一:
uwsgi --ini /home/www/movie_top/wsgi.ini # 相当于启动flask项目
方式二:
升级版: 后台运行uwsgi # 推荐使用supervisor方式启动项目, 同样可以在后台运行, 但supervisor支持高可用
uwsgi -d --ini /home/www/movie_top/wsgi.ini
方式二: 使用supervisor启动程序 (推荐)
supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,
当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。
1 安装supervior
sudo apt-get install supervisor
# 配置文件路径
/etc/supervisor/supervisor.conf
正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的配置文件放在下面的目录下即可
/etc/supervisor/conf.d/
2 配置supervisor
下面我们建立一个用于启动uwsgi(其中flask程序又由uwsgi启动)的supervisor配置(命名为uwsgi_supervisor.conf)
vi /etc/supervisor/conf.d/uwsgi_supervisor.conf
[program:movie_top] # 启动命令入口 command=/home/www/movie_top/venv/bin/uwsgi /home/www/movie_top/wsgi.ini # 命令程序所在目录 directory=/home/www/movie_top #运行命令的用户名 user=root # 高可用配置 autostart=true autorestart=true #日志地址 stdout_logfile=/home/www/movie_top/logs/uwsgi_supervisor.log
3 启动服务
3.1 启动前先创建日志文件
不创建,好像会报错
cd /etc/supervisor/conf.d/ vi uwsgi_supervisor.conf mkdir /home/www/movie_top/logs vi /home/www/movie_top/logs/uwsgi_supervisor.log # 随便写点内容
3.2 启动supervisor
方式一: (推荐吧)
启动服务 sudo service supervisor start # 终止服务 sudo service supervisor stop
方式二:
supervisord -c /etc/supervisor/supervisord.conf # supervisorctl 进入交互模式 start movie_top # movie_top就是那个配置文件的项目名称 stop movie_top
# 其他的使用
一、添加好配置文件后 二、更新新的配置到supervisord supervisorctl update 三、重新启动配置中的所有程序 supervisorctl reload 四、启动某个进程(program_name=你配置中写的程序名称) supervisorctl start program_name 五、查看正在守候的进程 supervisorctl 六、停止某一进程 (program_name=你配置中写的程序名称) pervisorctl stop program_name 七、重启某一进程 (program_name=你配置中写的程序名称) supervisorctl restart program_name 八、停止全部进程 supervisorctl stop all 注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。