阿里云部署 Flask + WSGI + Nginx 转载详解

我采用的部署方案是:

  • Web 服务器采用 uwsgi host Flask
  • 用 Supervisor 引用 uwsgi 作常规启动服务
  • 基于 Nginx 作反向代理

首先, 阿里云服务器可以通过 SSH 指令在本机的终端进行远程连接

ssh [email protected]云服务器地址

输入密码进入后所有的操作与本地终端完全一至。

安装 Python 环境

接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python 的 pip 安装工具即可。pip 用于安装一些基于python 应用的软件工具,在下文中将会频繁使用。

PIP

如果用python 而不懂 [pip|http://pypi.python.org/] 那最好就快点脑补吧, 指令如下:

sudo apt-get install pip

VirtualEnv

不同的项目可能会引用各种不同的依赖包,为了避免版本与和应用之间的冲突而造成的“依赖地狱”

[Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 就是我们python 项目的必须品了。VirtualEnv 可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv 能够做到:

  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用

安装:

sudo pip install virtualenv

安装VirtualEnv 后只需要在项目目录内运行 virtualenv 目录名 就可以建立一个虚拟环境文件夹,然后启用 activate 指令即可启用该python虚拟环境,具体操作如下:

假定我的项目目录叫 /home/www/my_flask,首先安装虚拟环境 (我习惯使用的虚拟环境目录叫 venv )

my_flask root$ virtualenv venv

>> New python executable in venv/bin/python
>> Installing setuptools, pip...done.

在项目目录下就会建立一个新的 venv 目录,里面就是运行python 的基本环境的工具与指令,和包。 然后启用该环境,使用当前命令行状态进入虚拟环境,进入虚拟环境后,一切安装python的操作都会将包和引用装在虚拟环境内,而不会影响到全局的python 环境。

my_flask root$ source venv/bin/activate 

(venv)my_flask root$ 

调用 activate 指令后命令符前就会出现 (venv) 字样。 可通过 deactivate 退出虚拟环境。

安装 uWSGI

Flask 的实际生产运行环境选择并不多,比较成熟的是 [Gunicorn|http://gunicorn.org/] 和 [uWSGI|https://github.com/unbit/uwsgi] ,听说Gunicorn 的配置很简单,但可惜我一直没有配置成功过,我现采用的是 uWSGI。接下来就安装uWSGI吧。

(venv)my_flask root$ pip install uwsgi

在虚拟环境下不需要使用 sudo ,因为virtualenv 是没有权限要求的。

这个安装很迅速,基本是秒成。安装完成后我们可以先放下 uWSGI 不表,在后面再回过来配置他,因为我们首先要将关键的 Flask环境和我们的项目文件传到服务器目录内。

安装 Flask

我是用清单文件一次性安装Flask和他的相关依赖的,这样会更快。我的引用清单是这样的:

requirements.txt

Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Moment==0.4.0
Flask-PageDown==0.1.5
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-WTF==0.10.2
Flask-Cache==0.13.1
Flask-Restless==0.15.0
Flask-Uploads==0.1.3
Jinja2==2.7.3
Mako==1.0.0
Markdown==2.5.1
MarkupSafe==0.23
SQLAlchemy==0.9.8
WTForms==2.0.1
Werkzeug==0.9.6
html5lib==1.0b3
itsdangerous==0.24
six==1.8.0
awesome-slugify==1.6

可以想像,如果一个一个装非疯了不可。

安装清单文件:

(venv)my_flask root$ pip install -r requirements.txt

在此还是重重地提一下:一定要注意在运行这个安装之前启用了python 虚拟环境,否则会直接安装到全局去的!

项目文件

接下来就是上传 Flask的项目文件,之前我在各大的“转载专业户”里找了好多的资料,在这一步中大多只是在上面加个标准的Flask运行文件,虽说做个范例可以但说实在的这很让人迷惑,为什么?先看看代码吧:

from flask import Flask

app = Flask(__name__)

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

生产环境内,谁会用这样的代码呢,这只是Flask 的最简入门范,我的Flask项目中 app 是被做在包内的,相信很多人都是这样做的,在包外我们采用 Flask Script 写一个 manage.py 文件 作为启动文件,这更方便于支持各种的项目,包括可以安装到 window下的 FastCGI 中。

那么我的 这个 manage.py 是这个样子的:

#!/usr/bin/env python
import os

if os.path.exists(‘.env‘):
    print(‘Importing environment from .env...‘)
    for line in open(‘.env‘):
        var = line.strip().split(‘=‘)
        if len(var) == 2:
            os.environ[var[0]] = var[1]

from app import create_app
from flask.ext.script import Manager, Shell

# 通过配置创建 app
app = create_app(os.getenv(‘FLASK_CONFIG‘) or ‘default‘)
manager = Manager(app)

def make_shell_context():
    return dict(app=app)

manager.add_command("shell", Shell(make_context=make_shell_context))

@manager.command
def deploy():
    """Run deployment tasks."""
    pass

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

这样做我地开发环境可以这样运行 Flask:

python manage.py runserver

更详细的做法请参考 [Flask Script|http://flask-script.readthedocs.org/en/latest/] 扩展

好吧,我们可以用 支持SSH的FTP工具将Flask项目文件上传到服务器上,下面是整个项目文件结构:

www/
└── my_flask
│   ├── logs
│   └── venv  //虚拟目录
│   │   ├── bin
│   │   │         ├── activate
│   │   │         ├── easy_install
│   │   │         ├── gunicorn
│   │   │         ├── pip
│   │   │         └── python
│   │   ├── include
│   │   │          └── python2.7 -> /usr/include/python2.7
│   │   ├── lib
│   │   │         └── python2.7
│   │   ├── local
│   │   │         ├── bin -> /home/shenye/shenyefuli/bin
│   │   │         ├── include -> /home/shenye/shenyefuli/include
│   │   │         └── lib -> /home/shenye/shenyefuli/lib
│   └── app  //Flask 程序目录
│   │           └──  __init__.py //这是程序包文件。这个目录下还有其它的文件此处略过
│   ├── manage.py
│   ├── requirements.txt                

配置 uwsgi

好了,项目的准备工作已经做完了,是时候回过头去配置 uwsgi 了,它的具体指令可以去看它的官方文档,我们在这里采用其中的一种指令方式:配置起动。我采用 .ini文件作为配置,在项目目录下创建一个 confg.ini (具体见下文)写好后可以这样执行

(venv)my_flask root$ uwsgi config.ini

我认为是最简单的方式,也容易更改。好了重要部分来了,config.ini 是这样写的:

[uwsgi]

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

# 指向网站目录
chdir = /home/www/ 

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

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

# 处理器数
processes = 4

# 线程数
threads = 2

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

注意 : callable=app 这个 app 是 manage.py 程序文件内的一个变量,这个变量的类型是 Flask的 application 类 。

运行 uwsgi

```

(venv)my_flask root$ uwsgi config.ini

[uWSGI] getting INI configuration from config.ini

*** Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014]

// 此处略去那些无用的启动信息

Stats server enabled on 127.0.0.1:9191 fd: 15 ***

```

OK, 此时已经正常启动 uwsgi 并将 Flask 项目载入其中了,ctrl+c 关闭程序。但这只是命令启动形式,要使其随同服务器启动并作为后台服务运行才是运营环境的实际所需要。因此接下来我们需要安装另一个工具来引导 uwsgi 。

安装 Supervisor

[Supervisor|http://supervisord.org/configuration.html]可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。

sudo apt-get install supervisor

Supervisor 的全局的配置文件位置在:

/etc/supervisor/supervisor.conf

正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的 *.conf 文件放在

/etc/supervisor/conf.d/

下就可以,那么我们就新建立一个用于启动 my_flask 项目的 uwsgi 的 supervisor 配置 (命名为:my_flask_supervisor.conf):

[program:my_flask]
# 启动命令入口
command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini

# 命令程序所在目录
directory=/home/www/my_flask
#运行命令的用户名
user=root

autostart=true
autorestart=true
#日志地址
stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log        

启动服务

sudo service supervisor start

终止服务

sudo service supervisor stop

安装 Nginx

[Nginx|http://nginx.com/]是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件。

sudo apt-get install nginx

配置 Nginx

Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将

/ext/nginx/sites-available/default

文件替换掉就可以了。

新建一个 default 文件:

    server {
      listen  80;
      server_name XXX.XXX.XXX; #公网地址

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

将default配置文件替换掉就大功告成了!

还有,更改配置还需要记得重启一下nginx:

sudo service nginx restart
时间: 2024-08-06 22:33:35

阿里云部署 Flask + WSGI + Nginx 转载详解的相关文章

普元云计算-阿里云上的容器技术实践详解

转载本文需注明出处:EAII企业架构创新研究院,违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复公众号:"EAII企业架构创新研究院".(微信号:eaworld)   导读:本文以"实践过程中问题与思考"为主体,与大家分享其中的过程和经验,希望大家在后续的工作中能够避免相关问题,形成更佳实践. 为什么选择阿里云 现在的公有云如雨后春笋,国外如AWS.Azure.Bluemix,国内如BAT.DaoCloud.goodrain,都可以给大家提供丰富的云

生活杂谈之阿里云免费虚拟主机申请过程详解

对于我来说,拥有一个自己的网站是盼望已久的事情,如今终于实现了,我的网站搭建于2015年05月26日,那是一个值得纪念的日子.搭建一个网站对于初学者来说,第一感觉会认为那是”程序员”该做的事情,其实不然,不管你懂不懂代码,也不管是不是计算机专业毕业,你都可以不用花费一百块钱,轻松拥有自己独立的网站.我们这一百块主要用于购买一个网站域名,万网域名大概29-39块钱之间,同时一个域名可以使用一年,其次购买一台虚拟主机,阿里云虚拟主机可以购买28块钱每月的,也可以购买55块钱每月,如果你比较”高富帅”

阿里云轻量应用服务器 搭建配置详解

好久没有更新博客了,说来也是惭愧没有养成记录经验的习惯. 有很多技术开发同学都想拥有自己的服务器用来搭建个人网站,或者展示作品,但是怕租上不会配置或者嫌配置繁琐难下决定. 废话不多说直接进入正题,前两天帮朋友配置一台阿里云的轻量应用服务器(注意不是云服务器ECS但是大同小异). 服务器规格 我配置的是1GB内存1核  20GB SSD系统盘 一年(最低配置算下来打折400多),一般个人建站或者拿来自己练手这个配置足够用了,如果公司用可以选择配置更高的. 1.地域选择 推荐大家选择 华东1(杭州)

FineBI学习系列之FineBI与阿里云ADS数据连接(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-569.html 目录: 1.描述 2.操作 3.注意事项 1.描述 阿里分析型数据库ADS是一种高并发低延时的PB级实时数据仓库,全面兼容MySQL协议以及SQL:2003 语法标准,可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索:可以使用标准 SQL.现有的商业智能 (BI) 工具和ETL工具经济高效地轻松分析与

【转】Redis学习---阿里云Redis多线程性能增强版详解

[原文]https://www.toutiao.com/i6594620107123589635/ 摘要 Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的应用.但是由于redis单进程单线程的模型限制,单Redis Server QPS最高只能达到10万级别.本文试图通过对Redis做多线程的优化,来达到增强性能的目的. 二.背景 众所周知redis是单进程单线程模型(不完全是单进程单线程,还有若干后端线程主要做刷脏数据,关闭文件描述符等后台清理工作

【DataGuard】部署Data Guard相关参数详解 (转载)

原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler 有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Guard配置安装>(http://space.itpub.net/519536/viewspace-578181),本文对部署Data Guard过程中主备库使用到的参数进行比较描述. 1.DB_NAME,数据库名字,需要保持同一个Data Guard 中所有数据库DB_NAME相同primary端和standb

阿里云部署oracle 11g数据库

某程序员在阿里云部署了一套oracle 11g,老板说他们搞了好几天,监听一直启动不来,让我给看看.登上去一瞧,原来是主机名设置的问题(把阿里云的弹性ip直接写在/etc/hosts文件,而云主机的网卡地址一般是私有地址).这个事情,我还专门发了一篇文章,地址为http://blog.51cto.com/sery/2084706 .修复完这个问题以后,觉得直接把数据库这样放在公网上很不妥当,通时又发现其它一些问题,比如磁盘空间规划不合理.混装java等.于是建议把此机作为测试环境,另购几台云主机

通过阿里云4层代理nginx到本地服务器

1.在阿里云上购买slb并配置转发信息2.选择使用阿里云nginx转发服务器 阿里云ecs服务器安装的nginx必须安装模块--with-stream模块 配置nginx方向代理到主机的机房(配置在nginx.conf文件中,)stream { upstream tcp_proxy {server 10.83.32.207:22;}server {listen 9999;proxy_pass tcp_proxy;}} 原文地址:https://blog.51cto.com/whitehat/23

阿里云部署Java网站和微信开发调试心得技巧(上)

阿里云部署Java网站和微信开发调试心得技巧(上)本篇手记旨在帮助大家从0开始: 申请阿里云服务器 搭建出程序的执行环境 在服务器上发布并运行自己的web project 域名解析 微信测试号的申请与连接以获取微信用户信息全篇文章主要以如何去完成目标为主,因此会以流程的形式来展现,细节方面需要大家多多思考.其中文章的上集实现了1-4,文章的下集实现了5一.申请阿里云服务器(1)PC访问阿里云https://www.aliyun.com/,申请阿里云帐号(可以用您的支付宝帐号登录,因为支付宝帐号已