阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx+uWSGI+Supervisor在Ubuntu上部署Flask应用

197次阅读
没有评论

共计 3866 个字符,预计需要花费 10 分钟才能阅读完成。

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


 更多参考

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm 

Nginx+uWSGI+Django+Python 应用架构部署  http://www.linuxidc.com/Linux/2015-10/124183.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Flask+uWSGI+Nginx+Ubuntu 部署教程 http://www.linuxidc.com/Linux/2016-06/132690.htm


部署环境:

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/linuxidc

环境配置:

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/linuxidc/venv;       # Python 解释器所在的路径(这里为虚拟环境)
        uwsgi_param UWSGI_CHDIR /home/linuxidc;             # 项目根目录     
        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/linuxidc                # 项目根目录                                           
                                                                               
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:linuxidc]
command = uwsgi --ini /home/linuxidc/uwsgi.ini  # 跟手动启动的命令一样
stopsignal=QUIT
autostart=true
autorestart=true
stdout_logfile=/var/log/uwsgi/supervisor_linuxidc.log      # 运行日志
stderr_logfile=/var/log/uwsgi/supervisor_linuxidc_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-

更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133064.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计3866字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中