前言
 
之前用Flask框架开发了一个Python的Web项目,使用Nginx和uWSGI部署起来感觉挺麻烦,过程中还因为对Flask框架的不熟悉,花了好长时间才把应用完全部署起来。下面分享部署成功的相关配置以及部署Flask项目时极可能犯的一个小错误。
 
一、 配置
1. Flask Web项目源码
Nginx使用的版本是1.6.1,uWSGI是2.0.8,Flask是0.10.1。在Linux环境下安装好Nginx、uWSGI和Flask之后,将使用Flask框架开发的web项目源码放到Linux服务器的某个目录下,例如/data/web_app/testpro。以最简单的一个Flask web项目作为例子,其代码只有test.py一个源码文件,内容如下:
1 from flask import Flask
2 app = Flask(__name__)
3
4 @app.route('/')
5 def index():
6 return 'Hello World!'
7
8 if __name__ == '__main__':
9 app.run()
那test.py的完整路径就是/data/web_app/testpro/test.py。
 
2. 配置Nginx
在Nginx的安装目录找到Nginx的配置文件,安装目录一般是/usr/local/nginx,配置文件是nginx.conf,对其进行编辑,使得Nginx能够加载uwsgi。
1 location / {
2 include uwsgi_params;
3 uwsgi_pass 127.0.0.1:5000;
4 }

配置完之后,如Nginx已经启动,那就对其进行重启,否则直接启动。

 
3. 为Flask Web项目添加uWSGI配置文件
在/data/web_app/testpro目录下添加一个uWSGI的配置文件test_config.ini,内容如下:
1 [uwsgi]
2 socket = 127.0.0.1:5000 #注: 指定某个固定端口
3 processes = 4 #注:跑几个进程,这里用4个进程
4 threads = 2
5 master = true
6 pythonpath = /data/web_app/testpro
7 module = test
8 callable = app
9 memory-report = true
其中几个主要参数的含义如下:
  • pythonpath:表示项目目录
  • module:表示项目启动模块,如上例为test.py,这里就为test
  • callable:表示Flask项目的实例名称,上例代码中app = Flask(__name__),所以这里为app
  • socket:表示和Nginx通信的地址和端口,和Nginx配置里的uwsgi_pass一致。
  • processes:表示开启多少个子进程处理请求。
  • threads:每个进程的线程数。
之后启动uWSGI:
1 uwsgi -d /var/log/uwsgi.log --ini /data/web_app/testpro/test_config.ini
其中,-d参数指明日志路径为/var/log/uwsgi.log。
接下来,按照Nginx配置文件中server项下的listen和server_name参数对应的值使用浏览器对项目进行访问,看到输出 “Hello World!” 则表示部署成功。
 
二、 使用Session功能莫忘配置SECRET_KEY
如果Flask的项目使用了Session, Cookies等功能,需要配置SECRET_KEY的值,不然使用上面的方式部署之后,相关涉及Session, Cookies的操作会一直报500的Internal server error,如果是像我这样的新手,那问题定位起来就会很辛苦。明明已经按照标准的教程配置好了,为什么做登录操作的时候还一直报错呢?最后发现是没有配置SECRET_KEY,差点吐血而亡!
这个错误特别容易发生在使用Flask自带的服务器转到上述部署方式的过程中,例如对于上面的Flask web项目,使用Flask自带的服务器运行时,如果配置了SECRET_KEY参数,代码可能会是这样的:
 1 from flask import Flask
2 app = Flask(__name__)
3
4 @app.route('/')
5 def index():
6 return 'Hello World!'
7
8 if __name__ == '__main__':
9 app.secret_key = 'abcdef'
10 app.run(host='xx.xx.xx.xx', port=8080)

项目可以顺利运行,也没问题。但如果是使用Nginx + uWSGI的部署方式,uWSGI服务器启动模块test之后,是直接调用了app这个实例的,if __name__ == '__main__': 及其后面的代码都不会被执行,所以就相当于没有配置secret_key,如果Flask项目使用了session功能的话,就会报错。针对这个情况,上述的代码必须修改为:

 1 from flask import Flask
2 app = Flask(__name__)
3
4 app.secret_key = 'abcdef'
5
6 @app.route('/')
7 def index():
8 return 'Hello World!'
9
10 if __name__ == '__main__':
11 app.run(host='xx.xx.xx.xx', port=8080)

这样才能让使用了session功能的项目顺利地运行。

 
 
 
 
 
原文地址:http://juxuan.fu.blog.163.com/blog/static/112129259201411188132562/

使用Nginx和uwsgi部署Flask项目的更多相关文章

  1. CentOS 下用 Nginx 和 uwsgi 部署 flask 项目

    前几天利用flask 写了几个调用salt-api 的接口,需要上线到正式环境,搜了一下 都是 用 nginx + uwsgi 来部署,这里记录下关键的配置项. 1.首先将代码上传到服务器上目录为: ...

  2. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...

  3. linux上使用nginx、uwsgi部署django项目

    参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...

  4. Nginx+uWSGI部署flask项目

    uwsgi配置 uwsgi安装 安装uwsgi pip install uwsgi 启动uwsgi uwsgin --ini uwsgi.ini # 后台启动 nohup uwsgi --ini uw ...

  5. ubuntu服务器上用Nginx和Uwsgi部署django项目

    开发环境:ubuntu系统,python3环境 django项目目录: fast_foot 为项目根目录,app为项目应用 现在,我们登陆远程服务器 安装Nginx 安装好了,我们看一下nginx的配 ...

  6. 通过Nginx部署flask项目

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

  7. nginx + uwsgi 部署django项目

    因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...

  8. Nginx 和 Gunicorn 部署 Django项目

    目录 Nginx 和 Gunicorn 部署 Django项目 配置Nginx 安装配置Gunicorn 通过命令行直接启动 Gunicorn 与 uwsgi 的区别,用哪个好呢 Gunicorn u ...

  9. 部署Flask项目到腾讯云服务器CentOS7

    部署Flask项目到腾讯云服务器CentOS7 安装git yum install git 安装依赖包 支持SSL传输协议 解压功能 C语言解析XML文档的 安装gdbm数据库 实现自动补全功能 sq ...

随机推荐

  1. Step By Step(Lua弱引用table)

    Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...

  2. Step By Step(Lua表达式和语句)

    Step By Step(Lua表达式和语句) 一.表达式:    1. 算术操作符:    Lua支持常规算术操作符有:二元的"+"."-"."*& ...

  3. Python+Selenium学习笔记9 - 警告框处理

    如下图所示,这种窗口是不能通过前端工具对其进行定位的,这里可以通过switch_to_alert()方法去接受这个弹窗 1 # coding = utf-8 2 3 from selenium imp ...

  4. 摄像头ISP系统原理(中)

    摄像头ISP系统原理(中) AF(FOCUS)----自动对焦 根据光学知识,景物在传感器上成像最清晰时处于合焦平面上.通过更改 LENS 的位置,使得景物在传感器上清晰的成像,是 ISP FOCUS ...

  5. CUDA统一内存分析

    CUDA统一内存分析 PascalMIG 如 NVIDIA Titan X 和 NVIDIA Tesla P100 是第一个包含页 GPUs 定额引擎的 GPUs ,它是统一内存页错误处理和 MIG ...

  6. 自主数据类型:在TVM中启用自定义数据类型探索

    自主数据类型:在TVM中启用自定义数据类型探索 介绍 在设计加速器时,一个重要的决定是如何在硬件中近似地表示实数.这个问题有一个长期的行业标准解决方案:IEEE 754浮点标准.1.然而,当试图通过构 ...

  7. TensorRT 7.2.1 开发概要(下)

    TensorRT 7.2.1 开发概要(下) 1.2. Where Does TensorRT Fit? 一般来说,开发和部署深度学习模型的工作流要经过三个阶段. Phase 1 is trainin ...

  8. 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例

    Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...

  9. Oracle 审计文件

    Oracle审计功能: Oracle11g推出了审计功能,但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,默认情况下,系统为了节省资源,减少I/0操作,其审计功能是关闭的 ...

  10. 测试MySQL锁的问题

    测试MySQL锁的问题 目录 测试MySQL锁的问题 1 Record Lock 2 Next-Key Lock 2 死锁测试 InnoDB支持三种行锁: Record Lock:单个行记录上面的锁 ...