ubuntu下python+tornado+supervisor+nginx部署
由于项目需要,老师让我写一个小web系统,之前都是用java写web,想到自己最近学机器学习要用python,所以用python来写一下,此外,因为想用点新东西,也介于程序比较小,所以考虑用mongodb来存储(没有必要,只是为了接触一下)。
基本架构是这样:(后台语言)python +(web框架和web服务器)tornado + (数据库)mongodb +(进程管理)supervisor + (反向代理)nginx
(1)python:我是看廖学峰的python教程 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
学了一些基本的语句,然后做的时候不懂再查。
(2)tornado:我是看这个教程开始学的http://docs.pythontab.com/tornado/introduction-to-tornado/,英文的官方文档为http://www.tornadoweb.org/en/stable/
tornado用起来特别快,它既可以像spring里转发器那样直接映射请求,又可以像tomcat那样直接监听某个端口的http请求,这些东西tornado都帮我们做好了,我们只需要书写get和post方法就可以了。
其它的就和java web里面差不多了。没有springMVC和hibernate的框架,可以自己在python包里面分层controller, service, dao。
(3)mongodb:非关系型数据库,对于一张表(mongodb里叫collection集合)的每一行数据(mongodb里叫document文档)没有要求统一相同的字段名,可多可少,参差不齐。还有一点就是不支持事务,在python中执行多条读写语句的时候没法回滚,所以要自己想办法在程序中防止并发导致的问题。
比如我需要从collection中find一个status为0的document出来并update成1,代表用户正在查看,用户进行修改后,然后设置status为2之后再放回去,在这里0代表未浏览,1代表正在浏览,2代表已修改。这个时候可能很多个用户同时取到了这个status为0的数据,这就违背了我们的意愿,让很多人对同一个数据进行了修改。可以考虑直接update_one:某个document的status由0改为1并且增多一个唯一字段来标识这个document。然后用这个唯一字段来find到document。这个时候别的用户是无法取到该document的,因为update_one的时候会上锁,别人取不到这条数据。
(4)supervisor:supervisor是用python开发的进程管理程序,可以将普通的命令变成后台的守护进程,并监控进程状态。
因为只是简单用一下,所以安装的挺顺利,如果遇到一些棘手问题,建议看看原始文档http://supervisord.org/index.html
1) supervisor-服务启动版
51服务器上,用apt-get install安装后,主配置文件在/etc/supervisor/supervisord.conf下
在/etc/supervisor/conf.d目录下添加子配置文件printprescription.conf,配置示例如下。
[program:printprescription] #设置守护进程名
command = python /home/liaohuqiang/Code/printprescription/main2.py #设置执行命令
autorstart = true #设置随supervisor的启动而启动
stdout_logfile = /home/liaohuqiang/Code/printprescription/printprescription.log #设置日志路径
配置完成后,可以开启,关闭和重启supervisor服务。可以用supervisorctl status查看进程状态,还可以在相关日志文件查看错误信息
sudo /etc/init.d/supervisor start
sudo /etc/init.d/supervisor stop
sudo /etc/init.d/supervisor restart
sudo supervisorctl status printprescripton
cat /var/log/supervisor/xxx.log
2)supervisor-指令启动版
228和105服务器上supervisor没有配成服务,应该是用easy_install安装的supervisor(官方推荐的安装方式),要自己导入配置文件,通过echo_supervisord_conf >> /etc/supervisor/supervisord.conf建立一个配置文件的样例,然后做相应修改。
无法通过服务来启动关闭,那么需要使用如下指令来开启和关闭,可以用supervisord -h和supervisorctl进入交互式界面后输入help来查看对应的帮助。
supervisord和supervisorctl其实就是python文件,一般装好后都放在python环境的bin目录下,而python的bin一般都被设在环境变量中,所以可以直接在命令行中输入supervisord来执行。可以通过which supervisord找到所在的目录。
启动和关闭supervisor
supervisord
supervisorctl shutdown
查看,启动和关闭进程
supervisorctl status/start/stop/restart 设置的守护进程名
supervisorctl 进入交互模式,可以查看运行的进程状态
3)浏览器控制
另外,在配置文件中添加[inet_http_server]选项组,可以在浏览器中控制supervisor
[inet_http_server]
port=127.0.0.1:9001
username=liaohuqiang
password=
4) 启动报错“unix:///tmp/supervisor.sock no such file”
原因:默认配置中,启动的sock
等会放到tmp
目录,而tmp
目录会自动清理导致无法使用supervisorctl
命令,比如重启机子之后。
解决方法:修改配置文件supervisord.conf,所有的/tmp改成/var/run。创建sock然后授权(touch /var/run/supervisor.sock,chmod 777)。最后重启(supervisorctl shutdown然后supervisord)。
(5)nginx:nginx用于反向代理,可以监控80端口,把相应的请求转发到别的主机以及别的端口上,这里我们显示的图片的路径不在tornado的static中(static用来存放js和css等前端静态资源),而是在服务器另外的位置,所以可以通过nginx的转发来获取图片。另一方面,一般不会暴露其它端口(比如tornado监听的8001端口)给用户,所以用nginx来转发。此外,location /static/指令告诉nginx直接提供静态目录文件,而不再代理请求到tornado,nginx可以比tornado更高效地提供静态文件。
1)nginx-服务启动版
安装好nginx后,查看相关配置文件,51服务器放在/etc/nginx/nginx.conf中,在里面发现这一句:include /etc/nginx/sites-enabled/*,于是可以在这个目录下新建子配置文件进行配置
cat /etc/nginx/nginx.conf
sudo touch /etc/nginx/sites-enabled/default2
配置示例如下,需要注意的是最下面的http://127.0.0.1:8001/ 这里最后一个斜杠如果不打,实际上会加上上面的printprescription,用户访问”主机/printprescription"就相当于访问"主机:8001/printprescription“了,由于自己在tornado上映射的是主机:8001/的请求,所以这个时候会出现404。
配置完成后sudo service nginx restart重新加载配置
upstream frontends {
server 222.222.222.222:;
server 222.222.222.222:;
} server {
listen ; location / {
proxy_read_timeout ;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://frontends;
} location /doctorAfter/ { #配置图片路径
root /home/wenserver;
} location /static/ { #配置前端静态资源路径
root /home/xxx/Code/printprescription/view;
} location /printprescription/ {
proxy_read_timeout ;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8001/;
} }
2)nginx-指令启动版
105服务器上的nginx放在/usr/local/nginx/下
主配置文件放在/usr/local/nginx/conf/nginx.conf下,查看里面的include来确定子配置文件位置
子配置文件的配置同上,不过启动服务的时候要cd到/usr/local/nginx/sbin下来启动nginx
./nginx 启动(默认以nginx目录下conf/nginx.conf配置文件启动)
./nginx -s reload 重载配置文件
./nginx -s stop 立刻停止
./nginx -s quit 完整有序地停止
./nginx -s reopen 重开nginx ./nginx -h 查看指令帮助
./nginx -c 配置文件位置 根据指定位置的配置文件,进行启动
./nginx -t 检查配置文件是否有问题
(6)日志文件
日志文件一般放在/var/log下。
1)像supervisor的主日志放在/var/log/supervisor/supervisord.log
2)配置的tornado日志放在/var/log/tornado/tornado.log
(51服务器上设在了别的位置,当时只是写个小程序,没考虑规范和统一,具体位置看supervisor的配置文件就知道了)
(228服务器,师兄放在了/var/log/tornado.log,因为tornado.log会在本目录产生很多备份日志,这么放会导致/var/log下太多乱七八糟的日志,估计是当初都没考虑太多随意放了)
3)配置的ngnix日志放在了/var/log/nginx/access.log和/var/log/nginx/error.log
(7)opencv:一个计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。由于之前采集数据的时候在处方图片数据中混杂了人脸图片,所以采用oepncv里的算法检测人脸,如果是人脸则删除该记录。然而还是会残留一些人脸图片,需要人工清洗,这个数据之前有师兄清洗过,到时候拿过来重构一下数据库。
ubuntu下python+tornado+supervisor+nginx部署的更多相关文章
- Flask采用Virtualenv+Supervisor+Nginx部署应用
Flask采用Virtualenv+Supervisor+Nginx部署应用 -- 首先是概念解释 WSGI服务器,负责我们的app与服务器的交互,常用的有Gunicorn Web服务器,是个HTTP ...
- Ubuntu 14.04 上使用 Nginx 部署 Laravel
本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...
- ubuntu下python 2.7与python 3.X的转换
ubuntu下python 2.7与python 3.X的转换 由于ubuntu本身自带python 2.7,而python 3.X与2.7有很多不同,所以在使用python 3.X时会带来诸多不便. ...
- ubuntu下python flask环境搭建
ubuntu下python flask环境搭建 1. 安装pip sudo apt-get install python-dev pyhton-pip 2. 安装virtualenv sudo apt ...
- ubuntu 下python安装及hello world
//@desn:ubuntu 下python安装及hello world //@desn:码字不宜,转载请注明出处 //@author:张慧源 <turing_zhy@163.com> ...
- tornado + supervisor + nginx 的一点记录
看了比较多的blog基本都是这个架构: supervisor ------------ app1 |-------app2 |-------.... |-------appn |-------ngin ...
- ubuntu 下python环境的切换使用
如何在Anaconda的python和系统自带的python之间切换 一般ubuntu下有三种python环境,1. 系统自带python2,3;在/usr/bin路径下:2. anaconda下安装 ...
- ubuntu下Python的安装和使用
版权声明 更新:2017-04-13-上午博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Python的开发环境. ...
- Ubuntu下安装LNMP之nginx的卸载
我在安装Nginx时,是采用自己从网上down下自己需要的nginx版本进行编译安装的,如果使用过apt库来进行安装的话可以参考这篇文章:ubuntu中彻底删除nginx 假如是编译安装的童鞋,可以按 ...
随机推荐
- expected_conditions判断页面元素
expected_condtions提供了16种判断页面元素的方法: 1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值 2.title_contains:判断当前页面的 ...
- jQuery------$.each()遍历类方法
方法一:(推荐) //遍历city类<div name = 'city' class = 'city'></div> var ck = $(".city") ...
- docker的本地仓库换成阿里云的镜像仓库
1,阿里云上注册账号,我的已经注册好了,仓库名称:registry.cn-hangzhou.aliyuncs.com/woccb2/chen 2,本地安装docker: yum -y install ...
- ios笔试题(选择题)
1-10 C语言 & 计算机基础 1.请看下面一段代码 static int a = 1; int main(){ int b = 2; char *c = NULL; c = (char * ...
- Location 对象的assign()和replace()有什么区别?
window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...
- jQuery照片墙相册
效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/30.htm 本特效支持jquery的版本为1.4.3,暂时不支持1.9以上jquery版本. 代码: < ...
- Python全栈day21-22-23(模块)
一,python的模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
- 用于把List<Object>转换成Map<String,Object>形式
/** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...
- 1044: Access denied for user 'hehe'@'localhost' to database 'imooc'
当我使用 mysql授予用户时, GRANT ALL PRIVILEGES ON *.* TO hehe IDENTIFIED BY 'some' WITH GRANT OPTION; 出现:1044 ...
- (N)IO Frameworks in Java
(N)IO Frameworks in Java – Thread.currentThread.join() https://www.ashishpaliwal.com/blog/2008/10/ni ...