ubuntn 配置webpy nginx

webpy環境搭建

在開始webpy搭建以前,有必要熟悉一下什麼是fastcgi,由於搭建環境時都是使用這個模式去運行webpy程序的,具體的fastcgi描述能夠參考各類百科;fastcgi協議官網(http://www.fastcgi.com/drupal/)上面描述一些基礎信息,fastcgi的api、開發,fastcgi的實現程序,支持fastcgi的web服務器等等。html

除了fastcgi以外還有一些其餘的相關名詞:cgi、fastcgi、wsgi。gi是gateway interface的縮寫,因此前面3個都是屬於一個大類型、一種規範;至於具體規範的誰、怎麼規範的會有各自的不一樣。前端

cgi和fastcgi規範的都是http server與對應解釋程序的之間的通訊;好比apache與Python、nginx與python等。只是它們規範的方式不同;cgi是最原始的公用通訊協議,它規定的是每次有請求就會新起一個應用進程來處理,在請求結束後關閉應用進程【致使反覆新起進程、關閉進程,消耗系統資源】;fastcgi是cgi的擴展,目的就是解決cgi的這種資源消耗的弊端,它規定http server啓動時同時啓動了若干個應用進程【應用進程數可配置】,而後常駐內存等待接收請求並處理,處理完請求後繼續等待不會退出。python

因爲cgi是直接對接那些有標準輸出的應用便可,sh、tcl等;因此使用cgi協議時能夠直接調用應用程序來啓動應用進程,在執行結束後得到標準輸出做爲返回的html內容。而fastcgi則實現了固定的通訊機制,它不能經過直接調用應用程序來執行結果,因此就須要一個支持fastcgi協議的web server/gateway來與之通訊;這樣請求就會經過fastcgi進程傳輸給特定的web請求處理程序【flup】,這個程序會根據業務邏輯處理請求並返回結果;最終經過fastcgi返回給前端的http server。linux

而後再看看fastcgi和wagi的關係,其實它們沒有關係,雖然都是規範,但它們規範的不是一個地方,因此沒有直接可關聯的,惟一可關聯的就是,有些程序會同時實現了這2種協議,好比:flupnginx

fastcgi是通訊規範,規定了通訊的方式、協議;而wsgi是接口規範,規定了函數定義、調用。web

最後還有一個spawn-fcgi,這是一個fastcgi進程管理器【最初是lighttpd的子模塊,lighttpd也是一個與nginx相似的http server】,做用等同於其它http server中的fastcgi模塊;只不過它實現的比較好、在某些狀況下的效能會比較高,因此被你們分離出來普遍使用,以至獨立出來做爲一個項目。【因此就有了apache+spawn-fcgi、nginx+spawn-fcgi等】apache

下面總結了一張圖,大概覆蓋了上面所說的。windows


一般搭建webpy都是想使用它的fastcgi模式,所以搭建webpy能夠有2套方式運行:一是web服務+flup,二是web服務+spawn-fcgi+flup。又由於spawn-fcgi只有linux版本,因此windows下只能使用第一種方式搭建webpy,而linux下則可使用第二種方式。下面內容簡述了這2種方式的搭建過程,web服務器使用的是nginx,官網更多webpy服務的搭建見http://webpy.org/cookbook/index.zh-cn 部署章節,裏面還包括apache、lighttpd等服務器的fastcgi搭建。\api

二、nginx配置熟悉
由於使用nginx服務,因此有必要先熟悉一下nginx服務器的簡單配置,不然配置過程當中出現問題時就會手忙腳亂了,安裝完成nginx後其默認的配置文件裏會有幾種默認配置和註釋說明,不過是英文的,這裏有一個比它更詳細的中文版:http://my.oschina.net/duxuefeng/blog/34880 
注:修改前先備份一個原始的文件瀏覽器

flup中相關下載和配置以下:http://tool.oschina.net/uploads/apidocs/nginx-zh/PythonFlup.htm


三、環境部署
webpy官網搭建說明見:http://webpy.org/cookbook/fastcgi-nginx.zh-cn

python、webpy、flup、nginx分別默認安裝便可,完成後測試各軟件默認安裝是否正常,若是正常則開始修改nginx配置,添加配置一個虛擬主機(在/etc/nginx/sites-available目錄下新建一個文件,文件名能夠自定義,如:example),內容以下:

  1. server{  
  2.     listen       80;  
  3.     server_name  www.test.com;  
  4.     root /path/to/web/root;  
  5.     access_log  logs/www.xx.com.access.log  main;  
  6.   
  7.     location / {  
  8.         include fastcgi_params;   ##包含默認的fastcgi參數  
  9.         fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;    
  10.         fastcgi_param PATH_INFO $fastcgi_script_name;         
  11.         fastcgi_pass 127.0.0.1:9002;                  ##把請求經過fastcgi傳送給本機的9002端口  
  12.     }  
  13.   
  14.     location /static/ {                    #配置靜態文件的訪問  
  15.         if (-f $request_filename) {        #若是請求文件名是一個文件  
  16.         rewrite ^/static/(.*)$  /static/$break;   #直接跳轉到對應的資源,中斷fastcgi的傳輸  
  17.         }  
  18.     }  
  19. }  

 

完了重載nginx配置,nginx -s reload,爲了保險起見,也能夠以下操做:

一、先測試一下nginx.conf文件:./nginx -t   
二、沒有問題在中止服務 ./nginx -s stop
三、啓動服務 ./nginx

此時能夠直接訪問www.test.com,若是出現以下頁面則表示配置nginx的fastcgi格式正確,能夠繼續後面的配置

新建一個py文件,好比code.py,用來接收web請求並處理之,其內容能夠以下:

[python]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3.   
  4.   
  5. import web  
  6.   
  7.   
  8. urls = ("/.*", "hello")  
  9. app = web.application(urls, globals())  
  10.   
  11.   
  12. class hello:  
  13.     def GET(self):  
  14.         return 'Hello, world!'  
  15.   
  16.   
  17. if __name__ == "__main__":  
  18.     app.run()  

運行python程序,python code.py 9002 fastcgi
注:上面的nginx配置文件裏配置的是9002,這裏開啓的就是9002,要保持一致不然就接不上了。
經過瀏覽器訪問localhost,看看是否是返回了Hello, world!

這裏會有一些問題,還要有以下配置:

  (1)將nginx/sites-available中自定義的文件在sites-enabled中創建一個文件映射

  sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

  (2)刪除sites-enabled中的default

  rm /etc/nginx/sites-enabled/default

  (3)重啓nginx服務和相關應用

  service nginx restart




上面是以方式一搭建的,若是使用方式二搭建,則還須要安裝spawn-fcgi,而後修改code.py文件的內容,添加一句代碼,所有內容以下:

  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3.   
  4.   
  5. import web  
  6.   
  7.   
  8. urls = ("/.*", "hello")  
  9. app = web.application(urls, globals())  
  10.   
  11.   
  12. class hello:  
  13.     def GET(self):  
  14.         return 'Hello, world!'  
  15.   
  16.   
  17. if __name__ == "__main__":  
  18.     web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)   ##這行是新增的  
  19.     app.run()  


而後啓動spawn-fcgi程序便可,即不須要直接以fastcgi方式運行code.py文件,而是經過運行spawn-fcgi程序來間接啓動code.py程序,啓動的命令以下:
spawn-fcgi -d /path/to/www -f /path/to/www/code.py -a 127.0.0.1 -p 9002   #端口和nginx配置裏要一致
-f 指定調用FastCGI的web文件,web程序的入口文件,即code.py文件
-d 指定web程序的主目錄,即code.py所在的目錄
-a 綁定到地址 addr
-p 綁定到端口 port
-F 指定產生的 FastCGI 的進程數
-P 指定產生的進程的 PID 文件路徑
-u 和 -g FastCGI 使用什麼身份運行
能夠將進程PID保存下來方便關閉進程:
kill `cat /tmp/zcut.pid`

好比:spawn-fcgi -u www -g www -p /tmp/spwn.pid -F 10 -d /path/to/www -f /path/to/www/code.py -a 127.0.0.1 -p 9002在127.0.0.1的9002端口以www身份啓動webpy服務,webpy主程序路徑爲/path/to/www/code.py,webpy的程序主目錄爲/path/to/www/,總共啓動了10個spawn進程,全部的進程id將存放在/tmp/spwn.pid文件裏

相關文章
相關標籤/搜索