Flask + WSGI + Nginx 云部署

这几天学着用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 [email protected] : 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

接下来安装supervisor,

supervisor的安装

my_flask [email protected] : sudo apt-get install supervisor

配置supervisor

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

[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

时间: 2024-08-02 23:45:33

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

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 需要部署的同学有些帮助. 环

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

我采用的部署方案是: Web 服务器采用 uwsgi host Flask 用 Supervisor 引用 uwsgi 作常规启动服务 基于 Nginx 作反向代理 首先, 阿里云服务器可以通过 SSH 指令在本机的终端进行远程连接 ssh [email protected]云服务器地址 输入密码进入后所有的操作与本地终端完全一至. 安装 Python 环境 接下来是python , Ubuntu 的默认环境已经预装 python 2.7 所以只需要安装 python 的 pip 安装工具即可.

【Flask】flask+uwsgi+nginx环境部署

在centos上,部署flask框架的环境,我选择了uwsgi和nginx 具体步骤为: 配置nginx+uwsgi 安装nginx  nginx/1.12.2安装Flask  0.10.1安装uwsgi  2.0.16(64bit)安装uwsgi-plugin-python 2.0.16 创建一个flask项目 1 #!/usr/bin/python 2 # coding=utf-8 3 4 from flask import Flask 5 import sys 6 reload(sys)

flask+uwsgi+nginx+docker-compose部署

简单介绍 Flask这里就不多阐述了,已经是很流行的一个轻量级python框架了,对于小.中型项目特别适合.这里用docker的compose编排部署.uwsgi 简单的说明下,uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议. Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范. 这是官方

Flask+uWSGI+Nginx项目部署

?写完项目总不能一直在本地跑,我也是第一次部署项目,这里把部署过程记录一下,暂且把坑略去,遇到的错误之后在整理发出来. 准备工作 云服务器一台(这里以阿里云服务器为例,系统装的Centos7) 代码仓库(我用的gitee) 开始部署 初始化系统环境 uWSGI不能使用root用户,所以添加个新的用户: adduser xxx passwd username gpasswd -a username wheel (添加到sudo用户组) 切换到自己创的用户下: sudo -iu username 初

结合Nginx+Uwsgi部署Django项目

大致想法以及背景: 刚开始创建Django项目,可以通过runserver命令更方便地调试程序,但是如果当一个项目完成了之后,需要部署到真正的环境,就需要考虑其稳定性.之前在写毕设的时候,写过一个自动化运维监控的项目,部署在自己的阿里云服务器上.那时候没啥经验,直接一个(pyhon runserver 0.0.0.0:8888 &)让项目在后台自己跑.所以对一些项目挂掉,数据库连接失败等问题不能够及时定位解决.所以现在花点时间结合Nginx+Uwsgi部署自己的项目,利用Nginx处理静态资源请

Python开发入门与实战17-新浪云部署

17. 新浪云部署 上一章节我们介绍了如何在本地windows服务器部署python django的网站,本章我们简要说明一下如何把python django工程部署到云服务上. 本章章节我们描述如何在新浪云上部署python django 项目.首先,我们需要注册新浪云用户账号,新浪云用户现在需要实名认证,通过实名认证的账号创建的应用才能正常运行. 17.1. 创建应用 注册成功后登录SAE,进入我的首页,点击创建新应用,创建一个新的应用myseasite,开发语言选择Python. 17.2

nginx+uwsgi部署fabric-bolt

配置nginx.conf vim nginx.conf          location / {             root /www/fabric-bolt/lib/python2.7/site-packages/fabric_bolt;             include   uwsgi_params;             uwsgi_pass  192.168.1.121:9001;             uwsgi_param UWSGI_CHDIR /www/fabr