ubuntu下python+tornado+supervisor+nginx部署

来源:http://www.cnblogs.com/liaohuiqiang/archive/2017/07/13/7162124.html
-Advertisement-
Play Games

把伺服器的圖片顯示給用戶(到時候雇一些人),讓用戶根據圖片錄入文字信息。 ...


由於之前在醫院採集的數據都是拍照得到的處方圖片,而需要用到的是處方的文本形式。因此這兩個星期寫了個小程式把伺服器的圖片顯示給用戶(到時候雇一些人),讓用戶根據圖片錄入文字信息。

之前都是用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/

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開發的進程管理程式,可以將普通的命令變成後臺的守護進程,並監控進程狀態。

安裝好後可以在/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
vim cat /var/log/supervisor/xxx.log

  

(5)nginx:nginx用於反向代理,可以監控80埠,把相應的請求轉發到別的主機以及別的埠上,這裡我們顯示的圖片的路徑不在tornado的static中(static用來存放js和css等前端靜態資源),而是在伺服器另外的位置,所以可以通過nginx的轉發來獲取圖片。另一方面,一般不會暴露其它埠(比如tornado監聽的8001埠)給用戶,所以用nginx來轉發。此外,location /static/指令告訴nginx直接提供靜態目錄文件,而不再代理請求到tornado,nginx可以比tornado更高效地提供靜態文件。

安裝好nginx後,查看相關配置文件,發現這一句: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。

  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/;
     }
 
 }

 

(6)opencv:一個電腦視覺庫,實現了圖像處理和電腦視覺方面的很多通用演算法。由於之前採集數據的時候在處方圖片數據中混雜了人臉圖片,所以採用oepncv里的演算法檢測人臉,如果是人臉則刪除該記錄。然而還是會殘留一些人臉圖片,需要人工清洗,這個數據好像之前有師兄清洗過,到時候拿過來重構一下資料庫。

ps:安裝opencv的時候imshow報錯,雖然imshow用不到,但是強迫症使然,搞了我一天,來來回回裝了十多次,最後還是沒搞定,真是心力交瘁,特想吐嘈:垃圾opencv!毀我青春!頹我精神!耗我時間!磨我意志!浪費人生!!!

好吧我就隨便說說,回頭還要靠它幹活。

cv2.error: /io/opencv/modules/highgui/src/window.cpp:583: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvShowImage

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 頁面效果 實現步驟 1.Jsp頁面要求 2.VO對象中添加非持久化javabean屬性 3.兩種文件下載方式 方式一:不使用struts2提供的文件下載(普通方式) Action類中添加方法: 方式二:使用struts2提供的文件下載 第一步:配置struts.xml 第二步:VO對象中,添加Inp ...
  • php-ml是一個使用PHP編寫的機器學習庫。雖然我們知道,python或者是C++提供了更多機器學習的庫,但實際上,他們大多都略顯複雜,配置起來讓很多新手感到絕望。php-ml這個機器學習庫雖然沒有特別高大上的演算法,但其具有最基本的機器學習、分類等演算法,我們的小公司做一些簡單的數據分析、預測等等都 ...
  • jdk1.7.0_79 眾所周知,Java是一門不用程式員手動管理記憶體的語言,全靠JVM自動管理記憶體,既然是自動管理,那必然有一個垃圾記憶體的回收機制或者回收演算法。本文將介紹幾種常見的垃圾回收(下文簡稱GC)演算法。 在Java堆上分配一個記憶體給實例對象時,此時在虛擬機棧上引用型變數就會存放這個實例對象 ...
  • 10.文件和異常 學習處理文件,讓程式快速的分析大量數據,學習處理錯誤,避免程式在面對意外時崩潰。學習異常,異常是python創建的特殊對象,用於管理程式運行時出現的錯誤,提高程式的適用性,可用性,和穩定性。 學習模塊json,json可以用於保存用戶數據,避免程式意外停止運行時丟失。 學習處理文件 ...
  • 今天在windows下使用notepad++寫了個python腳本,傳到linux伺服器執行後提示:-bash: ./logger.py: usr/bin/python^M: bad interpreter: No such file or directory 1.原因分析 這是不同系統編碼格式引起 ...
  • 數據分頁 ID 姓名 年齡 專業 pageCount ? pageCount : currPage; PreparedStatement pst = conn.prepareStatement("select * from studen... ...
  • 1.postForObject :傳入一個業務對象,返回是一個String 調用方: BaseUser baseUser=new BaseUser(); baseUser.setUserid(userid); baseUser.setPass(pass); String postForObject ... ...
  • 本文就Pandas的運行效率作一個對比的測試,來探討用哪些方式,會使得運行效率較好。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...