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
Nginx+uwsgi+supervisor+Ubuntu+flask的更多相关文章
- Python基础 - Ubuntu+Nginx+uwsgi+supervisor部署Flask应用
网上找了许多讲关于Flask应用部署的文章几乎都是一个helloworld的Demo,按照helloworld来部署都没问题,但实际项目部署时还是遇到了不少问题.在这里简单写下自己成功部署的过程,防止 ...
- flask部署:Ubuntu下使用nginx+uwsgi+supervisor部署flask应用
之前一直用的Centos或者Red hat,自从使用Ubuntu后,发现Ubuntu使用起来更方便,自此爱上Ubuntu. 一.从github上下载flask应用 1.我已经成功将自己编写好的应用上传 ...
- Flask+Nginx+uWSGI在Ubuntu服务器上的配置
Flask+Nginx+uWSGI在Ubuntu服务器上的配置 Step1 安装系统环境 Ubuntu服务器选择是阿里云的ECS服务,ECS提供单独的内存\CPU\带宽\存储规格可以选择,并且提供合适 ...
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- Nginx+Gunicorn+Supervisor部署Flask应用
Flask 内置了简单的 Web 环境,让我们在开发的时候只需要专注于应用实现,而真正要在生产环境运行时这个简单的 Web 环境就不够用了,还需要一系列操作才能让 Web 应用高效的运行起来.现在记录 ...
- flask +gevent+nginx+Gunicorn+supervisor部署flask应用
上篇 可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...
- CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目
原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...
- nginx+uwsgi+flask+supervisor 项目部署
环境 - Linux: Ubuntu 16.04 - uWSGI 2.0.18 - Flask 1.0.2 - supervisor 3.2.0 - nginx/1.8.1 首先区分几个概念 WSGI ...
- Ubuntu下nginx+uwsgi+flask的执行环境搭建
选择web framwork是个非常艰难的事情, 主要分为轻量级和重量级框架. 因为没有搭建站点这样的须要, 所以回避SSH, Django这样的框架, 而选择一个轻量级框架. 自己也比較青睐pyth ...
随机推荐
- BootStrap 智能表单系列 十一 级联下拉的支持
像省市县选择的这种,但凡是个人肯定都见过,实现方式有很多种 1.有在第一级选择的时候去加载或者从本地对象中拿第一级对应的数据源显示到列表中,第二级以此类推 2.也有将所有的项都加载到select中,然 ...
- js执行环境相关
Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...
- [学习笔记]今天开始学HTML5!
1,href和src的区别:href有“连接,引用”之意,指两者的连接关系,如<a href=""></a>,<link href="**. ...
- html文件引入其它html文件的几种方法:include方式
可以在一个html的文件当中读取另一个html文件的内容吗?答案是确定的,而且方法不只一种,在以前我只会使用iframe来引用,后来发现了另外的几种方法,那今天就总结这几种方法让大家参考一下. 1.I ...
- iOS 切割图片
- (UIImage *)CutImageWithImage:(UIImage *)image withRect:(CGRect)rect { //使用CGImageCreateWithImageIn ...
- Spring集成log4j日志管理
原文地址:http://blog.csdn.net/naruto1021/article/details/7969535 在使用Spring框架的时候,我们可以很方便的配置log4j来进行日志管理. ...
- python10min系列之多线程下载器
今天群里看到有人问关于python多线程写文件的问题,联想到这是reboot的架构师班的入学题,我想了一下,感觉坑和考察的点还挺多,可以当成一个面试题来问,简单说一下我的想法和思路吧,涉及的代码和注释 ...
- (Problem 41)Pandigital prime
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...
- IOS 表视图(UITableVIew)的使用方法(8)表视图的编辑功能(多选)
在表视图的删除操作中,每次只能够对其中一个单元进行删除,如果想要同时删除多条记录,不得不挨个地进行标准的删除操作 所以如果能够实现多选的机制,无论是删除还是其他功能的嫁接,都会变得更加方便 当UITa ...
- QT5程序发布dll依赖
QT5 发布程序,太庞大了,QT4下,基本的也就20M左右 platforms目录是 对应X:\Qt\Qt5.3.2\5.3\mingw482_32\plugins\platforms 下的qmini ...