首先使用環境介紹: 系統: CentOS 5.5 32位
Python版本:2.7.2
nginx:1.0.13
ip:192.168.3.3/24
由於CentOS默認自帶都python(2.4.3)版本較低,所以我們采用手動編譯安裝python的方式來使用python 2.7.2
首先安裝python 2.7.2
cd /usr/src/ mkdir python cd python #下載python2.7.2 wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 tar -jvxf Python-2.7.2.tar.bz2 cd Python-2.7.2 ./configure --prefix=/usr/local/python27 --enable-unicode=ucs4
先別急着安裝,為什么后面的步驟能順利進行我們需要我們的python支持zlib模塊,
vi Modules/Setup #在454行左右找到:#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz # 去掉注釋 zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz 然后接着編譯 make && make install
安裝完成后我們想更方面的使用我們新安裝的Python我們做如下更改.
mv /usr/bin/python /usr/bin/python24 ln -s /usr/local/python27/bin/python /usr/bin/python ln -s /usr/local/python27/bin/python2.7 /usr/bin/python2.7
這樣改完我們的yum就無法工作了,我們要修改yum來使yum工作:
vi /usr/bin/yum
將/#!/usr/bin/python改為#!/usr/bin/python2.4即可正常工作(版本可能不一樣需查看自己系統自帶的版本是什么)
現在我們執行python -V查看應該就是我們剛剛安裝的2.7.2版本:
python -V Python 2.7.2
我們安裝了python下面我們就來武裝我們的新python,
我們先為新的Python安裝python的setuptools,配備easy_install.easy_install用於安裝Python第三方擴展包而且只要一個命令即可完成:
下載:
wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
然后直接執行安裝:
sh setuptools-0.6c11-py2.7.egg
安裝好之后我們做一個軟鏈接方便我們使用:
ln -s /usr/local/python27/bin/easy_install* /usr/bin/
然后我們來使用easy_install來安裝Python第三方擴展
安裝本文所需要的web.py
easy_install web.py
然后我們打開Python shell輸入
import web
如果沒有報錯則說明我們安裝成功 安裝flup:
easy_install flup
安裝Spawn-fcgi :
wegt http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz tar -zxvf spawn-fcgi-1.6.3.tar.gz cd spawn-fcgi-1.6.3 ./configure --prefix=/usr/local/spawn-fcgi make && make install ln -s /usr/local/spawn-fcgi/bin/spawn-fcgi /usr/bin/
到這里我們就完成了Python的所有包安裝,下面我們來部署nginx(本博有大量文章來介紹安裝nginx,這里還是再來一遍吧..)
yum -y install zlib-devel pcre-devel openssl-devel # 安裝依賴 wget http://nginx.org/download/nginx-1.0.13.tar.gz # 下載 tar -zxvf nginx-1.0.13.tar.gz cd nginx-1.0.13 ./configure --prefix=/usr/local/nginx\ # 指定安裝目錄為/usr/local/nginx --with-openssl=/usr/include/openssl\ # 啟用ssl --with-pcre\ # 啟用正規表達式 --with-http_stub_status_module # 安裝可以查看nginx狀態的程序 make && make install
我們修改nginx的配置文件:
location / { # root html; # index index.html index.htm; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_pass unix:/tmp/pyweb.sock; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; }
然后創建一個web.py程序:
#!/usr/bin/env python #-*-coding:utf8-*- import web urls = ("/.*", "hello") app = web.application(urls, globals()) class hello: def GET(self): return 'Hello, world!' if __name__ == "__main__": web.wsgi.runwsgi = lambda func, addr = None: web.wsgi.runfcgi(func, addr) app.run()
將內容保存到/usr/local/nginx/html/下命名為index.py(或任意你喜歡的名字) 然后賦予其執行權限:
chmod +x /usr/local/nginx/html/index.py
通過命令創建spawn-fcgi進程:
spawn-fcgi -d /usr/local/nginx/html/ -f /usr/local/nginx/html/index.py -s /tmp/pyweb.sock -u nobody -g nobody
我們使用unix socket,並用nginx的用戶來創建.現在我們訪問http://192.168.3.3/就可以看到:Hello, world!
一、分別正常apt安裝nginx+php5+spawn-fcgi即可;
二、關於配置的說明:
1、網上有很多介紹使用fpm補丁或先安裝lighttpd然后復制spawn-fcgi甚至關閉lighttpd自動啟動來解析php頁面的方法。本人發現可直接apt安裝spawn-fcgi,並在/etc/rc.local中加入/usr/bin/spawn-fcgi.standalone -a 127.0.0.1 -p 9000 -C 8 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid即可。請注意:此處最好為spawn-fcgi.standalone,很多文章只是說使用/usr/bin/spawn-fcgi,但經查,spawn-fcg連接至/etc/alternatives/spawn-fcgi,且該文件又鏈接回/usr/bin/spawn-fcgi.standalone,故直接使用。
2、一定要加入 -C 8參數,此處為spawn-fcgi啟動的子進程數,如果沒有此參數,將很容易出現502 bad gateway錯誤。當然可以使用-C 128或512等,但經實際測試在使用-C 8的情況下,賽揚M1.7的CPU 1G內存 ubuntu 9.10 i386,webbench 並發3000連接持續運行3600秒,在測試同時及結束后均可以正常連入服務器phpinfo.php頁面。而未加-C 8時,並發1000連接才幾秒就出現502 bad gateway錯誤。因我的服務器使用需求遠未達到持續3000並發數的使用環境,故未設置超過8的參數來測試,一直都是使用-C 8已可穩定運行。
3、網上還有文章提出使用upstream解決502 bad gateway的方法,經實際測試在不加-C ?進程數而使用upstream的情況下,同樣很快出現502錯誤。
4、關於nginx配置文件nginx.conf方面,建議worker_processes數值不用設置太大,一般生產環境為了保障穩定性設置為2即可。經一台Xeon E5405 4核CPU、16G內存的服務器webbench並發3000連接數實際測試,worker_processer設置為1、2、4(加worker_cpu_affinity優化及不加)、8共5中環境,測試結果表明worker數為4且加cpu_affinity的情況下,性能最差,反而worker數為1的時候CPU使用率最低,性能最強。但5中情況下進行3輪測試取平均值,測試結果沒有太大差別,排除測試先后及硬盤內存影響的話,本人認為在5種測試環境下,很難有明顯的性能區分。所以我的nginx是設置worker_processer為2,並且一直都運行得很好。