搞了一天多,终于搞通了uWSGI的部署原理,下面总结一下遇到的一些坑,希望给读者能够少走弯路。

       简单来说,uWSGI是一个web服务器,Nginx进行反向代理的其实跟这些服务器可以说没有任何关系,你提供动态内容的服务器可以是apache/nginx/tomcat,当然也可以是uWSGI,他们之间的代理关系其实都是通过tcp/ip协议进行通信的。当然uWSGI相对于其它服务器来说有其特殊的地方,不同之处在于它可以提供独特的uwsgi协议进行通信。也就是说,nginx和uWSGI之间的通信协议可以有多种选择,但常用http和uwsgi这两种。
 
  搞懂了这个之后,整个部署过程就就剩下相对独立的几步:
    1、首先要有一个flask应用
    2、然后用uWSGI对flask应用进行部署
    3、配置nginx的反向代理,指向uWSGI的ip和端口,或者指向sock文件

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下的部署的更多相关文章

  1. django+uWSGI+nginx的工作原理流程与部署过程

    django+uWSGI+nginx的工作原理流程与部署过程 一.前言 知识的分享,不应该只是展示出来,还应该解释这样做是为什么... 献给和我一样懵懂中不断汲取知识,进步的人们. 授人与鱼,不如授人 ...

  2. linux下如何部署php项目?

    linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...

  3. linux下安装部署ansible

    linux下安装部署ansible 介绍 Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点,其中sal ...

  4. nginx~linux下的部署

    一些概念     Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄 ...

  5. Nginx(一):linux下安装nginx与配置

    linux系统为Centos 64位 准备目录 [root@instance-3lm099to ~]# mkdir /usr/local/nginx [root@instance-3lm099to ~ ...

  6. Linux下如何部署FTP服务器

    FTP 是 File Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具 vsftpd 是 very secure ...

  7. Linux下tomcat部署

    进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 如果你想直接干掉Tomcat,你可以使用kill命令,直接杀死Tomcat进程 kill -9 7010 然后继续查看 ...

  8. CentOS 傻瓜式部署uWSGI + nginx + flask

    交代背景 这篇帖子是为了提供我自己的July Novel站点的小说数据支撑.解决分布式部署爬虫程序的繁琐过程,由于本人对shell编程并不熟悉,故而先逐步记录操作步骤,通过以下操作达到节省时间的方式. ...

  9. Nginx+uWSGI+Django+Python在Linux上的部署

    搞了一整天,终于以发现自己访问网络的端口是错误的结束了. 首先要安装Nginx,uWSGI,Django,Python,这些都可以再网上查到. 安装好后可以用 whereis 命令查看是否安装好了各种 ...

随机推荐

  1. 《Unix网络编程卷1:套接字联网API》读书笔记

    第一部分:简介和TCP/IP 第1章:简介 第2章:传输层:TCP.UDP和SCTP TCP:传输控制协议,复杂.可靠.面向连接协议 UDP:用户数据报协议,简单.不可靠.无连接协议 SCTP:流控制 ...

  2. 【BZOJ4817】树点涂色(LCT,线段树,树链剖分)

    [BZOJ4817]树点涂色(LCT,线段树,树链剖分) 题面 BZOJ Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义 ...

  3. ZJOI2018 D1

    归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...

  4. dTree 动态生成树

    http://luohua.iteye.com/blog/451453 dTree 主页:http://destroydrop.com/javascripts/tree/ dTree是个很方便在页面生 ...

  5. php7实现基于openssl的加密解密方法

    还需要注意的是加密字符串长度问题,如果加密字符串长度太长需要进行分段加解密,如下代码: 加密:(公匙加密,私密一般用来解密) function encrypt($originalData){ $pub ...

  6. gitlab之邮箱配置

    一.gitlab配置邮件通知功能 编辑/etc/gitlab/gitlab.rb 文件   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #配置如下   gitlab_rai ...

  7. 前端PHP入门-028-文件操作-掌握级别

    作为刚入门我们员经常会干的意见事情是ctrl+c和ctrl+v,鼠标右键删除文件.会control+c(或右键)复制.粘贴文件以及新建文件,还可以设置文件的是否为只读文件等等 可不可以写入修改配置文件 ...

  8. sourceTree的下载与安装

    一. SourceTree是什么? 一个拥有可视化界面的项目版本控制的软件,适用于git项目管理,在window和mac均可使用. 二. SourceTree下载 下载地址:SourceTree官网 ...

  9. forEach、for+i、map的用法及区别

      array.forEach(callback[, thisObject]); 下面是参数的详细信息: 1. callback : 函数测试数组的每个元素. 2.thisObject : 对象作为该 ...

  10. Weblogic安装与配置图文详解

    Weblogic是什么Weblogic的安装Weblogic创建域Weblogic管理域Weblogic的应用Weblogic是什么 Weblogic这是我入职以后第一次接触到的词汇,我很陌生,就从我 ...