由于项目需要,老师让我写一个小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. Microsoft Word、Excel、PowerPoint转Pdf

    Worksheet.ExportAsFixedFormat Method Mark: The ExportAsFixedFormat method is used to publish a workb ...

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

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

  3. [NOIP2017]列队 离线+SBT

    [NOIP2017]列队 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵 ...

  4. 【BZOJ2565】最长双回文串 Manacher

    [BZOJ2565]最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为 ...

  5. 《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-C API映射

    原创文章,欢迎转载.转载请注明:关东升的博客 Swift与Objective-C API映射 在混合编程过程中Swift与Objective-C调用是双向的,由于不同语言对于相同API的表述是不同的, ...

  6. Kafka+SpringMVC+Maven应用示例

    本文借助主流SpringMVC框架向大家介绍如何在具体应用中简单快捷的使用kafka.kafka.maven以及SpringMVC在现在的企业级应用中都占据着非常重要的地位,所以本文将三者结合起来也可 ...

  7. vue+node+mongoDB 火车票H5(六)---城市列表保存到MongoDB数据库并且启用node.js服务

    把车站列表保存到数据库,并且从本地创建服务 node.js创建httpserver 1.搭建基于express的运行环境 全局安装express-gengerator cnpm install -g ...

  8. 160322、Maven手动安装Oracle的jar包

    oracle的jar包 收费所以不能通过配置pom.xml获得,可以通过以下方法在pom.xml中引用 在命令行窗口执行(注意更改路径): mvn install:install-file -Dgro ...

  9. Ubuntu下如何修改文件或者文件夹的权限

    Ubuntu下如何修改文件或者文件夹的权限------chmod的亲身测试   具体原理如下: Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下.              一 介 ...

  10. Hadoop伪分布安装详解(四)

    目录: 1.修改主机名和用户名 2.配置静态IP地址 3.配置SSH无密码连接 4.安装JDK1.7 5.配置Hadoop 6.安装Mysql 7.安装Hive 8.安装Hbase 9.安装Sqoop ...