由于项目需要,老师让我写一个小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. expected_conditions判断页面元素

    expected_condtions提供了16种判断页面元素的方法: 1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值 2.title_contains:判断当前页面的 ...

  2. jQuery------$.each()遍历类方法

    方法一:(推荐) //遍历city类<div name = 'city' class = 'city'></div> var ck = $(".city") ...

  3. docker的本地仓库换成阿里云的镜像仓库

    1,阿里云上注册账号,我的已经注册好了,仓库名称:registry.cn-hangzhou.aliyuncs.com/woccb2/chen 2,本地安装docker: yum -y install ...

  4. ios笔试题(选择题)

    1-10 C语言 & 计算机基础 1.请看下面一段代码 static int a = 1; int main(){ int b = 2; char *c = NULL; c = (char * ...

  5. Location 对象的assign()和replace()有什么区别?

    window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...

  6. jQuery照片墙相册

    效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/30.htm 本特效支持jquery的版本为1.4.3,暂时不支持1.9以上jquery版本. 代码: < ...

  7. Python全栈day21-22-23(模块)

    一,python的模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  8. 用于把List<Object>转换成Map<String,Object>形式

    /** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...

  9. 1044: Access denied for user 'hehe'@'localhost' to database 'imooc'

    当我使用 mysql授予用户时, GRANT ALL PRIVILEGES ON *.* TO hehe IDENTIFIED BY 'some' WITH GRANT OPTION; 出现:1044 ...

  10. (N)IO Frameworks in Java

    (N)IO Frameworks in Java – Thread.currentThread.join() https://www.ashishpaliwal.com/blog/2008/10/ni ...