以前搞app時候學的webpy,一直用的自帶webserver,最近研究nginx一段時間,決定兩者結合玩一下~html
把搭建的要點總結下,說不定哪天還得用——其實平時手挺懶的...python
1 必備模塊和背景知識nginx
pcre,flup,nginx,webpy,spawn-fcgiweb
pcre是nginx安裝前提;安裝pcre後configur enginx時帶--with-pcre=path,path爲pcre源碼路徑(不是安裝路徑哦)。apache
fastcgi , 通訊規範,規定了通訊的方式、協議;而wsgi是接口規範,規定了函數定義、調用,至關於一組 Python API,提供了對 FastCGI (及其它)協議的支持。django
spawn-fcgi , fastcgi進程管理器,最初是lighttpd的子模塊,lighttpd也是一個與nginx相似的http server,做用等同於其它http server中的fastcgi模塊;只不過它實現的比較好、在某些狀況下的效能會比較高,因此被你們分離出來普遍使用,以至獨立出來做爲一個項目。因此就有了apache+spawn-fcgi、nginx+spawn-fcgi等.瀏覽器
flup, 一個用python寫的web server,也就是cgi中所謂的Server/Gateway,它負責接受lighttpd轉發的請求,並調用你寫的程序 (application),並將application處理的結果返回到apache/lighttpd.cookie
web.py,應該說有了上面的東西你就能夠開始編寫你的web程序了,可是問題是你就要本身處理瀏覽器的輸入輸出,還有cookie、session、模板等各類各樣的問題了,web.py的做用就是幫你把這些工做都作好了,它就是所謂的web framework,另一個出名的是django,不過感受太複雜了,web.py差很少就夠用了(目前web.py對session的支持不是太好)。session
他們關係以下,app
2 配置過程
通通略,見參考文獻2和3
3 源碼註解
大致請參考4,研讀中請務必弄清楚幾個知識點:進程會話,粘滯位,dup2函數等,不然會被不少非核心代碼搞蒙。
其實,核心的代碼就在這,
close(FCGI_LISTENSOCK_FILENO);
dup2(fcgi_fd, FCGI_LISTENSOCK_FILENO);
close(fcgi_fd);
以後的exec操做,子進程都會繼承FCGI_LISTENSOCK_FILENO,而後會在這上面accept(這天然是flup操做wsgi了),而後會寫回accept的句柄,nginx就會受到響應的。
參考文獻:
1 nginx配置大全中文 http://my.oschina.net/duxuefeng/blog/34880
2 webpy官方配置建議 http://webpy.org/cookbook/fastcgi-nginx.zh-cn
3 一箇中文配置示例 http://blog.csdn.net/five3/article/details/7732832
4 spawn-fcgi源碼 http://chenzhenianqing.cn/articles/936.html