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 查找该源文件
inux命令和文件查找
- 执行以下命令使配置生效
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 详细介绍及语法参考: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
Reference
Linux后台进程管理利器:supervisor
flask+nginx+uwsgi+supervisor项目部署
nginx+uwsgi+flask+supervisor 项目部署的更多相关文章
- 学习VirtualEnv和Nginx+uwsgi用于django项目部署
以下叙述中用到的操作系统:Linux CentOS 6.X. 最近几天了解一下VirtualEnv,Apache+Daemon mode,Nginx+uwsgi的概念,并且在项目中实验性部署了一下(目 ...
- Ubuntu下nginx+uwsgi+flask的执行环境搭建
选择web framwork是个非常艰难的事情, 主要分为轻量级和重量级框架. 因为没有搭建站点这样的须要, 所以回避SSH, Django这样的框架, 而选择一个轻量级框架. 自己也比較青睐pyth ...
- 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程
Flask框架有自带的http server,但是缺点非常明显,并发能力,及时响应非常差,只适合开发时自测使用. 在我接触过的项目中,生产环境使用nginx+uWSGI+flask应用程序进行部署服务 ...
- Ubuntu下使用Nginx+uWSGI+Flask(初体验)
Ubuntu 18.04,Nginx 1.14.0, uWSGI 2.0.17.1,Flask, 前言 Windows不支持uWSGI!为了上线自己的项目,只能选择Linux. 自己前面开发了一个Fl ...
- nginx+uwsgi+django+supervisor+mysql+redis
目录 1. 概述 3 2. 安装与配置 3 2.1 django项目与应用创建 3 2.2 uwsgi安装与配置 6 2.3 supervisor安装与配置 8 2.4 nginx安装与作为反向代理服 ...
- nginx+uwsgi+flask 服务器配置
注:每个机器,软件版本可能不一样,虽然网上有很多类似的帖子,但是我在搭建的时候遇到了不少的坑,此文仅供参考. 请求流程: 1.安装uwsgi uwsgi是一个应用服务器,非静态文件的网络请求就必须通过 ...
- Docker构建nginx+uwsgi+flask镜像(二)
Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...
- Docker构建nginx+uwsgi+flask镜像(一)
前言 笔者之前是从事Java方面的工作,自从18年5月左右来到新的公司,接触到Python,被其简单优雅的语法风格深深吸引,同时,新公司也帮助笔者打开Docker世界的大门,让笔者体会到“一次打包,到 ...
- nginx+uwsgi+virtualenv+supervisor部署项目
一.导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的 ...
随机推荐
- 我为什么用docker-compose来打包开发环境
BUILD, SHIP, RUN Docker is the world's leading software containerization platform Docker的出现,让虚拟技术更上一 ...
- CSS的下拉菜单被挡住,修改Z-INDEX也不成功
CSS的下拉菜单被挡住,修改Z-INDEX也不成功 做了一个鼠标放上去就出现的下拉菜单,但是这个下拉的内容被挡住了. Z-INDEX 是设置不同块的层次的,我修改了问题还是有. 后来发现是必须要把该便 ...
- 131.004 监督学习项目 | 为CharityML寻找捐献者
监督学习: 为CharityML寻找捐献者 开始 在这个项目中,你将使用1994年美国人口普查收集的数据,选用几个监督学习算法以准确地建模被调查者的收入.然后,你将根据初步结果从中选择出最佳的候选 ...
- Volley1--为什么说Volley适合数据量小,通信频繁的网络操作
前言 网络编程对于客户端来说是一块及其重要的地方,使用高效的网络请求框架将为你的系统产生很大的影响.而Volley作为谷歌的一个开源项目,炙手可热.有很多中小型公司的安卓移动客户端的网络程序都是基于v ...
- TCP状态统计 - 脚本命令
一.netstat命令说明 netstat常见参数 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示 ...
- 支持xcode6的缓动函数Easing以及使用示例
支持xcode6的缓动函数Easing以及使用示例 用xcode6新建工程后,直接导致不支持之前的Easing缓动函数的代码,经过修改后就可以正常使用了,虽然比不上POP高大上的动画,但用缓动函数的动 ...
- 网站url常见报错
报错情况比较复杂,此处列出比较常见的几种报错内容: 报错: 报错是一个大类, 的报错基本上是权限问题,出现 报错时您需要检测权限配置问题. 403.1 错误是由于“执行”访问被禁止而造成的.若试图从目 ...
- Linux telnet命令详解
telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户 ...
- ASP.NET Core 编码、web编码、网页编码 System.Text.Encodings.Web
System.Text.Encodings.Web 空间包含表示 Web 编码器的基类.表示 HTML.JavaScript 和 Url 字符编码的子类,以及表示仅允许编码特定字符.字符范围或码位的筛 ...
- 深入浅出SharePoint2010——请假系统无代码篇之权限设计
首选我们需要区分3个跟权限相关的概念. 权限项目(Permission):最小的权限粒度.比如创建列表项.审批等. 权限级别(Permission Level):权限项目不能直接赋予用户或者用户组,只 ...