环境准备

在开始正式讲解之前,我们将首先进行环境准备。

Step1:安装Python,pip以及nginx:

  1. sudo apt-get update
  2. sudo apt-get install python-pip python-dev nginx

Step2:安装Python库:uwsgi和flask

  1. pip install uwsgi flask

创建Flask项目

下面,我们以一个简单的单文件Flask项目为例:
假设项目目录为/home/nianshi/flask_project
编辑/home/nianshi/flask_project/main.py

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def hello():
  5. return "<h1 style="color:blue">Hello There!</h1>"
  6. if __name__ == "__main__":
  7. app.run(host='0.0.0.0')

编辑/home/nianshi/flask_project/run.py

  1. from main import app
  2. if __name__ == "__main__":
  3. app.run()

运行 python run.py ,然后本地访问 http://127.0.0.1:5000 将会看到:

当然直接使用python run.py运行服务的方式只适合本地开发。线上运行时要保证更高的性能和稳定性,我们需要使用uwsgi进行部署。

使用uwsgi部署Flask项目

使用uwsgi部署Flask项目只需要换一种命令来启动服务即可:

  1. uwsgi --socket 0.0.0.0:5000 --protocol=http -p 3 -w run:app

我们来对uwsgi的参数进行分别讲解:

  1. --socket 0.0.0.0:5000:指定暴露端口号为5000。
  2. --protocol=http:说明使用 http 协议,即端口5000可以直接使用HTTP请求进行访问。
  3. -p 3表示启动的服务占用3个进程。
  4. -w run:app:-w 指明了要启动的模块,run 就是项目启动文件 run.py 去掉扩展名,app 是 run.py 文件中的变量 app,即 Flask 实例。

启动完成后,我们可以在任意网络连通的机器上打开浏览器,并访问如下地址:
http://server_domain_or_IP:5000

可以看到结果同样如下:

至此,我们已经正常使用uwsgi部署了Flask项目。

使用nginx + uwsgi部署Flask项目

既然我们已经可以好似用uwsgi来部署Flask项目了,那么我们为什么还要使用Nginx + uwsgi来部署呢?
使用Nginx有如下一些优点:

  • 安全:不管什么请求都要经过代理服务器,这样就避免了外部程序直接攻击web服务器
  • 负载均衡:根据请求情况和服务器负载情况,将请求分配给不同的web服务器,保证服务器性能
  • 提高web服务器的IO性能:对于一些静态文件,可以直接由反向代理处理,不经过web服务器

那么,应该如何将Nginx与uwsgi结合来部署Flask项目呢?

在开始讲解Nginx之前,我们首先讲解如何将复杂的uwsgi命令参数保存在配置文件中,从而每次启动uwsgi时,无需添加繁琐的参数,只需要指定配置文件即可。
编辑/home/nianshi/flask_project/uwsgi.ini

  1. [uwsgi]
  2. module = run:app
  3. master = true
  4. processes = 3
  5. chdir = /home/nianshi/flask_project
  6. socket = /home/nianshi/flask_project/myproject.sock
  7. socket = 127.0.0.1:8000
  8. logto = /home/nianshi/flask_project/myproject.log
  9. chmod-socket = 660
  10. vacuum = true

其中,文件参数说明如下:
- module相当于之前命令行中的-w参数;
- processes相当于之前的-p参数;
- socket此处包含两个,一个是指定了暴露的端口,另外指定了一个myproject.sock文件保存socker信息。
- chdir是项目路径地址。
- logto是日志输出地址。

可以看到,此处我们没有添加--protocol=http对应的配置信息。
即此时我们暴露的端口不能使用HTTP请求直接访问,当时需要经过Nginx进行反向代理。
此时,我们可以执行如下命令来通过配置文件启动uwsgi:

  1. uwsgi --ini /home/nianshi/flask_project/uwsgi.ini

此时,我们已经正常启动了uWsgi服务,但是无法直接访问,需要继续部署Nginx服务。

下面,我们来编辑Nginx的配置文件/home/nianshi/flask_project/nginx.conf

  1. worker_processes 4;
  2. events { worker_connections 1024; }
  3. http {
  4. include mime.types;
  5. default_type application/octet-stream;
  6. server {
  7. listen 80;
  8. location / {
  9. include uwsgi_params;
  10. uwsgi_pass 127.0.0.1:8000;
  11. }
  12. }
  13. }

其中,如下两行指定反向代理的信息:

  1. include uwsgi_params;
  2. uwsgi_pass 127.0.0.1:8000;

两个分别指明了代理的解析方式是通过uwsgi解析以及uWsgi暴露的端口地址为127.0.0.1:8000
下面,我们启动Nginx服务:

    1. nginx -c /home/nianshi/flask_project/nginx.conf

使用Flask+uwsgi+Nginx部署Flask正式环境的更多相关文章

  1. centOS+uwsgi+nginx 部署flask项目,问题记录

    用flask做的项目想要部署到centOS系统上,填了一些坑,终于成功了,记录一下遇到的问题: 此次部署主要是按照这个博客进行的 https://www.cnblogs.com/Ray-liang/p ...

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

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

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

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

  4. Flask+uwsgi+Nginx+Ubuntu部署

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

  5. Flask + Gunicorn + Nginx 部署

    最近很多朋友都在问我关于 Flask 部署的问题,说实在的我很乐意看到和回答这样的问题,至少证明了越来越多人开始用 Flask 了. 之前我曾发表过一篇在 Ubuntu 上用 uwsgi + ngin ...

  6. 转:在 Ubuntu 上使用 Nginx 部署 Flask 应用

    转:http://Python.jobbole.com/84286/ 原文出处: Vladik   译文出处:开源中国    我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源 ...

  7. 通过Nginx部署flask项目

    用Flask开发之后,很多人,喜欢用nohup python manage.py & 这样的形式,放到后台运行,其实这样只是个发开模式,很简陋,无法支持并发,进程监控等功能.所以采用nginx ...

  8. flask+uwsgi+supervisor部署流程

    背景: 小鱼最近搞了个工程,python用的2.7(用3也可以),后端使用的是flask,服务器用的linux,使用 flask+uwsgi+supervisor部署 ,查阅相关博客.调试.实操,已经 ...

  9. 通过uwsgi+nginx启动flask的python web程序

    通过uwsgi+nginx启动flask的python web程序 一般我们启动python web程序的时候都是通过python直接启动主文件,测试的时候是可以的,当访问量大的时候就会出问题pyth ...

随机推荐

  1. Java关键字解释及作用

    JAVA 关键字及其作用解释 1. 访问控制 1) private 私有的 private 关键字是访问控制修饰符,可以应用于类.方法或字段(在类中声明的变量). 只能在声明 private(内部)类 ...

  2. get load 代理对象

    01使用session中的load方法查询数据库中的记录时,我们返回的是一个代理对象,而不是真正需要的那个对象. 02 因为代理对象的出现 才导致延迟加载. 还有采用懒加载的时候容易出现nosessi ...

  3. Oracle导入的常见语句

    登录sql > sqlplus / as sysdba 创建表空间sql > create tablespace TABLESPACE datafile 'e:\tables1.dbf' ...

  4. 2018.10.23 hdu2476String painter(区间dp)

    传送门 一道挺妙的区间dp. 我们先用区间dp求出第一个串为空串时的最小代价. 然后再加入原本的字符更新答案就行了. 代码: #include<bits/stdc++.h> using n ...

  5. vue 开发系列(六) 企业微信整合

    概述 手机端程序可以和企业微信进行整合,我们也可以使用企业微信JSSDK功能,实现一些原生的功能. 整合步骤 在整合之前需要阅读 整合步骤. http://work.weixin.qq.com/api ...

  6. GDI基础(3):绘制图片

    1.CBitmap位图类封装了Windows GDI中的位图和操作位图的成员函数.CPen.CBrush.CFont.CBitmap是常用的Windows GDI对象,和CFont一样,CBitmap ...

  7. C++STL 迭代器

    迭代器类别: 输入迭代器(只读迭代器).输出迭代器(只写迭代器).正向迭代器.双向迭代器.随机访问迭代器 逆向遍历 for(vector<int>::reverse_iterator ri ...

  8. zl

    https://mooc.study.163.com/course/2001281002?tid=2001392029&_trace_c_p_k2_=a1ef6cb9a64342008c8f5 ...

  9. 关于DOM级别的一些问题,DOM0,DOM1,DOM2

    之前看书没太注意这个问题,直到我今天看书看到一个DOM0级,于是我就在群里问了下各个级别的意思区别.. 首先我们的确定标准了是没有DOM0级的.在平时阅读的时候可能会读到DOM0级(DOM Level ...

  10. urb的处理流程

      USB分析 2013年11月11日 16:06:24 阅读数:1807 转载自:http://blog.csdn.net/aaa6695798/article/details/4776202 很久 ...