前言
之前在博客上写过使用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
pip install flask
安装 Gunicorn
sudo yum install python-gunicorn
安装 Supervisor
sudo yum -y install 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
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。