使用Flask+uwsgi+Nginx部署Flask正式环境
环境准备
在开始正式讲解之前,我们将首先进行环境准备。
Step1:安装Python,pip以及nginx:
sudo apt-get updatesudo apt-get install python-pip python-dev nginx
Step2:安装Python库:uwsgi和flask
pip install uwsgi flask
创建Flask项目
下面,我们以一个简单的单文件Flask项目为例:
假设项目目录为/home/nianshi/flask_project。
编辑/home/nianshi/flask_project/main.py:
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello():return "<h1 style="color:blue">Hello There!</h1>"if __name__ == "__main__":app.run(host='0.0.0.0')
编辑/home/nianshi/flask_project/run.py:
from main import appif __name__ == "__main__":app.run()
运行 python run.py ,然后本地访问 http://127.0.0.1:5000 将会看到:

当然直接使用python run.py运行服务的方式只适合本地开发。线上运行时要保证更高的性能和稳定性,我们需要使用uwsgi进行部署。
使用uwsgi部署Flask项目
使用uwsgi部署Flask项目只需要换一种命令来启动服务即可:
uwsgi --socket 0.0.0.0:5000 --protocol=http -p 3 -w run:app
我们来对uwsgi的参数进行分别讲解:
--socket 0.0.0.0:5000:指定暴露端口号为5000。--protocol=http:说明使用 http 协议,即端口5000可以直接使用HTTP请求进行访问。-p 3表示启动的服务占用3个进程。-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:
[uwsgi]module = run:appmaster = trueprocesses = 3chdir = /home/nianshi/flask_projectsocket = /home/nianshi/flask_project/myproject.socksocket = 127.0.0.1:8000logto = /home/nianshi/flask_project/myproject.logchmod-socket = 660vacuum = true
其中,文件参数说明如下:
- module相当于之前命令行中的-w参数;
- processes相当于之前的-p参数;
- socket此处包含两个,一个是指定了暴露的端口,另外指定了一个myproject.sock文件保存socker信息。
- chdir是项目路径地址。
- logto是日志输出地址。
可以看到,此处我们没有添加--protocol=http对应的配置信息。
即此时我们暴露的端口不能使用HTTP请求直接访问,当时需要经过Nginx进行反向代理。
此时,我们可以执行如下命令来通过配置文件启动uwsgi:
uwsgi --ini /home/nianshi/flask_project/uwsgi.ini
此时,我们已经正常启动了uWsgi服务,但是无法直接访问,需要继续部署Nginx服务。
下面,我们来编辑Nginx的配置文件/home/nianshi/flask_project/nginx.conf:
worker_processes 4;events { worker_connections 1024; }http {include mime.types;default_type application/octet-stream;server {listen 80;location / {include uwsgi_params;uwsgi_pass 127.0.0.1:8000;}}}
其中,如下两行指定反向代理的信息:
include uwsgi_params;uwsgi_pass 127.0.0.1:8000;
两个分别指明了代理的解析方式是通过uwsgi解析以及uWsgi暴露的端口地址为127.0.0.1:8000。
下面,我们启动Nginx服务:
nginx -c /home/nianshi/flask_project/nginx.conf
使用Flask+uwsgi+Nginx部署Flask正式环境的更多相关文章
- centOS+uwsgi+nginx 部署flask项目,问题记录
用flask做的项目想要部署到centOS系统上,填了一些坑,终于成功了,记录一下遇到的问题: 此次部署主要是按照这个博客进行的 https://www.cnblogs.com/Ray-liang/p ...
- 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程
学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...
- Flask+uwsgi+Nginx+Ubuntu部署教程
学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...
- Flask+uwsgi+Nginx+Ubuntu部署
学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Pyth ...
- Flask + Gunicorn + Nginx 部署
最近很多朋友都在问我关于 Flask 部署的问题,说实在的我很乐意看到和回答这样的问题,至少证明了越来越多人开始用 Flask 了. 之前我曾发表过一篇在 Ubuntu 上用 uwsgi + ngin ...
- 转:在 Ubuntu 上使用 Nginx 部署 Flask 应用
转:http://Python.jobbole.com/84286/ 原文出处: Vladik 译文出处:开源中国 我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源 ...
- 通过Nginx部署flask项目
用Flask开发之后,很多人,喜欢用nohup python manage.py & 这样的形式,放到后台运行,其实这样只是个发开模式,很简陋,无法支持并发,进程监控等功能.所以采用nginx ...
- flask+uwsgi+supervisor部署流程
背景: 小鱼最近搞了个工程,python用的2.7(用3也可以),后端使用的是flask,服务器用的linux,使用 flask+uwsgi+supervisor部署 ,查阅相关博客.调试.实操,已经 ...
- 通过uwsgi+nginx启动flask的python web程序
通过uwsgi+nginx启动flask的python web程序 一般我们启动python web程序的时候都是通过python直接启动主文件,测试的时候是可以的,当访问量大的时候就会出问题pyth ...
随机推荐
- Oracle 12c的可插拔数据库PDB
1. 默认安装之后会有一个可插拔数据库:pdborcl 2. 启动根容器: [oracle@eric ~]$ export ORACLE_SID=orcl [oracle@eric ~]$ sqlpl ...
- 弹出DIV锁定代码
<html> <head> <meta http-equiv="Content-Type" content="text/html; ch ...
- canvas 实现微信小游戏
var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); var timer; var iS ...
- kbmMW均衡负载与容灾(3)(转载红鱼儿)
在kbmMW均衡负载与容灾(1)中,介绍了利用ClientTransport的OnReconnect事件,对联接的应用服务器的地址进行更换,做容灾处理.实际上,作者还给我们提供了另外一种机制,直接在C ...
- 762. Prime Number of Set Bits in Binary Representation
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- Linux 目录说解
目录 1.树状目录结构图 2./目录 3./etc/目录 4./usr/目录 5./var/目录 6./proc/目录 7./dev/目录 该文章主要来自于网络进行整理. 目录结构参考地址: http ...
- vueJs的简单入门以及基础语法
1-1基本数据绑定 <div id="app"> {{ msg }} </div> //script new Vue({ el:"#app&quo ...
- springboot 容器启动事件
在springboot 容器启动时,我们需要在启动过程中做一些操作,比如启动容器后,执行某些代码. spring 提供了监听器,我们可以方便的实现这些操作. 在容器启动开始时: package com ...
- 更新源pip
国内镜像源列表 豆瓣(douban) http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 h ...
- IntelliJ IDEA 启动 自动进入项目列表,IDE启动不进入项目,IDE启动不进入上一次的项目
1.希望IDE启动后,不进入上次使用的项目,而进入如图 2.项目很多,想着切换不方便,还得在启动打开前,点击取消,而且拖慢IDE启动的速度,所以进入这个项目列表页还是很好的. 3.设置方法 首先,任意 ...