nginx上用fastcgi配置python環境

   費了2天的功夫,翻閱了無數的中文、英文資料,終於搞定。寫下此文留待之後翻閱用php

     本文環境,centOS 5.4 ,Nignx-0.8.49, Python 2.6.5
 
=====================================================================================
       WSGI是Python應用程序或框架和Web服務器之間的一種接口,已經被普遍接受, 它已基本達成它了可移植性方面的目標。  
      WSGI 沒有官方的實現, 由於WSGI更像一個協議. 只要遵守這些協議,WSGI應用(Application)均可以在任何實現(Server)上運行, 反之亦然。
 
     WSGI具體實現有不少種方法,網上有不少的用python寫的框架,好比facebook的tornado,我用的是flup,具體的介紹能夠到  http://pypi.python.org/pypi/flup/1.0
 
     對於WSGI的深刻理解能夠參考本博客的另外一篇文章:
 
     cd /usr/local/src
     wget http://pypi.python.org/packages/2.5/f/flup/flup-1.0-py2.5.egg#md5=3c9368437e9bffb950c6cce54425d32f
     tar -xzvf flup-1.0.3.dev-20100525.tar.gz
     cd     flup-1.0.3.dev-20100525
     python setup.py install
     到此flup安裝完畢
=====================================================================================
 以上是準備工做,下面正式開始
  
 配置nginx,找到nginx.conf
 添加一段以下代碼
 server
  {
    listen  8000;
   server_name test.com;
    location /
    {
       #fastcgi_pass  unix:/tmp/python-cgi.sock;( 注1)
      fastcgi_pass  127.0.0.1:8008; ( 注意這裏的端口和上面的listen的8000端口要不同,不然會報地址已佔用的錯)
      fastcgi_param SCRIPT_FILENAME "";
      fastcgi_param PATH_INFO $fastcgi_script_name;
      include fcgi.conf;
    }
  }
 
注1:這裏最好是用127.0.0.1:8000代替,這樣的話就沒有訪問權限的限制,若是用的是python-cgi.sock,還得chmod 777 python-cgi.sock才能夠,否則的話瀏覽器會出現505的內部錯誤。
 
 引用原文以下:A Web server can connect to a FastCGI server in one of two ways: It can use either a Unix domain socket (a 「named pipe」 on Win32 systems), or it can use a TCP socket. What you choose is a manner of preference; a TCP socket is usually easier due to permissions issues.
 
 
 而後咱們再寫一個fcgi.py,代碼以下
#!/usr/bin/python
# encoding : utf-8
 
from flup.server.fcgi import WSGIServer
 
def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World!\n']
 
if __name__  == '__main__':
   WSGIServer(myapp,bindAddress=('127.0.0.1',8008)).run()( 注2
  
注2,看到了嗎,這裏的bindAddress 的值是一個元組,這個是WSGIServer的源代碼要求這麼寫的,並且它的值對應的是上面fastcgi-pass的值
 
而後咱們就能夠運行python fcgi.py --method=prefork/threaded minspare=50 maxspare=50 maxchildren=1000 ( 注3)
注3:後面的那些參數至關於php-cgi後面的參數,可是具體的用途還須要進一步探索
 
運行到這了,咱們就能夠在瀏覽器裏面敲: http://localhost:8000
若是返回 Hello World,恭喜你,邁出了nginx 運行python的第一步
 
============================================================================================================

 

 

前幾天寫了   nginx上用fastcgi配置python環境(一),在那篇文章裏面我用的是最簡單的配置,在這篇文章裏面我將進一步介紹python

 
須要的軟件 : Linux ,
                    nginx ,
                    spawn-fcgi(一個fastcgi的管理工具) ,
                    flup(用python寫的實現WSGI的模塊,這個很重要,詳細介紹 http://pypi.python.org/pypi/flup/1.0),
                    
===============================================================================================
 
下載安裝好上面說的軟件。nginx配置這些和上一篇文章的同樣,就不說了
說說spawn-fcgi : spawn-fcgi  -f /data/www/python/fcgi.py -a 127.0.0.1 -p 8008  -F 5 -P /var/run/fcgi.pid -u www
                      
                   -f 要執行的文件(不理解的能夠思考php-cgi這個命令)
                   -a 監聽的地址
                   -p 監聽的端口(這個不是nginx監聽的網絡端口,而是nginx的fastcgi-pass傳過來的端口)
                   -F fastcgi開啓的進程數(不理解的能夠思考下php的php-cgi數目)
                   -P 開啓的進程的進程號所寫入的文件(有了這個就能夠很輕鬆的殺掉開啓的fasgcgi)
                   -u  以什麼用戶身份運行(這裏有root會報錯,不知道什麼緣由)
 
 
===============================================================================================
下面上代碼,代碼很簡單
 
#!/usr/bin/python
 
import flup.server.fcgi as flups
 
def myapp(environ, start_response):   
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ["how do you do\n"]
    
if __name__  == '__main__':
    #WSGIServer(myapp,bindAddress=('127.0.0.1',8008)).run()(若是是直接用flup而不用fastcgi就用它)
    flups.WSGIServer(myapp).run() (若是是fastcgi的話就用它)
 
 
在瀏覽器輸入 http://localhost:8000
若是返回 how do you do ,恭喜你,邁出了nginx 運行python的第二步
相關文章
相關標籤/搜索