阿里云快速部署Flask应用

前言

之前在博客上写过使用Python flask进行web的开发,当时由于时间关系并没有写实际生产环境中该如何部署Flask应用。这篇文章就来写写在阿里云服务器上快速部署Flask应用的步骤。 Flask + gunicorn + Nginx + supervisor部署 Python Flask 应用,就是这么简单粗暴!

回顾

之前写过的一篇使用Flask开发web的文章,传送门 使用flask来做一个小应用 ,在这篇文章中我写到了使用Flask快速构建一个可在线使用的小应用,而且在我的Github上有些项目都使用了Flask进行编写,Flask的易用性使得开发WEB服务变得非常简单快速。

在之前的文章中我使用了Flask自带的web服务器提供WEB服务,Flask自带的web服务器本身性能是很差劲的,官方说明有提到说自带的web服务器只适合开发时候使用,在实际生产环境中不建议使用,所以我们必须使用其他的WEB服务器作为支撑。

环境

我这里使用的是阿里云服务器,系统是CentOS 7.2,Python 自带版本为 2.7.5,为了方便我使用,将其升级到了 Python 2.7.12,具体升级方法见这篇文章,传送门  CentOS7.2安装python2.7.12,在此感谢文章作者提供的帮助。

升级pip到最新版本

安装 Flask

安装 Gunicorn

安装 Supervisor

安装 Nginx (如果还有其他项目在跑,比如PHP的,可以直接安装lnmp)

我在之前的文章中已经提到使用Python 虚拟环境运行Flask,这里我们同样使用Python的虚拟环境来运行,具体过程不再描述。

配置

假设你已经配置好了Python的虚拟环境,并且使用 Python app.py 来测试,使用浏览器通过 http://ip:5000 的方式能看到你的Flask则说明你的基本环境已经配置完成。

前面说了Flask自带的web服务器性能太差,这里就要借助第三方的web服务器了,我这里使用Gunicorn来作为第三方服务器,关于Gunicorn的介绍,可以在这里查看 https://www.zhihu.com/question/38528616 ,Nginx的作用就不再多说了,相信配置过web服务器的朋友都清楚他是干啥的,我这里只是用来做端口转发用。

Supervisor 是个神器,简单点说就是一个进程管理的,如果你的Python应用挂了,Gunicorn服务器死了,那么Supervisor可以帮你重新起一个,起到了一个监视器的左右。

Gunicorn 的使用非常的简单,先看下面的一段命令

gunicorn -w 4 -b 0.0.0.0:8080 twnews:application
这条命令就可以直接把Flask应用跑起来,说说各个参数吧:

-w 4 这个跟Nginx的 worker_processes 是一个道理,表示同时开启多少个进程,Nginx那边一般建议写成CPU核心数的2倍,这里咱们也设置2倍吧。

0.0.0.0:8080 这个就简单了,0.0.0.0这个指的是开放所有地址都可以访问,8080就是端口号咯,当然端口号是可以根据需要调整的,前面的那个ip地址最好不要改,改了可能外网就无法访问了。

twnews:application 这里的twnews就是Flask应用的文件名,不要后缀,application这个是一个入口,告诉Gunicorn要从哪里开始,比如我的代码是这么写的

app = Flask(__name__)
application = app
好了,如果切换到Flask所在目录,按照上面那条命令执行,不出意外的话你就可以在浏览器中通过 http://ip:8080 访问到你的Flask应用了。

但是这种方式毕竟不是很好,服务器重启之后又得重新执行一次命令,非常麻烦,所以咱们就要让他开机启动。

开机启动有两种方案,一种方案是直接写个shell脚本放到/etc/init.d/下面,这样就会自动执行了。这种方案的弊端就是一旦服务挂了,那么就得手动去重启服务,相当麻烦。

第二种方案就是使用Supervisor,对进程进行监控,一旦进程挂了,自动起新的进程,保证服务不会中断。

配置Supervisor也是相当的简单,首先使用Supervisor自带的命令把配置文件写到/etc/下面去

sudo echo_supervisord_conf > /etc/supervisord.conf
不出意外的话你会看到提示没有权限,不要惊慌,其实这个时候配置文件已经写进去了,使用下面的命令查看配置文件
cat /etc/supervisord.conf
在配置文件的最底下我发现这样一行
[include]
files = supervisord.d/*.ini

这就很简单了,只需要把我们的Flask站点的配置文件放到/etc/supervisord.d/这个目录下面,就会自动加载,这里我在/etc/supervisord.d/下面创建一个配置文件 twnews.ini,内容如下

[program:twnews]
command=gunicorn -w 4 -b 0.0.0.0:8080 twnews:application
directory=/data0/flaskProjects/twnews/
user=root
autostart=true
autorestart=true
redirect_stderr=true 
相关参数解释一下:

program:twnews 这个就是给你的应用取个名字

command=gunicorn -w 4 -b 0.0.0.0:8080 twnews:application 这个就不用说了,把服务跑起来

directory=/data0/flaskProjects/twnews/ 这句很重要,指定了gunicorn要去哪个目录下面执行命令

user=root
autostart=true
autorestart=true
redirect_stderr=true
这几个就不多说了,相信朋友们一看就懂。

这个时候咱们还需要把supervisor搞成开机启动,所以就有了这个脚本

#! /bin/bash -e

SUPERVISORD=/usr/local/bin/supervisord
PIDFILE=/tmp/supervisord.pid
OPTS="-c /etc/supervisord.conf"

test -x $SUPERVISORD || exit 0

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin"

case "$1" in
  start)
    log_begin_msg "Starting Supervisor daemon manager..."
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;
  stop)
    log_begin_msg "Stopping Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || log_end_msg 1
    log_end_msg 0
    ;;

  restart|reload|force-reload)
    log_begin_msg "Restarting Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

  *)
    log_success_msg "Usage: /etc/init.d/supervisor
{start|stop|reload|force-reload|restart}"
    exit 1
esac

exit 0
据说是官方推荐的脚本,在 /etc/init.d/ 目录下面建立 supervisor 文件,然后把上面的shell脚本代码写入到文件中,然后执行下面的三条命令就OK了
sudo chmod +x /etc/init.d/supervisord  # 使脚本拥有可执行权限
sudo systemctl enable supervisord.service #把脚本加入到开机启动项
sudo service supervisord start # 启动服务
最后一步就是配置Nginx的端口转发了,这个网上相关文章很多,不再累述。

推荐阅读

http://www.cnblogs.com/Ray-liang/p/4837850.html
https://www.zhihu.com/question/38528616
http://www.centoscn.com/CentOS/config/2015/0507/5374.html

如果您觉得文章有帮助到您,请到 https://www.92ez.com/index.php?action=show&id=23403 进行打赏/捐赠,谢谢!
如果您觉得文章有帮助到您,请 使劲戳这里 进行打赏/捐赠,谢谢!
本文链接:https://www.92ez.com/?action=show&id=23439
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

关键词: supervisor , gunicorn , flask , python web

上一篇: Python 中如何防止sql注入
下一篇: 修改路由器的DNS后我做了什么?

访客评论
#1
回复 nions 2017-03-05, 11:10 PM
背景音乐呢 ,,,咋不见了! 差评!!
发表评论

评论内容 (必填):