nginx+uwsgi+flask+supervisor 项目部署
环境
- linux: ubuntu 16.04 - uwsgi 2.0.18 - flask 1.0.2 - supervisor 3.2.0 - nginx/1.8.1
首先区分几个概念
- wsgi
- web server gateway interface (web服务器网管接口)
- 是一种规范,是web服务器和web应用(django/flask) 之间的接口,是二者之间的通信桥梁
- 没有官方的实现,更像是一个协议,约定俗成的,规定wsgi application 应该实现为一个可调用的对象。只要遵循这些协议,wsgi应用都可以在任何服务器上运行
- uwsgi
- 是一个web服务器,实现了wsgi协议,uwsgi、http等协议
- 代码完全用c编写,效率高性能稳定,用于接收前端服务器转发的动态请求并处理后给web应用程序
- uwsgi
是uwsgi服务器实现的独有的协议,是一种传输协议,用户uwsgi与其他服务器间通信(
如与nginx之间通信)
在django中启动文件是wsgi.py, 该文件在生成django目录的时候便会自动生成,用于web server 与 django 通信,相当于提供了一个可调用的application对象,在这个类中实现了call方法。
在flask 中 app = flask(name) 所在的启动文件 manager.py 便是与web server 进行通信的 application可调用对象
简单的服务器项目准备
新建一个项目并写一个简单的flask web 服务器app
目录~/desktop/flask_deploy/manager.py
1 # coding=utf8 2 from flask import flask 3 4 app = flask(__name__) 5 6 7 @app.route('/', methods=['get']) 8 def index(): 9 return 'hello world' 10 11 12 if __name__ == '__main__': 13 app.run(debug=false)
1 配置python项目虚拟环境
- 安装虚拟环境管理工具
pip install virtualenv virtualenvwrapper
- 编辑主目录下的.bashrc文件,添加以下内容
export workon_home=$home/.virtualenvs # ./virtualvenvs便是虚拟环境安装目录 source /urs/local/bin/virtualenvwrapper.sh
可以通过whereis virtaulenvwrapper.sh 查找该源文件
-
执行以下命令使配置生效
source ./bashrc
- 相关命令
mkvirtualenv -p python3 env_name # -p 指定python环境 workon + tab*2 # 查看本机下有哪些虚拟环境 workon env_nmae # 进入虚拟环境 deactivate # 退出虚拟环境 rmvirtualenv env_name # 删除虚拟环境
2 uwsgi安装与配置
在当前虚拟环境下,进行安装相应包
pip install falsk uwsgi
在当前项目目录下创建文件 ~/desktop/flask_deploy/uwsgi.ini
vi uwsgi.ini
[uwsgi] # 使用nginx连接时使用socket通信 socket=127.0.0.1:8000 # 直接使用自带web server 使用http通信 #http=127.0.0.1:8000 # 指定项目目录 chdir=/home/python/desktop/flask_deploy # 指定python虚拟环境 home=/home/python/.virtualenvs/deploy # 指定加载的wsgi文件 wsgi-file=manager.py # 指定uwsgi加载的模块中哪个变量将被调用 callable=app # 设置工作进程的数量 processes=2 # 设置每个工作进程的线程数 threads=2 # 将主进程pid写到指定的文件 pidfile=%(chdir)/uwsgi.pid # 日志文件 req-logger=file:/home/python/desktop/flask_deploy/log/req.log logger=file:/home/python/desktop/flask_deploy/log/err.log #uid=xxx # uwsgi服务器运行时的用户id,未设置则为当前启动的用户 #gid=xxx # uwsgi服务器运行时的用户组id #procname-prefix-spaced=site # 指定工作进程名称的前缀
配置文件中指定wsgi启动文件有几种方式
# 指定加载的wsgi文件 wsgi-file=manager.py # 指定uwsgi加载的模块中哪个变量将被调用 callable=app
# 模块名:可调用对象app module=manager:app
module=manager callable=app
uwsgi相关命令
uwsgi --ini uwsgi.ini # 启动 uwsgi --stop uwsgi.pip # 停止 pkill -9 uwsgi # 停止
3 supervisor 安装与监控
简介: supervisor就是用python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
安装:
apt-get install supervisor
默认配置文件在/etc/supervisro/supervisord.conf, 自己开发可以将配置文件写在 /etc/supervisor/conf.d/目录下,文件扩展名必须为*.conf
配置解释
[program:uwsgi] command=/home/python/.virtualenvs/deploy/bin/uwsgi /home/python/desktop/flask_deploy/uwsgi.ini user=root autostart=true autorestart=true stdout_logfile=/home/python/desktop/flask_deploy/log/uwsgi_supervisor.log stderr_logfile=/home/python/desktop/flask_deploy/log/uwsgi_supervisor_err.log
- [program:module_name]表示supervisor的一个模块名 - command 程序启动命令如: /usr/bin/python - app.py - user 进程运行的用户身份 - autostart=true 跟随supervisor一起启动 - autorestart=true 挂掉之后自动重启 - stderr_logfile, stdout_logfile 标准输出,错误日志文件
启动supervisor
sudo supervisord -c /etc/supervisor/supervisord.conf # supervisord.conf 会自动包含conf.d/目录下的conf文件
相关命令
1️⃣supervisorctl status # 查看启动的项目 2️⃣supervisorctl start module_name # 启动项目 3️⃣supervisorctl stop module_name # 停止木箱 4️⃣supervisorctl shutdown # 关闭所有项目和服务
启动后可以 ps -aux | grep 查看 uwsgi 和supervisor 都在运行了
4 nginx安装与配置
apt-get install nginx
默认安装在/etc/nginx/目录下
配置目录 /etc/nginx/conf/flask_deploy.conf
http { include mime.types; default_type application/octet-stream; server { listen 80; server_name 127.0.0.1; #公网地址 location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; } } }
启动
usr/sbin/nginx -c /etc/nginx/conf/flask_deploy.conf
相关命令:
1️⃣nginx -s reload 2️⃣nginx -s stop
nginx 详细介绍及语法参考:
不出意外的话浏览器访问:127.0.0.1即可出现hello world。
部署负载均衡
nginx+uwsgi+flask+supervisor部署负载均衡,
- 只需要在项目目录下加一个uwsgi2.ini文件(uwsgi 应用启动配置),修改soket ip,pipfile,logfile路径即可
- 再根据以上步骤在supervisor 配置文件中增加一个uwsgi2的监控模块,增加相应配置
- nginx 负载均衡配置
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; upstream flask { server 127.0.0.1:8000; server 127.0.0.1:8001; } server { listen 80; server_name 127.0.0.1; #公网地址 location / { include uwsgi_params; uwsgi_pass flask; proxy_ } } }
如此,便配置了一个简单的负载均衡的服务器。访问127.0.0.1,同时用tail 命令查看 两个uwsgi配置中文件中设置的req_logfile 可以观察到流量分发的现象。
小结
suervisor 是个后台进程管理工具,不仅局限于监控uwsgi 服务器,还可以监控其他 可能意外宕机的服务程序。
其他
相对的可作为web服务器的还有gunicorn 是从ruby 的(unicorn)移植的python http 服务器,兼容各种框架,不需要写配置文件,轻量级的资源消耗.
安装
pip install gunicorn
启动服务器
gunicorn -w 4 -b 127.0.0.1:8080 manager:app --daemon # 已守护进程方式启动,默认为false
gunicorn 以配置文件方式启动
文件名 gunicorn.conf
# 指定web服务器监听的if和端口 bind = '127.0.0.1:8080' # 指定工作进程 workers = 4 # 指定服务器后台运行 daemon = true # 保存主进程id pidfile = 'gunicorn.pid' # 启动服务器之后生成 access.log 保存访问日志 accesslog = 'access.log' # 启动服务器之后生成 errorlog , 保存错误日志 errorlog = 'error.log'
启动方式:
gunicorn -c gunicorn.conf manager:app