使用Nginx和uwsgi部署Flask项目

前言

之前用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/

原文地址:https://www.cnblogs.com/muchengnanfeng/p/9606503.html

时间: 2024-10-10 08:42:02

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

使用supervisor管理nginx和uwsgi部署django项目

使用yum  install  supervisor ,该命令不会产出配置文件 需要执行下条命令: [[email protected]_0_17_centos ~]# echo_supervisord_conf  >  /etc/supervisord.conf 然后添加配置信息,则可以管理服务器了 然后编辑 /etc/supervisord.conf 加上program [program:my_project] command = uwsgi ­­ini /data/my_project/u

nginx基于uwsgi部署Django (单机搭建)

nginx基于uwsgi部署Django (单机搭建) 参考链接: https://blog.51cto.com/wangfeng7399 https://blog.51cto.com/wangfeng7399/2341281 https://blog.csdn.net/shylonegirl/article/details/83030024 安装nignx yum -y install nginx (需要epel源) 安装依赖包 yum groupinstall "Development to

Python-在CentOS7上使用nginx+uwsgi部署Flask框架开发的Web项目

第一步:准备CentOS7服务器 此次部署我采用的是部署到本机的虚拟机环境中,所以先在VM上安装CentOS7.为了避免每次启动虚拟机服务器IP地址就发生改变,所以先配置静态IP,首先在VM workstation的菜单栏上找到虚拟网卡配置菜单,然后将adapter8的dhcp去掉,然后查看gateway(中文名网关).在centos中主要涉及一个文件的配置,在/etc/sysconfig/network_config/(网卡编号,类似cfg_eth0的文件),然后编辑5个地方: 1.BOOTP

生产环境使用Nginx+uwsgi部署Diango项目

环境:CentOS6.5 + Nginx1.11.5 + Python3.5.2 1. 安装基础软件包 yum install -y zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel  2. 安装Python3.5.2版本 源码包下载,戳我 wget https://www.python.org/ftp/python/3.5.2/Python-3.5

nginx+uwsgi部署django项目

操作可参考http://www.linuxyw.com/353.html (nginx+uwsgi+django+python环境部署文档) 这里只说明几点我的配置 环境: Nginx版本:1.7.9 Django版本: 1.6.8 Python版本:2.7.5 Uwsgi版本:2.0.9 安装MySQL-python: 最好源码安装,yum install -y MySQL-python可能因为路径问题import MySQLdb失败,下载地址: http://sourceforge.net/

结合Nginx+Uwsgi部署Django项目

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

使用Nginx+uWSGI部署Django项目

1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi ln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi #建立软链接 uwsgi --version #检查安装成功 3.基于uwsgi+django项目部署 django项目目录结构(orange_manage为app): uwsgi --ht

gunicorn、nginx部署flask项目,并用supervisor来管理进程

本科的时候做公众号,开始提供学生教务查询服务,后端从PHP转到Python,无论是使用django还是flask,部署都没PHP那么方便,每次修改程序完,都是ps ax,然后再kill,再run.emmmmmm,其实一直都知道supervisor,之前配置过几次,都没配成功 ,也就没耐心好好去学一学,刚好寒假想重新学一下flask,就尝试了一下,配置成功,顺便记录下,以便以后的使用. Flask项目开发 emmmmmm,这里就不赘述了,我这里部署的是自己根据Flask官方文档进行练习的项目,如果

使用uWSGI部署django项目

先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范(协议). 还有一种wsgi,uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信.uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information). 部署步骤: 1.