前面我们已经成功用Flask生成了word文件,具体请看Flask生成word文件。用Flask的目的就是可以为了将程序做成网页,放在网上让更多的人使用,可是Flask自身所带的Web仅可作为调试,不能用在生产环境。

在生产环境中,通常采用uWSGI+Nginx的方式部署Flask程序。我们就拿一台新的服务器,从零看一看如何部署一个Flask程序。

首先要说明的是,虽然Ubuntu已经更新到了16版本,但是在最新版本下进程管理软件supervisor在我测试的服务器重启后不会自启动,至今没有搞清楚原因。而我在生产环境中,要用supervisor管理uWSGI,所以我采用了Ubuntu14.04版本。

下面正式开始我们的部署之旅:

一、安装virtualenvwrapper

Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境,它可以做:

1、将所有虚拟环境整合在一个目录下

2、管理(新增,删除,复制)虚拟环境

3、快速切换虚拟环境

因为现在大部分linux服务器都预装了python2和python3,我采用python3开发,所以安装命令是:

1
pip3 install virtualenvwrapper

如果是python2,用pip install 即可

安装完毕后,修改linux环境变量配置文件,方便我们启动shell后,可以直接使用virtualenvwrapper:

1
vim ~/.bash_profile

向里面添加下列内容(每行的作用,上面已经标明,根据自己需要更改即可):

export WORKON_HOME=$HOME/.virtualenvs   # 虚拟环境创建的地方
export PROJECT_HOME=$HOME/workspace
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 # 指定虚拟使用的python解释器路径
source /usr/local/bin/virtualenvwrapper.sh # 每次登陆用户自动执行下脚本

下面建立一个虚拟环境,用作运行flask的python环境:

1
mkvirtualenv flask_python3_formal 

启动虚拟环境:

1
workon flask_python3_formal

二、安装uWSGI

之前一直对Nginx和uWSGI到底是什么很模糊,其实对于编程新手在前期大不可去纠结它们到底是什么。Nginx就是一个软件,软件为我们提供服务,它提供静态文件访问的web服务(当然还有其他服务,这里我们只需要了解这么多即可)。然而,它不能直接执行托管Python应用程序,而uWSGI解决了这个问题。

在我们的python虚拟环境里运行安装命令:

1
pip install uwsgi

这里因为我们在虚拟环境flask_python3_formal中只有python3,所以直接使用pip即可。

随后,我们将我们的项目文件夹上传到服务器,并在其中建立uWSGI的配置文件config.ini,写入下面的内容:

[uwsgi]

# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001 

# 指向网站目录
chdir = /tmp 

# python 启动程序文件
wsgi-file = app_mac.py 

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

# 处理器数
processes = 4

# 线程数
threads = 2

#状态检测地址
stats = 127.0.0.1:9191

运行uWSGI:

1
uwsgi config.ini

如果一切正常,会得到uWSGI正常运行的提示,我们先ctrl+c结束掉。因为在生产环境,必须有一个软件来监控uWSGI,保证服务器重启后或者其本身Crash掉可以自动重启。

三、安装supervisor

supervisor就解决上面所描述的问题,它可以监控多个应用,保证其稳定运行,安装:

1
apt-get install supervisor

其配置文件位置在/etc/supervisor/supervisor.conf

正常情况下,我们只需要在配置文件最下面加入两行(如有其它配置需要,可以查阅相关文档):

[include]
files = /etc/supervisor/*.conf

这样supervisor就会监控/etc/supervisor目录下所有conf文件,我们在此目录下建立文件my_flask_supervisor.conf:

[program:my_flask]
command= /root/.virtualenvs/flask_python3_formal/bin/uwsgi /tmp/app_mac/config.ini  #要执行的命令,这里就是运行uWSGI配置文件
directory= /tmp/app_mac
user=root
autostart=true
autorestart=true
stdout_logfile=/tmp/app_mac/uwsgi_supervisor.log   #日志文件

随后,启动supervisor:

1
supervisord -c /etc/supervisor/supervisord.conf

至此,uWSGI配置完毕

四、安装Nginx

离最终目标仅剩最后一步,安装Nginx:

1
apt-get install nginx

安装完成后,在项目目录新建一个Nginx的配置文件flask.conf用于我们的Flask应用。向其键入以下内容(根据说明自行修改配置):

server {
   listen  80;       #监听端口  
   server_name X.X.X.X;    #服务器公网IP


   location  /  {
      include      uwsgi_params;
      uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理,8001对应uWSGI启动的端口
      uwsgi_param  UWSGI_PYHOME /root/.virtualenvs;  # 指向虚拟环境目录
      uwsgi_param  UWSGI_CHDIR  /tmp/app_mac;   # 指向网站根目录
      uwsgi_param  UWSGI_SCRIPT manage:app;   # 指定启动程序
   }
  }

最后,将刚建立的配置文件使用符号链接到Nginx配置文件文件夹中,重启Nginx:

1
2
ln -s /tmp/app_mac/flask.conf /etc/nginx/conf.d/
service nginx restart

至此,如果一切顺利,则访问http://X.X.X.X,就可以正常看到你的Flask程序了。