前提准备
1 首先先去了解一下WSGI相关的概念
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
wsgi.ini
五 安装和配置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; # 指定启动程序
}
}
default
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
uwsgi_supervisor.conf
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都不会自动重启。
其他命令