由于项目需要,老师让我写一个小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部署的更多相关文章

  1. Flask采用Virtualenv+Supervisor+Nginx部署应用

    Flask采用Virtualenv+Supervisor+Nginx部署应用 -- 首先是概念解释 WSGI服务器,负责我们的app与服务器的交互,常用的有Gunicorn Web服务器,是个HTTP ...

  2. Ubuntu 14.04 上使用 Nginx 部署 Laravel

    本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...

  3. 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时会带来诸多不便. ...

  4. ubuntu下python flask环境搭建

    ubuntu下python flask环境搭建 1. 安装pip sudo apt-get install python-dev pyhton-pip 2. 安装virtualenv sudo apt ...

  5. ubuntu 下python安装及hello world

    //@desn:ubuntu 下python安装及hello world //@desn:码字不宜,转载请注明出处 //@author:张慧源  <turing_zhy@163.com> ...

  6. tornado + supervisor + nginx 的一点记录

    看了比较多的blog基本都是这个架构: supervisor ------------ app1 |-------app2 |-------.... |-------appn |-------ngin ...

  7. ubuntu 下python环境的切换使用

    如何在Anaconda的python和系统自带的python之间切换 一般ubuntu下有三种python环境,1. 系统自带python2,3;在/usr/bin路径下:2. anaconda下安装 ...

  8. ubuntu下Python的安装和使用

    版权声明 更新:2017-04-13-上午博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Python的开发环境. ...

  9. Ubuntu下安装LNMP之nginx的卸载

    我在安装Nginx时,是采用自己从网上down下自己需要的nginx版本进行编译安装的,如果使用过apt库来进行安装的话可以参考这篇文章:ubuntu中彻底删除nginx 假如是编译安装的童鞋,可以按 ...

随机推荐

  1. VC++ 设置桌面壁纸

    Windows Shell API提供了接口IActiveDesktop来完成墙纸的设置. //IActiveDesktop 接口方法表 (详情参见MSDN) AddDesktopItem AddDe ...

  2. IOS 开发之 -- 过滤掉字符串里面所有的非法字符 字典和json之间的互转

    比如一个字符串: NSString * hmutStr = @"(010)*(123)E6(234)**150-1111-^^-1234#" 很多时候,数据之间的传输,我们仅仅只想 ...

  3. 在visual studio中运行C++心得

    1.在visual studio中建立C++项目 (1)新建->项目->空项目 C++ (2)右击项目->添加->新建项->C++文件(.app) (3编写C++文件   ...

  4. vue2.0中,由于页面完成之后dom还未加载完成如何进行操作

    再vue中,当页面加载完成以后,dom还没有加载,是无法获取进行操作的,但是在vue2.0中提供了一个方法:this.$nextTick,在这个回调函数里面写dom操作即可: 如下代码: create ...

  5. Zabbix-3.0.3使用自带模板监控MySQL

    导读 Zabbix是一款优秀的,开源的,企业级监控软件,可以通过二次开发来监控你想要监控的很多服务,本文介绍使用Zabbix自带的模板监控MySQL服务. 配置userparameter_mysql. ...

  6. excel如何将一个工作薄中的工作表生成独立的工作薄

    excel如何将一个工作薄中的工作表生成独立的工作薄  '用vba代码 Sub 另存所有工作表为工作簿() Dim sht As Worksheet Application.ScreenUpdatin ...

  7. android基础---->AccessibilityService的简单使用(一)

    AccessibilityService类可以帮助我们实现监听手机上别的应用,以下做一个简单的总结.我总是勇敢的离开一个人 却不懂如何巧妙的靠近一个人. AccessibilityService的使用 ...

  8. MemSQL start[c]up Round 1.E

    完全的乱搞题啊... 被坑的要死. 拿到题目就觉得是规律题加构造题, 然后找了了几个小时无果,只知道n为奇数的时候是一定无解的,然后当n为偶数的时候可能有很多解,但是如果乱选择的话,很有可能形成无解的 ...

  9. JavaIo编程基础复习

    什么是Io io是指Input和Output,指输入和输出 Input是指外部读入数据到内存,例如读取一个文件,或者从网络中读取 Output是指把内存中的数据输出到外部,例如写文件,输出到网络 什么 ...

  10. ajax请求步骤

    ajax步骤:第一步:创建xmlhttprequest对象,var xmlhttp = new XMLHttpRequest(); XMLHttpRequest对象和服务器交换数据.第二步:使用xml ...