uWSGI+Nginx+Flask在Linux下的部署
搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,希望给读者能够少走弯路。
1、flask应用
这里的flask应用随意就好了。下面是一个简单的应用:
目录:
/home/ubuntu/flask_test/
app.py
templates/
index.html
static/
app.py的内容:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
2、用uWSGI对flask应用进行部署
既然uWSGI是一个服务器,使用前就一定要安装,在python下,可以直接使用命令pip install uwsgi安装即可。注意,这里如果是在virtualenv中安装的话,在启动的时候有一定要使用对应的虚拟环境。
uWSGI的启动非常简单,但是它的参数多到让人发指,当然,可以把这些配置信息全部放到配置文件中,跟直接在命令行中使用的效果一样的。由于是最简单的配置方法,所以下面的配置文件只写了最简单的几个参数,能够部署成功就可以了。(另外吐槽一下uWSGI的文档的配置文件读起来好混乱...)
假设我的配置文件叫做uwsgi.ini,注意这个文件可以放在任何地方,只要你喜欢:
[uwsgi]
http=127.0.0.1:8888
wsgi-file=/home/ubuntu/flask_test/app.py
callable=app
touch-reload=/home/ubuntu/flask_test/
没错就是这么少的参数,至于其他参数,有需要回去再慢慢看吧。简单说一些这些参数的含义:
http-socket:使用的通讯协议,除了这个协议之外,还有http和socket,这三者的区别是,http和http-socket都是http协议,两者的区别我也没怎么分,官方文档推荐使用http-socket,socket就是uwsgi协议,官方解释是uwsgi协议通讯效率更高,这里我暂且先使用更加简单的http协议吧。另外如果用socket协议的话,nginx的配置会有所不同,后面会再说。
wsgi-file:这个就是你的flask应用所在的文件
callable:这个是你的flask应用实例的名称,是flask独有的配置项
touch-reload:动态监控文件变化,然后重载服务,是跟uWSGI的emperor有关的配置项,当这个路径下面的文件发生变化,服务就会重新加载,这在部署上线之后对项目内容进行修改的时候十分有用
配置好之后就可以使用命令行工具启动uWSGI服务器:
$ uwsgi --ini /path/to/uwsgi.ini
如无意外,服务就启动了,如果想实现持续监控应用,可以使用emperor功能,顾名思义,emperor帝王的意思,这是动态监控配置文件的选项,对应的vassal(诸侯)是被监控的对象,具体使用是:
$ uwsgi --emperor /path/to/vassals/
注意了,这里--emperor后面的参数是一个文件夹的路径,这个文件夹里面放置了你所有需要监控的应用的配置文件,一旦这些配置文件发生变更,uwsgi就会动态加载,所以虽然对上面的配置文件放置位置没什么特殊要求,但是最好将你的配置文件用软链接的方式放到这个配置文件中:
$ ln -s /file/path/of/conf.ini /path/to/vassals/
最后,配置完成之后,要放在后台持续运行,可以使用nohup命令:
$ nohup uwsgi --emperor /path/to/vassals/ &
到此为止,简单的uWSGI服务就搭建起来了。
3、配置nginx反向代理
安装nginx:sudo apt-get install nginx
启动nginx服务:sudo service nginx start
重载nginx服务:nginx -s reload
这里说一下nginx的配置文件的读写顺序问题:nginx的配置文件是/etc/nginx/nginx.conf,这个配置文件中又引用了/etc/nginx/conf.d/和/etc/nginx/sites-enabled/这两个文件夹的配置文件,通过include来实现。所以,无论是直接在nginx.conf或者在conf.d、sites-enabled中配置都是可以的。
简单的配置文件:
server{
listen 80;
server_name localhost;
location /xxx/yyy/zzz{
proxy_pass http://127.0.0.1:8888;
}
}
上面就是一般的nginx反向代理的配置,如果使用http协议的话,与代理其它服务器的方式没有什么不同。如果是使用uwsgi协议就要使用nginx提供的协议,则需要改变一下写法:
server{
listen 80;
server_name localhost;
location /xxx/yyy/zzz{
include uwsgi_params;
uwsgi_pass unix://path/to/uwsgi.sock
}
}
注意,如果使用uwsgi协议进行通信,则在uWSGI的配置文件中应该使用socket配置项而不是http或者http-socket,也就是类似于下面这种形式:
[uwsgi]
socket=/path/to/uwsgi.sock
wsgi-file=/home/ubuntu/flask_test/app.py
callable=app
touch-reload=/home/ubuntu/flask_test/
uWSGI+Nginx+Flask在Linux下的部署的更多相关文章
- django+uWSGI+nginx的工作原理流程与部署过程
django+uWSGI+nginx的工作原理流程与部署过程 一.前言 知识的分享,不应该只是展示出来,还应该解释这样做是为什么... 献给和我一样懵懂中不断汲取知识,进步的人们. 授人与鱼,不如授人 ...
- linux下如何部署php项目?
linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...
- linux下安装部署ansible
linux下安装部署ansible 介绍 Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点,其中sal ...
- nginx~linux下的部署
一些概念 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄 ...
- Nginx(一):linux下安装nginx与配置
linux系统为Centos 64位 准备目录 [root@instance-3lm099to ~]# mkdir /usr/local/nginx [root@instance-3lm099to ~ ...
- Linux下如何部署FTP服务器
FTP 是 File Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具 vsftpd 是 very secure ...
- Linux下tomcat部署
进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 如果你想直接干掉Tomcat,你可以使用kill命令,直接杀死Tomcat进程 kill -9 7010 然后继续查看 ...
- CentOS 傻瓜式部署uWSGI + nginx + flask
交代背景 这篇帖子是为了提供我自己的July Novel站点的小说数据支撑.解决分布式部署爬虫程序的繁琐过程,由于本人对shell编程并不熟悉,故而先逐步记录操作步骤,通过以下操作达到节省时间的方式. ...
- Nginx+uWSGI+Django+Python在Linux上的部署
搞了一整天,终于以发现自己访问网络的端口是错误的结束了. 首先要安装Nginx,uWSGI,Django,Python,这些都可以再网上查到. 安装好后可以用 whereis 命令查看是否安装好了各种 ...
随机推荐
- SPA页面性能优化
1. 快速启动 —— 极大提升加载速度(important) 快速启动应用,并行发起 Bundle 加载&拉取初始数据.相信大家已经发现了,SPA 初始化时候,不得不等待 bundle 返回并 ...
- P2169 正则表达式
题目背景 小Z童鞋一日意外的看到小X写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符“0”,“1”,“.”和“*”构成,但是他能够匹配出所有在OJ上都AC的程序的核心代码!小Z大为颇感好奇, ...
- EVE-NG FAQ
EVE-NG FAQ How to install EVE on bare box using Ubuntuoriginal ISO distro. Get Ubuntu ISO: https://w ...
- c#数据库连接 出现错误提示:keyword not supported:'connection timeour'
连接字符串错误,如 User Id 被换行了,导致无效字符串 请检查连接字符串是否正确
- 常州day1p4
给定一棵 n 个点的树,树上每个节点代表一个小写字母,询问一个字符串 S 是否在树上出现过? 字符串 S 出现过即表示存在两个点 u,v,u 到 v 的最短路径上依次连接所有点上的字母恰好是 S N ...
- MapReduce(四) 典型编程场景(二)
一.MapJoin-DistributedCache 应用 1.mapreduce join 介绍 在各种实际业务场景中,按照某个关键字对两份数据进行连接是非常常见的.如果两份数据 都比较小,那么可以 ...
- 常用Actoin算子 与 内存管理 、共享变量、内存机制
一.常用Actoin算子 (reduce .collect .count .take .saveAsTextFile . countByKey .foreach ) collect:从集群中将所有的计 ...
- 【翻译】InterlockedIncrement内部是如何实现的?
Interlocked系列函数可以对内存进行原子操作,它是如何实现的? 它的实现依赖于底层的CPU架构.对于某些CPU来说,这很简单,例如x86可以通过LOCK前缀直接支持Interl ...
- html中的事件属性
Window 事件属性 针对 window 对象触发的事件(应用到 <body> 标签): 属性 值 描述 onafterprint script 文档打印之后运行的脚本. onbefor ...
- HDU--2722
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2722 分析:简单最短路,读入数据烦. #include<iostream> #includ ...