zoukankan      html  css  js  c++  java
  • Nginx+uwsgi+supervisor+Ubuntu+flask

    Nginx+uwsgi+supervisor+Ubuntu+flask

    Nginx+uwsgi+supervisor在Ubuntu上部署flask应用

    网上找了许多讲关于Flask应用部署的文章几乎都是一个helloworld的Demo,按照helloworld来部署都没问题,但实际项目部署时还是遇到了不少问题。在这里简单写下自己成功部署的过程,防止下次部署时就忘记了,好记性不如烂笔头这句话不是盖的。


    部署环境:

    OS: Ubuntu 14.04.4 LTS
    Python: 2.7.6
    Nginx: nginx/1.4.6(Ubuntu)
    uwsgi: 1.9.17.1-debian
    supervisord: 3.0b2 

    这个署架构中Nginx主要作为前置服务器,负责分发处理来自客户端的请求,uwsgi作为后端Flask应用的容器,supervisor作为监控程序,即看门狗。
    由于项目直接放在阿里云服务器上,所以这里省略了项目上传这一步,并假设已经安装好了Python开发环境,若未配置好Python开发环境,请先配置好,本文假设项目所在的位置为/home/chihu

    环境配置:

    sudo apt-get install uwsgi-plugin-python      # 这个不装的话当发起请求时uwsgi会报错

    若是Python3的话改为:

    sudo apt-get install uwsgi-plugin-python3

    STEP 1: Nginx安装配置

    安装Nginx

    1. 输入Nginx安装命令

    sudo apt-get install nginx

    2. 启动Nginx服务器:

    sudo service nginx start

    启动Nginx服务器并用浏览器访问测试一下Nginx是否安装成功,若成功,进入下一步。

    3. 配置Nginx
    进入/etc/nginx/sites-enabled/文件夹 注意不是sites-available

    直接配置/etc/nginx/nginx.conf也可以,不过要根据其语法来配置,其实最后nginx.conf还是会调用/etc/nginx/sites-enabled/default的配置。

    • 先将默认配置文件default备份(养成修改配置前先备份的习惯):

      mv default default.bak
    • 编辑配置文件:

      vim default
    • 写入配置内容:

      server {                                                                       
      listen 80;                   # 服务器监听端口                                                 
      server_name 110.110.110.110; # 这里写你的域名或者公网IP                                                    
      charset      utf-8;          # 编码                                                  
      client_max_body_size 75M;    # 之前写的关于GET和POST的区别,这里应该是原因之一吧                                                   
      
      location / {                                                                   
          include uwsgi_params;         # 导入uwsgi配置                                            
          uwsgi_pass 127.0.0.1:8000;    # 转发端口,需要和uwsgi配置当中的监听端口一致                                             
          uwsgi_param UWSGI_PYTHON /home/chihu/venv;       # Python解释器所在的路径(这里为虚拟环境)      
          uwsgi_param UWSGI_CHDIR /home/chihu;             # 项目根目录     
          uwsgi_param UWSGI_SCRIPT manage:app;             # 项目的主程序                           
      }                                                                              
      }

      输入:wq保存配置文件。配置好了之后别急着启动Nginx,记得先通过nginx -t测试一下配置文件是否正确,若检测配置文件失败,再好好检查下配置文件有没有疏漏。

    此时访问Nginx服务器应该会得到502 Bad Gateway的提示,因为请求被Nginx转发了,但是并没有转发服务器来处理请求(还没有配置好uwsgi)。


    STEP 2: uwsgi安装配置

    安装uwsgi

    sudo apt-get install uwsgi

    编写uwsgi配置文件
    在项目文件根目录新建配置文件uwsgi.ini(uwsgi支持多种配置文件格式, xml, ini, json等)

    vim uwsgi.ini

    写入配置内容如下:

    [uwsgi]                                                                        
                                                                                   
    socket = 127.0.0.1:8000             # uwsgi的监听端口                                              
                                                                                   
    plugins = python                    # 这行一定要加上,不然请求时会出现-- unavailable modifier requested: 0 --错误提示                                                   
                                                                                   
    chidir = /home/chihu                # 项目根目录                                           
                                                                                   
    wsgi-file = manage.py               # flask程序的启动文件                                           
                                                                         
    callable = app                      # 程序变量名                                           

    输入:wq保存配置文件,可以通过uwsgi uwsgi.ini来启动uwsgi。


    STEP 3: 启动及测试

    Nginx和uwsgi都配置好了之后下一步就是启动Nginx和uwsgi了。

    • 启动Nginx

      sudo service nginx restart
    • 启动uwsgi
      进入项目根目录,即uwsgi.ini所在的目录,执行以下命令。

      uwsgi wsgi.ini

    若一切正常的话就可以在终端上看到uwsgi的启动信息了。

    测试:
    打开浏览器访问服务器,若可以正常访问,说明Nginx和uwsgi配置成功了,但离真正项目上线还差一段,因为uwsgi是直接在前台启动的,当我们的连接终端跟服务器断开的时候uwsgi进程也被关闭了,所以我们需要让uwsgi在后台运行。
    ---

    STEP 4: 进程监控

    原本打算用uwsgi emperor的方式运行uwsgi即让uwsgi成为守护进程(daemon),但是折腾了一天还是没解决问题,遂换supervisor。(折腾uwsgi emperor到后面发现问题是,当单独使用uwsgi的时候一切正常,但一使用uwsgi emperor就会出现os.environ.get()获取不到环境变量的问题,但环境变量明明可以通过env看到,直接在Python终端上执行os.environ.get()也可以获取到.....等有时间再回过头了折腾。)

    单独一个uwsgi程序运行短时间可能没问题,但是网络状况瞬息万变,万一uwsgi进程挂了网站也就访问不了了.....为了防止出现意外情况,还需要一个监控程序来监控uwsgi的状况,这里该supervisor出场了。具体什么是supervisor可以Google之。

    1. 首先安装supervisor

    sudo apt-get install supervisor

    2. 生成默认配置文件

    echo_supervisord_config > supervisord.conf

    3. 加入监控程序的配置

    [program:project_name]          # project_name这里写上你的项目名称,如我的为[project:chihu]
    command = uwsgi --ini /home/chihu/uwsgi.ini  # 跟手动启动的命令一样
    stopsignal=QUIT
    autostart=true
    autorestart=true
    stdout_logfile=/var/log/uwsgi/supervisor_chihu.log      # 运行日志
    stderr_logfile=/var/log/uwsgi/supervisor_chihu_err.log  # 错误日志

    4. 启动supervisord

    supervisorctl reload

    5. 检查uwsgi进程是否正常运行

    ps aux|grep uwsgi

    如果一切正常,此时应该可以看到uwsgi进程
    尝试kill掉uwsgi进程看supervisor会不会重新启动一个新的uwsgi进程

    sudo killall uwsgi

    若再次通过ps aux|grep uwsgi查看发现有新的uwsgi进程在运行,那差不多可以祝你成功了, God bless you。


    后记:
    折腾了两天终于搞定,有时候教程看着简单,你的配置也和教程一样,但就是由于各种错误无法运行,虽然说计算机非0即1,是我们人类最忠实可靠的伙伴,但是有时候就差那么一点点,有可能是软件环境不对亦或是我们电脑的打开方式不对...总之,就是要有那么个折腾的过程,所谓吃一堑长一智,不折腾折腾估计过后就忘了怎么回事了,还是要勤动手不放弃,虽然被一个uwsgi emperor折腾得快要怀疑人生了,但我还是坚定不移地...改道supervisor了 :)
    ---
    初次写教程,文中可能有疏漏或写得不够恰当的地方,还请各位看官多多包涵,欢迎指正和交流。如果部署的过程中有问题也欢迎留言,虽然不能保证可以解决。

    -EOF-

    参考:

    https://segmentfault.com/a/1190000004294634 # uwsgi及Nginx配置
    http://vladikk.com/2013/09/12/serving-flask-with-nginx-on-ubuntu/#comment-2401229330 # uwsgi emperor
    http://letgoof.me/2013/deploy-django-project-with-uwsgi-nginx-and-supervisor/ # supervisor配置
    http://liyangliang.me/posts/2015/06/using-supervisor/ # supervisor & supervisord

  • 相关阅读:
    通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
    计量经济学 第四版 课后答案 李子奈 潘文卿 版 课后 练习题答案 高等教育出版社 课后习题答案
    统计学 第四版 课后题答案 袁卫 庞皓 贾俊平 杨灿 版 思考与练习题 课后答案 案例分析 答案与解析
    golang逃逸分析
    通过实例理解Java网络IO模型
    带你逆袭kafka之路
    解决2020-3-27 github无法访问
    图床
    Python彩蛋--zen of python
    python3内置函数大全
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5649236.html
Copyright © 2011-2022 走看看