Ubuntu 部署 Flask + WSGI + Nginx 详解

转载自:http://www.linuxidc.com/Linux/2015-09/123593.htm

安装 Python 环境

接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python pip 安装工具即可。pip 用于安装一些基于python 应用的软件工具,在下文中将会频繁使用。

PIP

如果用python 而不懂 [pip|http://pypi.python.org/] 那最好就快点脑补吧, 指令如下:

sudo apt-getinstall pip

VirtualEnv

不同的项目可能会引用各种不同的依赖包,为了避免版本与和应用之间的冲突而造成的依赖地狱
[Virtualenv | 
https://virtualenv.readthedocs.org/en/latest/] 就是我们python 项目的必须品了。VirtualEnv 可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv 能够做到:

  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用

安装:

sudo pip installvirtualenv

安装VirtualEnv 后只需要在项目目录内运行 virtualenv目录名 就可以建立一个虚拟环境文件夹,然后启用 activate 指令即可启用该python虚拟环境,具体操作如下:

假定我的项目目录叫 /home/www/my_flask,首先安装虚拟环境 (我习惯使用的虚拟环境目录叫 venv )

my_flask root$virtualenv venv

 

>> New pythonexecutable in venv/bin/python

>> Installingsetuptools, pip...done.

在项目目录下就会建立一个新的 venv 目录,里面就是运行python 的基本环境的工具与指令,和包。然后启用该环境,使用当前命令行状态进入虚拟环境,进入虚拟环境后,一切安装python的操作都会将包和引用装在虚拟环境内,而不会影响到全局的python 环境。

my_flask root$source venv/bin/activate

 

(venv)my_flaskroot$

调用 activate 指令后命令符前就会出现 (venv) 字样。可通过 deactivate 退出虚拟环境。

安装 uWSGI

Flask 的实际生产运行环境选择并不多,比较成熟的是 [Gunicorn|http://gunicorn.org/] [uWSGI|https://github.com/unbit/uwsgi] ,听说Gunicorn 的配置很简单,但可惜我一直没有配置成功过,我现采用的是 uWSGI。接下来就安装uWSGI吧。

(venv)my_flaskroot$ pip install uwsgi

在虚拟环境下不需要使用 sudo ,因为virtualenv 是没有权限要求的。

这个安装很迅速,基本是秒成。安装完成后我们可以先放下 uWSGI 不表,在后面再回过来配置他,因为我们首先要将关键的 Flask环境和我们的项目文件传到服务器目录内。

安装 Flask

我是用清单文件一次性安装Flask和他的相关依赖的,这样会更快。我的引用清单是这样的:
requirements.txt

Flask==0.10.1

Flask-Login==0.2.11

Flask-Mail==0.9.1

Flask-Moment==0.4.0

Flask-PageDown==0.1.5

Flask-SQLAlchemy==2.0

Flask-Script==2.0.5

Flask-WTF==0.10.2

Flask-Cache==0.13.1

Flask-Restless==0.15.0

Flask-Uploads==0.1.3

Jinja2==2.7.3

Mako==1.0.0

Markdown==2.5.1

MarkupSafe==0.23

SQLAlchemy==0.9.8

WTForms==2.0.1

Werkzeug==0.9.6

html5lib==1.0b3

itsdangerous==0.24

six==1.8.0

awesome-slugify==1.6

可以想像,如果一个一个装非疯了不可。
安装清单文件:

(venv)my_flaskroot$ pip install -r requirements.txt

在此还是重重地提一下:一定要注意在运行这个安装之前启用了python 虚拟环境,否则会直接安装到全局去的!

项目文件

接下来就是上传 Flask的项目文件,之前我在各大的转载专业户里找了好多的资料,在这一步中大多只是在上面加个标准的Flask运行文件,虽说做个范例可以但说实在的这很让人迷惑,为什么?先看看代码吧:

from flask importFlask

 

app =Flask(__name__)

 

@app.route("/")

def hello():

    return "Hello World!"

生产环境内,谁会用这样的代码呢,这只是Flask 的最简入门范,我的Flask项目中 app 是被做在包内的,相信很多人都是这样做的,在包外我们采用 Flask Script 写一个 manage.py 文件作为启动文件,这更方便于支持各种的项目,包括可以安装到 window下的 FastCGI 中。

那么我的这个 manage.py 是这个样子的:

#!/usr/bin/envpython

import os

 

ifos.path.exists('.env'):

    print('Importing environment from .env...')

    for line in open('.env'):

        var = line.strip().split('=')

        if len(var) == 2:

            os.environ[var[0]] = var[1]

 

from app importcreate_app

fromflask.ext.script import Manager, Shell

 

# 通过配置创建 app

app =create_app(os.getenv('FLASK_CONFIG') or 'default')

manager = Manager(app)

 

defmake_shell_context():

    return dict(app=app)

 

 

manager.add_command("shell",Shell(make_context=make_shell_context))

 

@manager.command

def deploy():

    """Run deploymenttasks."""

    pass

 

 

if __name__ =='__main__':

    manager.run()

这样做我地开发环境可以这样运行 Flask:

python manage.pyrunserver

更详细的做法请参考 [Flask Script|http://flask-script.readthedocs.org/en/latest/] 扩展

好吧,我们可以用支持SSHFTP工具将Flask项目文件上传到服务器上,下面是整个项目文件结构:

www/

└── my_flask 

│   ├── logs

│   └── venv //虚拟目录

│   │  ├── bin

│   │  │         ├── activate

│   │  │         ├── easy_install

│   │  │         ├── gunicorn

│   │  │         ├── pip

│   │  │         └── python

│   │  ├── include

│   │  │          └── python2.7 ->/usr/include/python2.7

│   │  ├── lib

│   │  │         └── python2.7

│   │  ├── local

│   │  │         ├── bin ->/home/shenye/shenyefuli/bin

│   │  │         ├── include ->/home/shenye/shenyefuli/include

│   │  │         └── lib ->/home/shenye/shenyefuli/lib

│   └── app //Flask 程序目录

│   │          └──  __init__.py //这是程序包文件。这个目录下还有其它的文件此处略过

│   ├── manage.py 

│   ├── requirements.txt                     

配置 uwsgi

好了,项目的准备工作已经做完了,是时候回过头去配置 uwsgi 了,它的具体指令可以去看它的官方文档,我们在这里采用其中的一种指令方式:配置起动。我采用 .ini文件作为配置,在项目目录下创建一个 confg.ini (具体见下文)写好后可以这样执行

(venv)my_flaskroot$ uwsgi config.ini

我认为是最简单的方式,也容易更改。好了重要部分来了,config.ini 是这样写的:

[uwsgi]

 

# uwsgi 启动时所使用的地址与端口

socket =127.0.0.1:8001

 

# 指向网站目录

chdir = /home/www/

 

# python 启动程序文件

wsgi-file =manage.py

 

# python 程序内用以启动的 application 变量名

callable = app

 

# 处理器数

processes = 4

 

# 线程数

threads = 2

 

#状态检测地址

stats =127.0.0.1:9191

注意 callable=app 这个 app  manage.py 程序文件内的一个变量,这个变量的类型是 Flask application

运行 uwsgi

```
(venv)my_flask root$ uwsgi config.ini

[uWSGI] getting INI configuration fromconfig.ini

*** Starting uWSGI 2.0.8 (64bit) on [FriDec 19 14:34:11 2014] 
//
此处略去那些无用的启动信息
Stats server enabled on 127.0.0.1:9191 fd: 15 ***
```

OK此时已经正常启动 uwsgi 并将 Flask 项目载入其中了,ctrl+c 关闭程序。但这只是命令启动形式,要使其随同服务器启动并作为后台服务运行才是运营环境的实际所需要。因此接下来我们需要安装另一个工具来引导 uwsgi

安装 Supervisor

[Supervisor|http://supervisord.org/configuration.html]可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。

sudo apt-getinstall supervisor

Supervisor 的全局的配置文件位置在:

/etc/supervisor/supervisor.conf

正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的 *.conf 文件放在

/etc/supervisor/conf.d/

下就可以,那么我们就新建立一个用于启动 my_flask 项目的 uwsgi supervisor 配置 (命名为:my_flask_supervisor.conf)

[program:my_flask]

# 启动命令入口

command=/home/www/my_flask/venv/bin/uwsgi/home/www/my_flask/config.ini

 

# 命令程序所在目录

directory=/home/www/my_flask

#运行命令的用户名

user=root

              

autostart=true

autorestart=true

#日志地址

stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log            

启动服务

sudo servicesupervisor start

终止服务

sudo servicesupervisor stop

安装 Nginx

[Nginx|http://nginx.com/]是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件。

sudo apt-getinstall nginx

配置 Nginx

Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将

/ext/nginx/sites-available/default

文件替换掉就可以了。

新建一个 default 文件:

        server {

         listen  80;

         server_name XXX.XXX.XXX; #公网地址

       

         location / {

               include      uwsgi_params;

               uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理

               uwsgi_param UWSGI_PYHOME/home/www/my_flask/venv; # 指向虚拟环境目录

               uwsgi_param UWSGI_CHDIR  /home/www/my_flask; # 指向网站根目录

               uwsgi_param UWSGI_SCRIPTmanage:app; # 指定启动程序

         }

        }

default配置文件替换掉就大功告成了!
还有,更改配置还需要记得重启一下nginx:

sudo service nginxrestart

总结

阿里云的服务器运行速度很不错,加上Flask+uWSGI+nginx这种高性能结构,整个网站响应速度极为之快,每页响应速度不到0.1s , 与之相比我之前使用 C# 部署在Avarix 上的网站(同一个程序,不同语言实现)每页响应速度至少2s 这简直是 200:1的性能,当然我还没有闲到去专们用软件去测这两者之间的差值,写本文的目的也是对此作一记录,以便以后回顾。

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Ubuntu 12.04 下部署 Nginx+uWSGI+Flask http://www.linuxidc.com/Linux/2014-01/96007.htm

你应该使用 Nginx +uWSGI http://www.linuxidc.com/Linux/2013-07/87286.htm

uWSGI + Nginx 部署 Flask Web 应用 http://www.linuxidc.com/Linux/2013-06/85828.htm

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm

LinuxNginx+uWSGI部署Python应用 http://www.linuxidc.com/Linux/2012-10/72443.htm

Ubuntu Server 12.04 安装Nginx+uWSGI+Django环境 http://www.linuxidc.com/Linux/2012-05/60639.htm

CentOS 5.5 +Nginx 0.8.50 + uWSGI + Django 1.2.3 部署Django项目 http://www.linuxidc.com/Linux/2011-05/36399.htm

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值