Flask 基于 Ubuntu+Gunicorn+Supervisor+Nginx 部署

踩了一天半的坑,终于爬出坑了!
不得不说现在博客真是天下一大抄,翻遍了 Google, 不是翻译的国外博文,就是抄国内原创博文, 连项目名,代码都不改.
废话不多说, 上文章!
有任何问题可直接评论,看到后会回复.

首先声明配置信息:
服务器依旧为 Ubuntu 17.10 (网上其他部署博文使用的大部分为14.04, 或者16.04.
此篇文章选择因为17.10版本以下的 Ubuntu Python3的版本通过 apt-get update 更新的版本号是3.4.3
而 17.10 直接更新为 Python3.6.3)

云提供商为 Google Cloud (各大提供商没有什么区别,随意选)

步骤

  • 1.链接服务器
  • 2.更新系统,为了安全
  • 3.安装 pip3
  • 4.安装 virtualenv
  • 5.激活虚拟环境
  • 6.创建 flask 项目, 配置项目, 安装所需库
  • 7.安装并配置 gunicorn
  • 8.安装并配置 Supervisor
  • 9.安装并配置 Nginx
  • 10.大功告成!

开始动手

一、链接服务器

链接服务器一般选用 ssh, 如果是 Windows 可以考虑 xshell
MacOS 强烈推荐 iTerm2, 配合 oh-my-zsh 爽翻天

二、更新系统,为了安全
#使用以下命令更新补丁,还有好多的 lib
sudo apt-get update
sudo apt-get dist-upgrade
三、安装 pip3
#如果你选择用 python2 就把下面命令的3去掉就可以了
sudo apt-get install python3-pip

四、安装 virtualenv

#安装虚拟环境, 在这个环境里并不会影响真实系统的环境
sudo pip3 install virtualenv

五、激活虚拟环境

#前进到 你的工程文件目录, 我的工程目录为/home/yaotiancheng/mysite
cd /home/yaotiancheng/mysite

#创建虚拟环境
virtualenv ENV

#进入虚拟环境
source ENV/bin/activate

#退出虚拟环境(只是让你记住啊..先别执行此句, 会告诉你合适退出虚拟环境)
deactivate

六、创建 flask 项目, 配置项目, 安装所需库

从最简单的项目上手

vi app.py

# 将以下代码放到 app.py 里,如果你有更完整的 flask 项目, 那就使用你自己的

# -*- coding: utf-8 -*-

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8000)

接下来安装所需 lib

# 这里执行的所有操作都在虚拟环境中,并没有退出
# 如果你有 flask 项目 直接从 requirment.txt 安装即可,然后可以略过该步骤里的所有东西
pip install -r requirment.txt

# 如果你是一个新手, 跟着我接下来走
pip install flask
pip freeze > requirment.txt

#执行到这里,基本的库文件已经装好了, 而且该目录内会生成一个 requirement.txt 记录着你项目安装的库文件以及版本
cat requirment.txt

#这是可以测试项目是否可以运行
python app.py

#如果不出意外(PS :这个地方一般也没啥意外) ,打开你的 ip:8000就可以看到你的网页或者一个简单的 Hello World

# 退出此次进程运行
Ctrl + C 

七、安装并配置 gunicorn

#安装 gunicorn (还是在虚拟环境中,并没有退出)
pip install gunicorn

接下来提供另外一个文件 wsgi.py, 放置位置为工作目录的根目录 也就是我的 /home/yaotiancheng/mysite

# -*- coding: utf-8 -*-

import sys
from os.path import abspath, dirname

sys.path.insert(0, abspath(dirname(__file__)))

# 这个 app 就是上面的 app.py
import app

# 必须有一个叫 application 的变量
# gunicorn 就要这个变量
# 没有为什么,必须要这个文件..
# app.app 就是 app.py 里的 flask 的实例对象
application = app.app
# 用 gunicorn 运行 flask
gunicorn wsgi --bind 0.0.0.0:2000
# 不出意外, 应该和单独运行 `python app.py` 一样, 也可以看到网站跑起来了,接下来配置自动运行

八、安装并配置 Supervisor

在这里可以退出虚拟环境!!!!不退出也没什么关系!!!!!

sudo apt-get install surpervisor

# 开始编辑项目的配置文件 xxx 随意定
vi /etc/supervisor/conf.d/xxx.conf

# 以下为该配置文件的内容


# 进程名
[program:mysite] 
# 需要执行的命令 (一定要指定虚拟环境的 gunicorn 来执行) pid 那个就是套路,就是要写,没为什么.
command=/home/yaotiancheng/mysite/ENV/bin/gunicorn wsgi --bind 0.0.0.0:2000 --pid /tmp/mysite.pid
# 工作目录路径
directory=/home/yaotiancheng/mysite
# 自动运行 肯定是 true 啦
autostart=true

接下来启动该进程(命令中的 status 只是为了让你看到 supervisor 的状态变化,因为现在执行 restart并不会提示你 suepervisor 的状态变更信息, 用 status 来确认自己每一步都有效果

# 查看一下 supervisor 的状态
service supervisor status

# 关闭 supervisor
service supervisor stop

# 再查看一下 supervisor 的状态
service supervisor status

# 启动 supervisor
service supervisor  start

# 再查看一下 supervisor 的状态,确定supervisor是启动的
service supervisor status

# 另外可以通过 supervisorctl 来控制进程的启动, mysite 为你配置文件的 program 后面的名字
supervisorctl restart mysite

到目前为止你已经可以通过IP:端口号来访问你的网站了,重启服务器也没有问题.
接下来是配置 Nginx

九、安装并配置 Nginx

# 安装 Nginx
 sudo apt-get install nginx

可以直接访问 IP 看到 Nginx 的欢迎页面了,接下来配置转发.

提供配置文件 xx.conf( xx 为任意英文/数字字符)

server {
    listen 80;
    server_name 这里为你的IP 地址/ 域名;

    #符号表
    charset utf-8;
     # 最大上传文件
    client_max_body_size 75M;
    #静态文件路径
    location /static {
            alias /home/yaotiancheng/mysite/static;
        }

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        # 这里的地址要与你在 supervisor 里面相同
        proxy_pass         http://127.0.0.1:2000;
    }

}

这个配置文件可以放在工程目录内,想 Nginx 配置文件做软连接即可

更改为,重启 Nginx 或者 重新读取一遍 Nginx 配置文件即可.

十、大功告成!

到这里一般你的网站就已经布置好了,有什么问题块可以留言. 踩了无数的坑终于把网站部署好了…

感谢以下文章提供的帮助:

Nginx配置文件(nginx.conf)配置详解

感谢萧井陌大神提供的学习路线.

    原文作者:JackYao
    原文地址: https://www.jianshu.com/p/31bc8c81a27f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞