因爲項目須要,老師讓我寫一個小web系統,以前都是用java寫web,想到本身最近學機器學習要用python,因此用python來寫一下,此外,由於想用點新東西,也介於程序比較小,因此考慮用mongodb來存儲(沒有必要,只是爲了接觸一下)。css
基本架構是這樣:(後臺語言)python +(web框架和web服務器)tornado + (數據庫)mongodb +(進程管理)supervisor + (反向代理)nginxhtml
(1)python:我是看廖學峯的python教程 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000前端
學了一些基本的語句,而後作的時候不懂再查。java
(2)tornado:我是看這個教程開始學的http://docs.pythontab.com/tornado/introduction-to-tornado/,英文的官方文檔爲http://www.tornadoweb.org/en/stable/python
tornado用起來特別快,它既能夠像spring裏轉發器那樣直接映射請求,又能夠像tomcat那樣直接監聽某個端口的http請求,這些東西tornado都幫咱們作好了,咱們只須要書寫get和post方法就能夠了。nginx
其它的就和java web裏面差很少了。沒有springMVC和hibernate的框架,能夠本身在python包裏面分層controller, service, dao。web
(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的時候會上鎖,別人取不到這條數據。spring
(4)supervisor:supervisor是用python開發的進程管理程序,能夠將普通的命令變成後臺的守護進程,並監控進程狀態。mongodb
由於只是簡單用一下,因此安裝的挺順利,若是遇到一些棘手問題,建議看看原始文檔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裏的算法檢測人臉,若是是人臉則刪除該記錄。然而仍是會殘留一些人臉圖片,須要人工清洗,這個數據以前有師兄清洗過,到時候拿過來重構一下數據庫。