设为首页 收藏本站
查看: 790|回复: 0

[经验分享] uWSGI+Nginx+Flask在Linux下的部署

[复制链接]

尚未签到

发表于 2017-12-23 20:48:31 | 显示全部楼层 |阅读模式
  搞了一天多,终于搞通了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>  这里说一下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/
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-427321-1-1.html 上篇帖子: nginx+php7+mysql 在centos7.3下安装 下篇帖子: nginx学习之压缩解压篇(七)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表