Python Web 部署: 使用 flask + gunicorn + supervisor + nginx

  • flask   python 的服务器框架
  • gunicorn   webservice,WSGI 的容器
  • supervisor   进程管理工具
  • nginx   一个高性能的 web 服务器

创建项目

mkdir server

先为应用创建一个路径

构建 Python 的虚拟环境

我们使用 virtualenv 来构建一个系统中不同的 python 隔离环境, virtualenv 的使用十分的简单,安装使用方法可以看这里virtualenv

cd server // cd 切换到我们的项目目录
virtualenv venv // 构建我们的虚拟环境

创建了 venv 环境后,我们需要激活才能使用(有时是自动激活),激活后可以看见控制台前面有 (venv)

source venv/bin/activate

关闭环境直接使用 deactivate

deactivate

安装 flask 框架

安装的虚拟环境里面已经自动安装了 pip,我们使用 pip 可以很简单快捷的安装 flask

pip install flask

flask 已经安装好了,我们可以通过一个小应用来测试一下我们的flask 框架, 'vim myapp.py' 创建一个 python 文件

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world !'

if __name__ = '__main__':
    app.debug = True
    app.run()

启动脚本

python myapp.py

此时,使用浏览器访问 http://127.0.0.1:5000 就能看见网页显示的 hello world !

使用 gunicorn 部署 python web

刚才打开的是 flask 自带的服务器,完成了 web 服务的启动。但是 flask 自带的服务器一般是用来调试使用的,性能不佳。这里我们使用 gunicorn 作为 wsgi 的容器,用来部署 python。

安装 gunicorn
pip install gunicorn

pip 是 python 的管理包工具。随着项目增长,你会发现它的依赖列表也一并随着增长。在你能运行一个Flask应用之前,即使已经需要数以十记的依赖包也毫不奇怪。 管理依赖的最简单的方法就是使用一个简单的文本文件。 pip可以生成一个文本文件,列出所有已经安装的包。它也可以解析这个文件,并在新的系统(或者新的环境)下安装每一个包。

pip freeze > requirements.txt # 生成txt 文件

pip install -r requirements.txt # 别人使用时可以直接安装所有的包

以后每次 pip 安装了新的库的时候,都需 freeze 一次,保证更新

接下来我们就是用 gunicorn 来启动 flask

gunicorn -w 4 -b 0.0.0.0:8000 myapp:app

此时我们使用8000端口进行访问,-w 表示开启了多少个 worker, -b 表示访问地址。myapp 就是 myapp.py 的文件名,mypp.py 相当于一个库文件被 gunicorn 调用。app 则是 myapp.py 里创建的 app,这样 gunicorn 才可以定位 flask 应用。
想结束 gunicorn 可以通过执行 pkill gunicorn,有时还要找到 pid 才能 kill 掉。这样的操作过于繁琐,所以我们使用另一个神器 supervisor, 用来专门管理系统的进程。

安装 supervisor

pip install supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默认配置文件
vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 进程管理

supervisor.conf 配置文件底部添加 (注意我的工作路径是/var/www/server)

[program:myapp]
command=/var/www/server/venv/bin/gunicorn -w4 -b0.0.0.0:2170 myapp:app    ; supervisor启动命令
directory=/var/www/server                                                ; 项目的文件夹路径
startsecs=0                                                                             ; 启动时间
stopwaitsecs=0                                                                          ; 终止等待时间
autostart=false                                                                         ; 是否自动启动
autorestart=false                                                                       ; 是否自动重启
stdout_logfile=/var/www/server/log/gunicorn.log                           ; log 日志
stderr_logfile=var/www/server/log/gunicorn.err  

其中的 log 目录是用来记录日志的,我们需要先创建一个 log 目录,否则会碰见未找到目录的错误

mkdir log
supervisor 的基本使用命令
supervisord -c supervisor.conf                             通过配置文件启动supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的状态
supervisorctl -c supervisor.conf reload                    重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname]      关闭指定/所有 supervisor管理的程序进程

部署 Nginx

nginx 是一个高性能的 HTTP 和 反向代理服务器,在高并发方面表现非常不错。

安装 nginx

sudo apt-get install nginx

nginx 安装完后,我们可以通过以下命令控制 nginx 的开启和关闭

sudo /etc/init.d/nginx restart // 重启
sudo /etc/init.d/nginx start 开启
sudo /etc/init.d/nginx stop 关闭

配置 nginx

cd /etc/nginx/sites-available/default
cd /etc/nginx/sites-enabled/default

这是 nginx 的具体应用的配置文件,便于管理。修改默认的 default 文件

server {
  #侦听80端口
    listen 80;
#定义使用www.xx.com访问
    server_name www.app.com; // 或则是地址(http://118.89.235.150/)
    client_max_body_size 10M;
 
   #设定本虚拟主机的访问日志
    access_log logs/app.log main;
 
  #默认请求
    location / {
        #请求转向本机ip:8888
        proxy_pass http://0.0.0.0:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #配置静态文件转发
    location ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
        root /home/zhoujianghai/temp/data/app/medias/;
    }
    #配置静态页面转发
    location ~.*(html)$ {
        root /home/zhoujianghai/temp/data/app/app_static_pages/;
    }
}

重启你的 nginx 就可以在浏览器上通过http://118.89.235.150/访问你的应用了。

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容