这几天学着用flask写一些rest api,然后部署到云上。这个过程虽然网上有很多的教程,但还是遇到不少的问题!

采用flask的原因是因为它比较容易上手吧。用flask有专门restful api的框架,用起来简单粗暴有木有!另外,

查了一下flask的应用框架,发现用WSGI + Nginx有下面的几个优势:

  • 高性能
  • 部署比较方便,采用Nginx可以部署多个Flask的应用

在此非常感谢Ray在他的blog中提到了在阿里云上部署Flask应用。他的这篇bolg给了我很大启示(我的项目中的

目录都是按照他的做法),给出他的这篇blog的地址:
  http://www.cnblogs.com/Ray-liang/p/4173923.html

我的python环境和python开发环境都是和ray的这篇blog提到的一样的,Ray已经写得足够好啦!

我写一点不一样的东西,我假设你的Flask的应用已经完成,现在只是部署的问题。我的项目整体的目录如下:

---/home/www/my_flask
| --- app
| --- __init__.py // 包文件
| --- ...... // 其他目录或文件  
| --- config.ini // uwsgi文件
| --- requiremwnt.txt // 项目所需的pip安装包
| --- manage.py // Flask Script,用于启动Flask应用
| --- logs // Flask应用部署时的产生的log文件保存路径
| --- venv // 虚拟环境
| --- bin
| --- local
| --- lib
| --- pip-selfcheck.json

其中config.ini为部署uwsgi新建的文件,magnage.py为启动Flask应用所新建的文件。

安装uwsgi:

 (venv) my_flask root@iZ25i0x7zadZ : pip install uwsgi

 配置uwsgi:

[uwsgi]

# uwsgi 启动时所使用的地址与端口

http-socket = 127.0.0.1:5000

# 指向网站目录

chdir = /home/www/my_flask

# python 启动程序文件

wsgi-file = manage.py

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

callable = app

# 处理器数

processes = 4

# 线程数

threads = 2

#状态检测地址

stats = 127.0.0.1:919

由于在部署的时候,应用是rest api,采用socket的方式进行通信会存在缓存不足的情况,如果访问url,

则会出现下面的情况:

*** Stats server enabled on 127.0.0.1:919 fd: 15 ***
invalid request block size: 21573 (max 4096)...skip

此时,你应该修改你的config.ini的配置,将socket修改为http-socket.这样问题就解决了。另外还有一篇

blog对这个讲得很详细:

https://emptyhammock.com/projects/info/pyweb/simple.html

uwsgi配置完成后,验证配置是否正确

$ uwsgi config.ini

接下来安装supervisor,

supervisor的安装

my_flask root@iZ25i0x7zadZ : sudo apt-get install supervisor

配置supervisor

在/etc/supervisor/conf.d/目录下新建my_flask.conf文件,具体配置如下:

[program:my_flask]
# 启动命令入口
command=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

这里的command和ray的有所不同, 具体原因我现在还不太明白。但可以确定的是,在/home/www/my_flask目录

下运行uwsgi config.ini可以启动flask 应用。此外经过测试,只要命令程序所在目录正确,command的取值只需写

命令,而不需要将目录写全。

当配置好supervisor后就可以启动supervisor进行本地测试。

最后为Nginx的安装与配置:

Nginx的安装

sudo apt-get install nginx

Nginx的配置

server {
listen 8080;
server_name XXX.XX.XXX.XXX; #公网地址 location / {
include uwsgi_params;
proxy_pass http://127.0.0.1:5000;
uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /home/www/my_flask; # 指向网站根目录
uwsgi_param UWSGI_SCRIPT manage; # 指定启动程序
}
}

这其中和ray的另外一个不同在于proxy_pass,由于之前在配置uwsgi的时候选择了http-scoket的

方式,这样在设置代理的时候应该是proxy_pass而不是uwsgi_pass.在stackoverflow的一篇问答

中查到,貌似uwsgi不支持http的反向代理。至于其他的步骤则完全参照ray的博客。

【参考资料】

[1] http://www.cnblogs.com/Ray-liang/p/4173923.html

[2] https://emptyhammock.com/projects/info/pyweb/simple.html

[3] http://maximebf.com/blog/2012/10/building-websites-in-python-with-flask/#.VbsPGBOqqkq

[4] http://flask-cn.readthedocs.org/en/latest/patterns/packages/#id2

Flask + WSGI + Nginx 云部署的更多相关文章

  1. 基于flask+gunicorn+nginx来部署web App

    基于flask+gunicorn&&nginx来部署web App WSGI协议 Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求.Web框架和Web服务 ...

  2. 阿里云部署 Flask + WSGI + Nginx 详解

    抵不住朋友的诱惑,今天终于入手了一台阿里云服务器,是Ubuntu 1.4 32位版本,最初考虑是用来尝尝鲜只是买了个最低配的,价格算起来与在国外买个空间的价格相当吧(可能一年才贵100多),但用起来感 ...

  3. Flask+uwsgi+Nginx+Ubuntu部署

    学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Pyth ...

  4. 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

  5. Flask+uwsgi+Nginx+Ubuntu部署教程

    学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...

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

    我采用的部署方案是: Web 服务器采用 uwsgi host Flask 用 Supervisor 引用 uwsgi 作常规启动服务 基于 Nginx 作反向代理 首先, 阿里云服务器可以通过 SS ...

  7. 【新手向】阿里云上ubuntu+flask+gunicorn+nginx服务器部署(二)项目部署

    本项目实现的是类似于ins的图片分享网站.继续(一),当nginx的配置已修改好后,要在远程服务器上部署网站,只需要几个步骤: 1 前期准备 2 将运行网站的代码从github上下载过来 3 下载依赖 ...

  8. python web开发c6——阿里云上ubuntu+flask+gunicorn+nginx服务器部署(一)简单测试

    简述 Nginx在服务器部署中的作用 请求通过Nginx实现反向代理,将请求提交给代理服务器.本文中只用了一台服务器,所以是代理到本机. gunicorn的作用 作为服务器代码的容器.接收Nginx的 ...

  9. flask+uwsgi+nginx+docker-compose部署

    简单介绍 Flask这里就不多阐述了,已经是很流行的一个轻量级python框架了,对于小.中型项目特别适合.这里用docker的compose编排部署.uwsgi 简单的说明下,uWSGI是一个Web ...

随机推荐

  1. C++对于大型图片的加载缩放尝试

    Qt对于图片的操作主要集中在这几个类 QImage ,QImageReader ,QPixmap 其中QImage这个类对图片的缩放有几个很不错的技巧,不过对于大图片却并不好使,当我们去看QImage ...

  2. 查看APK中MD5签名的方法

    (需下载jdk) 1. 先将apk文件重命名为zip文件 2. 解压zip,其中的META-INF/CERT.RSA文件即MD5签名文件 3. cmd下打开黑窗口,敲入如下命令: keytool -p ...

  3. github使用

    1.首先登录到https://github.com注册Github帐号,并且创建一个repository. 例如:注册的github帐号名为whu-zhangmin,创建的repository名称为w ...

  4. python3练习-杨辉三角/帕斯卡三角形

    杨辉三角形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 # 期待输出: # [1] # [1, 1] # [1, 2, 1] # [1, 3, 3, ...

  5. Kotlin 介绍

    Kotlin (0:00) 大家好,我是 Michael Pardo,今天我要给大家展示一下 Kotlin 这门语言,同时看看他如何让你在 Android 开发的时候更开心,更有效率. Kotlin ...

  6. php基础_函数和类

    ①函数 1.函数名不区分大小写,变量名区分大小写. 2.require()和include() 区别:函数加载失败后,require给出一个致命错误,include只是一个警告. ②类 1.构造方法 ...

  7. NOIP 2015 游记

    本来和zly和wxh约好了 高三一起再来玩一次复赛,结果最终只有我一个人来了说...貌似是年段主任不让去...总算见识了比我们学校的YSD更爱管闲事的年段主任. 今年比赛竟然在衢州二中,学校不大,但感 ...

  8. 发布自己的pods到CocoaPods trunk 及问题记录

    这两天准备把之前写的一些小玩意添加到pods库中去,参考了一些资料后进行操作,实际中也遇到了一些问题,记录下来,问题及解决方式在后面. 参考内容转载如下: 首先更新了用trunk之后,CocoaPod ...

  9. ios 重签名

    http://stackoverflow.com/questions/6569120/resigning-an-application-outside-xcode #!/bin/sh TEMPDIR= ...

  10. 简单研究下Retrofit

    2015-09-24 15:36:26 第一部分: 1. 什么是Retrofit? (点击图片有惊喜) 以上是来自官网的解释,言简意赅,咳咳,我就不翻译了~ 2. 如何使用Retrofit? 2.1 ...