由于项目需要,老师让我写一个小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=123456

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:8000;server 222.222.222.222:8001;}server {listen 80;location / {proxy_read_timeout 1800;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 1800;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里的算法检测人脸,如果是人脸则删除该记录。然而还是会残留一些人脸图片,需要人工清洗,这个数据之前有师兄清洗过,到时候拿过来重构一下数据库。

转载于:https://www.cnblogs.com/liaohuiqiang/p/7162124.html

ubuntu下python+tornado+supervisor+nginx部署相关推荐

  1. Ubuntu 14.04 上使用 Nginx 部署 Laravel 4.2

    http://laravel.lapland.name/post/102090021035/how-to-install-laravel-with-an-nginx-on-ubuntu-14-04 U ...

  2. Ubuntu下Python安装了依赖包后仍然找不到包 python setup.py install 解决方案

    Ubuntu下Python安装了依赖包后仍然找不到包 python setup.py install 解决方案 参考文章: (1)Ubuntu下Python安装了依赖包后仍然找不到包 python s ...

  3. Ubuntu下Python使用指南

    Ubuntu下python配置 Ubuntu简单解决多版本python切换以及多版本pip对应问题 python及库在linux下的目录 在ubuntu下pip需要自行安装 sudo apt-get ...

  4. ubuntu 下 python 安装 venv

    ubuntu 下 python 安装 venv 1.首先,确保您的系统已安装 Python3 和 pip3,如果没有安装,可以使用以下命令安装: 2. 接着,安装 virtualenv 包,使用以下命 ...

  5. 记录 win10/Ubuntu18 双系统安装 附Ubuntu下Python,TensorFlow的使用问答

    1.去Linux官网下载Ubuntu 18. 2.U盘刻录Ubuntu: 最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站 https://cn.ultraiso.net/xi ...

  6. [python] tornado supervisor监控 以及 Nginx反向代理

    文章目录 Supervisor 简单的tornado supervisor 配置 启动 效果 Nginx反向代理 安装pcre和nginx nginx配置文件 Supervisor Superviso ...

  7. Ubuntu 下 Python 版本管理

    一.ubuntu与python   ubuntu系统自带python2.7.python3.5两个默认版本,ubuntu自身很多功能都依赖于python2.7.python3.5,所以不管你要用哪个版 ...

  8. python flask gunicorn nginx 部署

    WSGI协议 Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求.Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议.WSGI协议就是用来统一这两者的接口的. ...

  9. Python 应用 uWSGI + Nginx 部署

    新建一个 Django 应用部署 •使用 py 文件启动 uWSGI def application(env, start_response): start_response('200 ok', [( ...

最新文章

  1. 智能媒体管理产品文档转换/预览功能介绍(4)--快速搭建
  2. python和c学习-python与c++交互学习入门之5
  3. Latex常用数学符号
  4. linux中的keeplived源码装,keepalived源码安装及主备配置
  5. CAD公差表以及如何算
  6. 初始JAVA--约定俗成的命名规则
  7. JVM各个组成部分和其基本功能
  8. python三大神器_常用Python代码及花式写法(函数调用自身+三大神器)
  9. Altium AD20的PCB板框绘制、定义板子形状、重新设置原点、放置尺寸标注
  10. apache之mod_status mod_info即时监控模块
  11. Laravel教程 四:数据库和Eloquent
  12. ctypealpha php_PHP Ctype函数(转)
  13. excel计算机二级考试试题,计算机二级考试Excel操作考试题.doc
  14. 【2022】APP-IOS客户端Android客户端安全性测试-常见问题
  15. GDevelop 5教程之 如何在不编程的情况下轻松制作手机游戏
  16. JavaScript动态检测密码强度的原理及实现
  17. 微信公共号开发简单入门
  18. 《战狼Ⅱ》豆瓣十二万影评浅析
  19. 基于stm32f303cbt6的点灯实验(硬件+软件)
  20. 【自我总结】文献调研的思路及方法

热门文章

  1. 执行计划有时不准确_生管如何应对采购物料不及时、回不来?
  2. php对象持久化,在 Oracle 中完成 PHP5 对象的持久
  3. laravel+vue.js的学习以及为什么浏览器中要有井号“#”
  4. Java发送邮件正文带表格
  5. 解决mac找不到隐藏的local文件夹
  6. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY10-降维和度量学习
  7. python所有函数用法_python函数用法总结
  8. linux rcs文件中的ip,linux学习笔记之diff和patch命令
  9. 加减法叫做什么运算_期中备考:数学运算定律、法则与顺序
  10. 网站优化如何才能避免无效收录?