Flask + Gunicorn + Nginx 部署

最近很多朋友都在问我关于 Flask 部署的问题,说实在的我很乐意看到和回答这样的问题,至少证明了越来越多人开始用 Flask 了。

之前我曾发表过一篇在 Ubuntu 上用 uwsgi + nginx 的 Flask 部署方法,说实在的 uwsgi 是个大坑可能用在 Django 上还好吧,不过用在 Flask 上未必就如此。至少 , uwsgi 是个极为折腾人的东西。总之,我是一直认为复杂的东西未必不好,但一定是不好用的。

我自己也经过多番的纠结与尝试,也终于找到了一个 Flask 上靠谱的部署方案。我现在公司的微信后端平台也采用这种部署方案。如果有兴趣的朋友也不妨一看,或者给我提些更好的方案,毕竟知识只有共享了才知道是否有价值。

我在 Flask 官方文档中找到其中一个有意思的内容,这里是原谅链接:Standalone WSGI Containers ,其中并没有 uwsgi 的身影。悻然,但是找到了一个不用折腾的 Flask 部署方案了 —— Gunicorn。

Ubuntu 上的准备

假定你是在腾迅云或者阿里云购买了VPS,那么直接执行以下指令吧,其它的不多解释了,无非就是准备一下 python 环境。

$ sudo apt-get update
$ sudo apt-get install python-dev python-pip python-virtualenv

然后安装 nginx

$ sudo apt-get install nginx

在 /var/www 目录下建立一个 myflask 的文件夹(你的项目目录),然后用 chmod 改一下权限

$ sudo mkdir /var/www/myflask
$ sudo chmod 777 /var/www/myflask

注:当然你可以使用 nginx 的默认网站目录 /usr/share/nginx/html

然后用 scp 指令直接将本机上的 flask 项目传到服务器:

$ scp -r myflask root@www.mydomain.com:/var/www/myflask

域名就改成地址或者你的服务器正在使用的域名,我这里是用 root 用户进入的,你得按你的服务器的用户来修改。两大云的默认根用户是:

  • 腾迅 :ubuntu
  • 阿里 :root

Gunicorn

Gunicorn 绿色独角兽 是一个Python WSGI UNIX的HTTP服务器。这是一个pre-fork worker的模型,从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器大致与各种Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。

我曾经Google 过 Gunicorn 与 uwsgi ,都说uwsgi 的性能要比 gunicorn 高,所以最终结果就杯具了。不过,现在回过头来看这只 “独角兽”还为时不晚吧。

安装 Gunicorn

Gunicorn 应该装在你的 virtualenv 环境下,关于 virtualenv 就不多说了,如果没用过那就赶快脑补吧。安装前记得激活 venv

(venv) $ pip install gunicorn

运行 Gunicorn

(venv) $ gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application

That‘s all! 它的安装就这么简单。不过这里得作一个解释。就是最后的那个参数 wsgi:application 这个是程序入口,我得写个小小的范例来说明一下:

新建一个 wsgi.py 的文件, 注意,这里和 Flask 项目中常用的 manage.py 引导脚本是没有半点毛关系的。(这是我笨,以前一直没分清被uwsgi搞糊涂了)

# wsgi.py

from flask import Flask

def create_app():
  # 这个工厂方法可以从你的原有的 `__init__.py` 或者其它地方引入。
  app = Flask(__name__)
  return app

application = create_app()

if __name__ == ‘__main__‘:
    application.run()

好了,这个 wsgi:application 参数就很好理解了, 分两部:wsgi 就是引导用的 python 文件名称(不包括后缀/模块名)application 就是 Flask 实例的名称。这样 gunicorn 就会找到具体要 host 哪一个 flask 实例了。

从这里开始就可以体现 gunicorn 的好了,我们根本不用配什么配置文件的,一个指令就可以将它起动。

Nginx 的配置

关于 Nginx 我也就不详细讲了,我们就直奔主题,杀入 Nginx 的默认配置文件

sudo nano /etc/nginx/site-avalidable/default

暴力修改成为以下的内容

建议先备份一下 default 文件
sudo cp /etc/nginx/site-avalidable/default /etc/nginx/site-avalidable/default.bak

server {
    listen 80;
    server_name example.org; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://127.0.0.1:8080; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

记得完成 nginx 需要重新起动 nginx 服务喔!

sudo service nginx restart

将 Gunicorn 作为服务运行

这就是最后一步了,我们在此将采用 UpStart 配置Flask程序作为服务程序在Linux起动时运行。首先建立起动配置文件:

sudo nano /etc/init/myflask.conf

然后加入如下配置

description "The myflask service"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid root
setgid www-data

env PATH= /var/www/myflask/venv/bin
chdir /var/www/myflask/

exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application

OK 大功告成,启动 myflask 服务

sudo service myflask start

这里有一点必须补充的,请留意在 myflask.conf 中的

env PATH= /var/www/myflask/venv/bin
chdir /var/www/myflask/

这里所指向的地址就是你的项目路径和 virtualenv 的路径

小结

这个部署过程感觉比我之前所介绍的 uwsgi 那种简单很多吧。这里给一点小 Tips 如果你用 Fabric 来完成这个部署过程的话那么就是纯自动化部署了喔,值得尝试的。

时间: 2024-07-31 17:32:31

Flask + Gunicorn + Nginx 部署的相关文章

Django + Gunicorn + Nginx 部署 Ubuntu 服务器

Django + Gunicorn + Nginx 部署服务器 获取腾讯云 root权限 本人的服务器使用的是腾讯云,腾讯云默认是没有开放 root 用户的,我们来创建 root 用户. 创建 root 账号并设置密码. sudo passwd root 设置 root 账户登录需要密码. sudo vim /etc/ssh/sshd_config 修改 without-password 为 yes. PermitRootLogin yes 重启 ssh 服务. sudo service ssh

Django + Gunicorn + Nginx 部署之路

前言 最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候 Django 中的路由配置使用 正则 来进行的,但是我有特别烦这个东西,所以就果断弃坑了.然后今年年初的时候,我用 Flask 写了一个我的个人网站,刚开始的时候功能还是比较简单,看着路由配置和部署规则都很方便,就果断采用了.但是后来我想添加的功能越来越多的时候,我发现我已经越来越难掌控它了,正好最近我稍微看了一下 Django 这几年的变化,最新的 2

CentOS7部署Flask+Gunicorn+Nginx+Supervisor

1. Git客户端 Win10安装git for windows 1.1 设置Git全局参数 打开Git Bash $ git config --global user.name "Alice-HomePC" $ git config --global user.email "[email protected]" 1.2 生成SSH Key 打开Git Bash,可使用-C选项指定公钥的说明信息 $ ssh-keygen -t rsa -C "Alice-

flask uwsgi nginx 部署文档

系统包安装 # more /etc/redhat-release CentOS Linux release 7.3.1611 (Core) # # yum install epel-release # yum install -y nginx # yum install -y uwsgi # yum install -y uwsgi-plugin-python 2.python packets 1). setuptools # wget https://pypi.python.org/packa

Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署

老毛病了,在用某个新框架或新架构之前,总得花时间谷歌和自己折腾一番,才能知道这个框架和架构的优缺点,才会发现自己最喜欢.用的最顺手的的一种.近期在学习python,这里记录一下自己用的一套python web开发的部署环境. 简介 之所以选择Flask,而没选择用的最多的django,是因为现在这个小项目是一个简单的web工具,提供上传文件.数据处理.并下载的功能.简单小巧,没必要折腾Django.而Flask正好是一个Python实现的Web开发微框架,它基于Werkzeug 和 Jinja2

flask+gevent+gunicorn+nginx 初试

1.安装flask pip install flask 2.安装gevent pip install gevent 3.安装gunicorn pip install gunicorn 版本号信息如下: [[email protected] ~]# pip list Flask (0.10.1) gevent (1.0.1) greenlet (0.4.2) gunicorn (18.0) pip (1.5.5) setuptools (3.6) 4.安装nginx 下载源码包安装,版本信息如下

Django部署:Django+gunicorn+Nginx环境的搭建

本人的服务器环境为Ubuntu14.04,使用的是Python3.4版本,并且安装有pip(Ubuntu中Python3配合的是pip3),并且以管理员身份运行,如果是普通用户,请切换管理员权限(sudo). 一.gunicorn和nginx的简介 gunicorn需要搭配nginx使用,那么两者的作用到底是什么. 1.gunicorn简介:gunicorn是一个Python WSGI UNIX服务器.WSGI(Web Server Gateway Interface)是Web服务网关接口,位于

Flask+uwsgi+Nginx+Ubuntu部署

学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Python选择的是2.7.2这个是Ubuntu系统自带的学起来感觉还是简单的 不用去软连,目前自己的flask是python3写的 ,慢慢去过渡,先吧这个给搞通了,那么在优化也是很顺手的.其实对于很多的原理自己也是一知半解,先吧这个给搭起来,慢慢去了解里面的逻辑什么的. Nginx Nginx 是高效的

Flask+uwsgi+Nginx+Ubuntu部署教程

学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的过程就会重复一次.不知道多少人的膝盖中箭了呢?我也这样干过,这么做确实很蠢,所以我决定写一篇 Flask+uwsgi+Nginx+Ubuntu 的部署教程,解答一些我自己在这个过程中的疑问,从原理到方案,以一个小白的角度,总结一下部署.运维这件事,应该对初学 Flask 需要部署的同学有些帮助. 环