pythonrunfcgi
Ⅰ 在學django,在線上部署時候,採用nginx + fastcgi部署遇到問題
推薦uwsgi或者gunicon方式部署。
Ⅱ 如何用 FastCGI 運行 Django
首先要安裝 flup ,
這是 python 處理 FastCGI 的庫。
FactCGI 採用 c/s 模型,獨立的運行一個進程。在需要處理請求時,web 伺服器(apache, httpd,..)直接和 FactCGI 進程進行通信即可。
web 伺服器可通過兩種辦法和 FastCGI server 連接:
1. Unix domain socket(或 win32 的「命名管道")
2. TCP socket
通常 TCP socket 更簡單,因為許可權問題比較好配置。
如何啟動 FactCGI 伺服器:
到項目目錄中,執行:
./manage.py runfcgi [options]
如果要看幫助:
./manage.py runfcgi help
在選項中,需要指定一個 socket 或 host 和 port 的組合,這樣的話,當你啟動 web server 時,就可以通過這些信息來連接到 FactCGI 伺服器。
例子
在 TCP 埠中運行一個線程內伺服器:
./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
在 Unix domain socket 上運行一個 preforked 伺服器:
./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
不作為後台進程執行(便於調試):
./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock
如何停止後台的 FastCGI 進程:
1. 如果指定了 pidfile 屬性,則可以這樣:
kill `cat $PIDFILE`
其中 $PIDFILE 是你指定的 pidfile 選項。
要重啟 Unix 上的後台 FactCGI 進程,可執行下列 shell 腳本:
#!/bin/bash
# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec /usr/bin/env - \
PYTHONPATH="../python:.." \
./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
Apache 的設定:
1. 需要安裝了 mod_fastcgi
2. 編輯 httpd.conf:
(1) 用 FastCGIExternalServer 指向 FastCGI 伺服器的位置
可以用 socket 也可以用主機+埠的方式指定。例子:
# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
# Connect to FastCGI via a TCP host/port.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
不管上述那種情況,/home/user/public_html/mysite.fcgi 這個文件是不需要存在的。其作用指示作為一個 URL 指示 Web 伺服器哪些請求需要被 FastCGI 來處理。
(2) 用 mod_rewrite 來分派需要處理的 URL 到 FastCGI.
例子:
<VirtualHost 12.34.56.78>
ServerName example.com
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
RewriteRule ^/(media.*)$ /$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>
這里指示的重寫後的 url 就是上面 FastCGIExternalServer 中那個。
上述配置將不是 /media/ 開頭的,或者指向不存在的文件的請求,轉給了 FastCGI.
lighttpd 配置
lighttpd 天然的支持 FastCGI.
首先要確認你的 mod_fastcgi 在模塊列表中,並且在 mod_rewrite 和 mod_access 後,在 mod_accesslog 前。
為了服務 admin media, 也許你還需要 mod_alias.
在 lighttpd 的配置文件中加如下一段:
server.document-root = "/home/user/public_html"
fastcgi.server = (
"/mysite.fcgi" => (
"main" => (
# Use host / port instead of socket for TCP fastcgi
# "host" => "127.0.0.1",
# "port" => 3033,
"socket" => "/home/user/mysite.sock",
"check-local" => "disable",
)
),
)
alias.url = (
"/media/" => "/home/user/django/contrib/admin/media/",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon\.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/mysite.fcgi$1",
)
還可以在一個 lighttp 伺服器上跑多個 Django. 只要為每一個應用指定一個獨立的 FastCGI host.
如何在共享的 web hosting 上運行 Django / Apache:
編輯 .htaccess:
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
再寫一個 mysite.fcgi 的可執行的腳本:
#!/usr/bin/python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/home/user/python")
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
在更新代碼後,可以通過重新上傳 mysite.fcgi 文件來指示 Apache 重啟 Django 程序。
如果有 shell 許可權,可以直接用 touch 命令改變時間戳:
Ⅲ linux下python和webpy怎麼搭建
基於python的web開發,這里我們使用linux為開發環境,搭建基於nginx + web.py + fastcgi
有些基本基本概念解釋下,哈哈,因為我不懂
1.wsgi為Web伺服器網關介面(Python Web Server Gateway Interface,縮寫為WSGI)是是為Python語言定義的Web伺服器和Web應用程序或框架之間的一種簡單而通用的介面。自從WSGI被開發出來以後,許多其它語言中也出現了類似介面
2.uwsgi,另一種python定義的web伺服器和web應用的介面
3.REST服務,REST(Representational State Transfer表述性狀態轉移)是一種針對網路應用的設計和開發方式,可以降低開發的復雜性,提高系統的可伸縮性。
4.CRUD是指在做計算處理時的增加(Create)、查詢(Retrieve)(重新得到數據)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。主要被用在描述軟體系統中資料庫或者持久層的基本操作功能
以下內容主要來自
http://webpy.org/cookbook/fastcgi-nginx
需要的軟體
nginx 0.7以上版本,我使用的是nginx 0.9.2
webpy我使用的web.py-0.37
spawn-fcgi 1.6.3
flup 1.0
nginx的配置請參看官方文檔
spawn-fcgi是lighttpd的一個子項目用於多進程管理
webpy和flup安裝方式為解壓後運行python setup.py install
安裝編寫index.py
點擊(此處)折疊或打開
#!/usr/bin/env python
# -*- coding: utf-8 -*-
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()
注意index.py需要使用命令chmod +x index.py加入可執行許可權
將index.py放入/data/www(我所使用的目錄你可以修改)
修改nginx.conf配置
index要加入index.py
Nginx的配置加入
點擊(此處)折疊或打開
location / {
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_pass 127.0.0.1:9002;
}
使用Spawn-fcgi
spawn-fcgi -d /data/www -f /data/www/index.py -a 127.0.0.1 -p 9002
如果報錯為126,說明index.py沒有可執行許可權
netstat -lnp | grep 9002參考是否啟動成功
我運行的實際為
spawn-fcgi -d /data/www -f /data/www/index.py -a 127.0.0.1 -p 9002 -F 2
啟動2個進程
啟動nginx
瀏覽器輸入地址
成功結束
Ⅳ 如何windows+django+fastcgi+iis
首先要安裝 flup ,
這是 Python 處理 FastCGI 的庫。
FactCGI 採用 c/s 模型,獨立的運行一個進程。在需要處理請求時,web 伺服器(apache, httpd,..)直接和 FactCGI 進程進行通信即可。
web 伺服器可通過兩種辦法和 FastCGI server 連接:
1. Unix domain socket(或 win32 的「命名管道")
2. TCP socket
通常 TCP socket 更簡單,因為許可權問題比較好配置。
如何啟動 FactCGI 伺服器:
到項目目錄中,執行:
./manage.py runfcgi [options]
如果要看幫助:
./manage.py runfcgi help
在選項中,需要指定一個 socket 或 host 和 port 的組合,這樣的話,當你啟動 web server 時,就可以通過這些信息來連接到 FactCGI 伺服器。
Ⅳ 如何windows下nginx+django+flup python3
1、安裝python
下載最新的python版本,在本文撰寫時為 python 3.4,
下載地址:https://www.python.org/ftp/python/3.4.0/python-3.4.0.msi,現在完成後點擊運行,完成python安裝(如c:/python34).
配置python路徑支持,右鍵「計算機」=》「屬性」=》「高級系統設置」=》「高級」=》「環境變數」=》「系統變數」=>"Path"=&
gt;"編輯",在後面追加";c:\python34"。這樣,就可以在命令行窗口下直接運行"python.exe"。運行"cmd",打開一個控制
台窗口,運行"python -V",顯示「Python 3.4.0"即表示成功。
2、安裝Django
下載最新版 Django
1.6.2,下載地址: https://www.djangoproject.com/m/releases/1.6/Django-
1.6.2.tar.gz。下載完成後解壓(例如解壓到"D:\Django-1.6.2")。運行"cmd"打開控制台窗口,切換到"d:
\django-1.6.2",運行"setup.py install",安裝完成後啟動python,輸入"import
django;print(django.VERSION)" 顯示「(1, 6, 2, 'final', 0)」即表示成功。
配置django路徑支持,右鍵「計算機」=》「屬性」=》「高級系統設置」=》「高級」=》「環境變數」=》「系統變數」=>"Path"=&
gt;"編輯",在後面追加";C:\Python34\Lib\site-packages\django\bin"。這樣,就可以在命令行窗口下直接
運行django命令。打開控制台窗口,輸入"django-admin.py -h"顯示幫助信息表示成功。
3、下載Flup
注意要支持python3.x系列的 flup3
,下載地址: https://codeload.github.com/chxanders/flup3/zip/master.zip。解壓後如果運
行解壓根目錄下的setup.py會顯示下載setuptools錯誤。所以直接提取子目錄(flup)並拷貝到python第三方軟體目錄下
(C:\Python34\Lib\site-packages)目錄下即可。
啟動python,運行"import flup;print(flup.__path__)",列印"['C:\\Python34\\lib\\site-packages\\flup']"即表示成功。
4、安裝nginx
下載最新的 nginx - 1.5.13
,,下載地址:http://nginx.org/download/nginx-1.5.13.zip。下載後解壓到一個特定目錄(如C:\nginx)即可。
運行nginx,打開瀏覽器,輸入"127.0.0.1",顯示" Welcome to nginx!"即表示成功。
5、新建項目
運行"cmd"打開控制台窗口,輸入"d:"(假設項目目錄為d:\mysite)切換到d盤。輸入"django-admin.py startproject mysite",這樣就建立了一個名為"mysite"的項目.
6、重定向nginx靜態文件到"mysite"
編輯"C:\nginx\conf\nginx.conf"文件,將其中第一個"... root
html;..."更改為「root d:/mysite/html」。運行"c:\nginx\nginx.exe -s
reload"重新載入nginx。打開瀏覽器,輸入「127.0.0.1」,顯示「404」錯誤。這是因為"d:\mysite\html"目錄及文件
不存在。新建"d:\mysite\html"目錄,並在此目錄下新建一個"hello.html"文件。輸
入"<html><body>Hello</body></html>",保存。打開瀏覽器,輸
入"127.0.0.1/hello.html",應該會顯示"hello"信息。
7、運行django fastcgi服務
打開控制台,進入"d:\mysite"目錄,運行"manage.py runfcgi method=threaded host=127.0.0.1 port=8008".啟動FastCGI服務。
8、修改nginx配置文件「nginx.conf",在第一個server(listen 80)組,做一下修改
#1、注釋默認的頁面位置:
#location / {
# root html;
# index index.html index.htm;
#}
#2、添加 定向所有頁面請求到FastCGI
location / {
root d:/mysite;
fastcgi_pass 127.0.0.1:8008;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
#3、定向靜態頁面請求到頁面目錄中
location ~* \.(gif|jpg|jpeg|html|js|css|png)$ {
root d:/mysite/html;
index index.html index.htm;
}
運行"nginx -s reload"更新配置。
在目錄(d:\mysite\html)下添加頁面文件"hello.html".在瀏覽器中輸入localhost/hello.html將顯示該靜態頁面內容。
9、在瀏覽器中鍵入"localhost"將顯示django歡迎頁面。
Ⅵ 如何用 FastCGI 運行 Django
首先要安裝 flup ,
這是 Python 處理 FastCGI 的庫。
FactCGI 採用 c/s 模型,獨立的運行一個進程。在需要處理請求時,web 伺服器(apache, httpd,..)直接和 FactCGI 進程進行通信即可。
web 伺服器可通過兩種辦法和 FastCGI server 連接:
1. Unix domain socket(或 win32 的「命名管道")
2. TCP socket
通常 TCP socket 更簡單,因為許可權問題比較好配置。
如何啟動 FactCGI 伺服器:
到項目目錄中,執行:
./manage.py runfcgi [options]
如果要看幫助:
./manage.py runfcgi help
在選項中,需要指定一個 socket 或 host 和 port 的組合,這樣的話,當你啟動 web server 時,就可以通過這些信息來連接到 FactCGI 伺服器。
例子
在 TCP 埠中運行一個線程內伺服器:
./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
在 Unix domain socket 上運行一個 preforked 伺服器:
./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
不作為後台進程執行(便於調試):
./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock
如何停止後台的 FastCGI 進程:
1. 如果指定了 pidfile 屬性,則可以這樣:
kill `cat $PIDFILE`
其中 $PIDFILE 是你指定的 pidfile 選項。
要重啟 Unix 上的後台 FactCGI 進程,可執行下列 shell 腳本:
#!/bin/bash
# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec /usr/bin/env - \
PYTHONPATH="../python:.." \
./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
Apache 的設定:
1. 需要安裝了 mod_fastcgi
2. 編輯 httpd.conf:
(1) 用 FastCGIExternalServer 指向 FastCGI 伺服器的位置
可以用 socket 也可以用主機+埠的方式指定。例子:
# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
# Connect to FastCGI via a TCP host/port.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
不管上述那種情況,/home/user/public_html/mysite.fcgi 這個文件是不需要存在的。其作用指示作為一個 URL 指示 Web 伺服器哪些請求需要被 FastCGI 來處理。
(2) 用 mod_rewrite 來分派需要處理的 URL 到 FastCGI.
例子:
<VirtualHost 12.34.56.78>
ServerName example.com
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
RewriteRule ^/(media.*)$ /$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>
這里指示的重寫後的 url 就是上面 FastCGIExternalServer 中那個。
上述配置將不是 /media/ 開頭的,或者指向不存在的文件的請求,轉給了 FastCGI.
lighttpd 配置
lighttpd 天然的支持 FastCGI.
首先要確認你的 mod_fastcgi 在模塊列表中,並且在 mod_rewrite 和 mod_access 後,在 mod_accesslog 前。
為了服務 admin media, 也許你還需要 mod_alias.
在 lighttpd 的配置文件中加如下一段:
server.document-root = "/home/user/public_html"
fastcgi.server = (
"/mysite.fcgi" => (
"main" => (
# Use host / port instead of socket for TCP fastcgi
# "host" => "127.0.0.1",
# "port" => 3033,
"socket" => "/home/user/mysite.sock",
"check-local" => "disable",
)
),
)
alias.url = (
"/media/" => "/home/user/django/contrib/admin/media/",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^/favicon\.ico$" => "/media/favicon.ico",
"^(/.*)$" => "/mysite.fcgi$1",
)
還可以在一個 lighttp 伺服器上跑多個 Django. 只要為每一個應用指定一個獨立的 FastCGI host.
如何在共享的 web hosting 上運行 Django / Apache:
編輯 .htaccess:
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
再寫一個 mysite.fcgi 的可執行的腳本:
#!/usr/bin/python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/home/user/python")
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
在更新代碼後,可以通過重新上傳 mysite.fcgi 文件來指示 Apache 重啟 Django 程序。
如果有 shell 許可權,可以直接用 touch 命令改變時間戳:
touch mysite.fcgi
Ⅶ 在Windows系統上搭建Nginx+Python+Mysql環境的教程
1 安裝nginx
下載windows上的nginx最新版本,/en/download.html。
解壓後即可。
運行nginx.exe後本地打開localhost,將會看到歡迎頁面,這證明nginx在本地運行良好,如果沒有出現歡迎頁面,請檢查是否有進程佔用了80埠。
2 安裝flup
下載對應版本的flup,這里下載flup3.x版本,適合python3.2,下載地址:https:///chxanders/flup3
解壓(比如解壓到D:flup)
安裝(進入到python的安裝路徑,然後執行下面的命令
1 python setup.py install )
!注意,如果提示缺少setuptools,安裝distribute-0.6.49.tar.gz,安裝方法和flup安裝一樣,下載地址:https:///pypi/distribute/0.6.49
3 安裝Mysql
在這里我使用的是5.1版本。在win系統上雙擊安裝文件,下一步下一步完成。下載地址:/downloads/
4 安裝資料庫驅動
下載用於win上對應py版本的的python-mysql驅動,雙擊安裝即可。下面的下載地址是3.2:
/wangqc/distribute-0.6.49.zip
5 配置伺服器
首先需要修改nginx的配置文件nginx.conf。
找到:
1 2 3 4 location / { root html; index index.html index.htm; } 在裡面加上:
1 2 3 4 5 6 7 8 9 10 11 12 # host and port to fastcgi server fastcgi_pass 127.0.0.1:55880; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; 然後測試該配置文件是否正確,在cmd中切換到nginx安裝目錄里,輸入
1 nginx.exe -t 即可開始對配置文件測試,如果提示成功,說明配置正確,
這是可以結束掉任務管理器中所有的nginx.exe進程,重新運行ngin.exe重啟nginx服務。
6 運行Server.py
在cmd下切換到項目目錄,輸入命令
1 python Server.py runfcgi method=threaded host=127.0.0.1 port=55880 注意,
這條命令只能用來啟動項目,如果出現錯誤並不會給出提示。下面是正確的情況.
用瀏覽器打開127.0.0.1:8080 測試一下,項目是不是已經跑起來了(第一次運行等待的時間稍長,請耐心等待)。
7 一些注意事項
(1)、首先應該改的地方,這個大家應該都知道:
1 DEBUG = TEMPLATE_DEBUG = False#將debug設置為False (2)、改一下ALLOWED_HOSTS,我死死的就將這個給忘了,我的`配置:
1 2 3 4 if DEBUG:#根據DEBUG來確定 ALLOWED_HOSTS = [""] else: ALLOWED_HOSTS = ["localhost","127.0.0.1"] (3)、重頭戲來了,配置nginx:
這里相關的代碼網上很多,但是幾乎都沒有說明一件事:
配置location ~ ^/static/ 的位置,一定要在location ~ ^/的前面,而且不能單純的使用 location /static/ 或者location /static ,不然,static文件夾中的靜態文件都不能載入!!!
ps:提起這個,慢慢的淚啊,就錯在這里了。
嫌麻煩可以寫成批處理,運行的時候雙擊一下就好了。
Ⅷ webpy + nginx with fastcgi方案怎麼樣
起初我很是奇怪,按理說只有當靜態文件不存在時nginx才會返回404錯誤,而現在訪問的是配置在nginx.conf中的一個動態路徑,該動態路徑請求通過fastcgi最終會映射到某個python class的GET或POST方法中,那為什麼nginx會返回404呢?
查閱相關文檔之後發現
fastcgi在遇到webpy或其他後端http模塊處理極慢的情況下,也就是說超過nginx允許的應答時間,nginx就會對此動態路徑請求做出404的應答
針對此情況,我開始著手准備一系列測試和實驗
實驗
實驗一:剝離fastcgi,單獨使用webpy,進行壓力測試
這個實驗很簡單,只需要注釋掉一行代碼,便可以以純webpy方式訪問,基於webpy的python應用main入口一般都是這樣:
?
1
2
3
4
if __name__ == "__main__":
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func,addr)
app.add_processor(web.loadhook(session_hook))
app.run()
只需要注釋掉第二行即可,之後在終端下運行python <filename>.py,webpy會默認監聽本地的8080埠,之後無論是通過瀏覽器還是其他方式訪問相應地址即可
同時,還需要准備一份發起http請求的代碼,python用來干這活最簡單不過了
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import httplib
server = "192.168.2.2:8080"
url = "/user/[email protected]&password=111&rnd=33"
class perftest:
def __init__(self):
pass
def run(self):
conn = httplib.HTTPConnection(server)
for i in range(100):
try:
conn.request("GET", url)
rsp = conn.getresponse()
if 200 == rsp.status:
print "headers", rsp.getheaders()
content = rsp.read()
print "content", content
except Exception, ex:
print "ERR:", ex
conn.close()
跑了幾次壓力之後,webpy扛不住了…開始大面積拋異常,大致意思是python自帶的logging模塊出錯,因為有頻繁的文件打開關閉操作,某個操作導致文件句柄被非法訪問…
在查看相關的log封裝類之後發現,python的日誌模塊設計實在是有點不夠內聚,也可以說不夠徹底吧,不由得想起了之前用過的log4net,真是簡潔啊
出錯的原因在項目中開發同事封裝的log模塊多次執行了addHandler和removeHandler操作,據說在之前的開發過程中還出現過一行日誌列印多遍的情況,而且隨著程序的運行,相同的日誌會越來越多…
順手將該封裝修改為單例類之後,故障解除
處理完之後接著跑壓力,webpy還是會偶爾列印異常信息,不過已經變成了session訪問異常,還好的是出現面積很小,於是開始增加壓力測試的並發量,結果表明穩定度還是可以的,性能也在可以接受的范圍之內
實驗二:保持最終部署環境不變(nginx+fastcgi+webpy),繼續壓力測試
在上次測試解決完日誌的問題之後,我開始以真實環境做相關的測試,要注意的是使用nginx之後,需要訪問nginx.conf中配置綁定的相關埠,不再是webpy默認的8080埠
繼續做上述的壓力測試,性能也在可以接受的范圍之內
實驗三:模擬用戶環境
根據測試MM所描述的,瀏覽器在B子系統出錯過程中扮演了很關鍵的角色,於是我分別使用幾個瀏覽器和純粹的python代碼分別訪問相同的地址
幾種組合的測試發現:
瀏覽器在只訪問B子系統的情況下,一直表現正常
一旦瀏覽器訪問過A子系統之後,再次訪問B子系統即出現測試MM描述的404現象
python代碼一直訪問正常
Ⅸ web.py的開發
web.py 內置了web伺服器。可以按照 tutorial 學習如何寫一個Web應用。 寫完後,將你的代碼放到 code.py 並如下面的方法來啟動伺服器:
python code.py
打開你的瀏覽器輸入 http://localhost:8080/ 查看頁面。 若要制定另外的埠,使用 python code.py 1234。 現在所運行 web.py 程序的web伺服器是挺不錯的, 但絕大多數網站還是需要更加專業一些的web伺服器。web.py 實現了 WSGI 並能在任何兼容它的伺服器上運行。 WSGI 是一個web伺服器與應用程序之間的通用API, 就如Java 的 Servlet 介面。 你需要安裝 flup (download here) 使web.py 支持with CGI, FastCGI 或 SCGI, flup提供了這些API的WSGI介面。
對於所有的CGI變數, 添加以下到你的 code.py:
#!/usr/bin/env python
並運行 chmod +x code.py 添加可執行屬性。
LightTPD 在產品中通過FastCGI結合lighttpd是web.py使用的一種推薦方法。 reddit.com 通過該方法來處理百萬次的點擊。
lighttpd config設置參考如下:
server.moles = (mod_fastcgi, mod_rewrite)
server.document-root = /path/to/root/
fastcgi.server = ( /code.py =>
(( socket => /tmp/fastcgi.socket,
bin-path => /path/to/root/code.py,
max-procs => 1
))
)
url.rewrite-once = (
^/favicon.ico$ => /static/favicon.ico,
^/static/(.*)$ => /static/$1,
^/(.*)$ => /code.py/$1
)
在某些版本的lighttpd中, 需要保證fastcgi.server選項下的check-local屬性設置為false, 特別是當你的 code.py 不在文檔根目錄下。
如果你得到錯誤顯示不能夠導入flup, 請在命令行下輸入 easy_install flup 來安裝。
從修訂版本 145開始, 如果你的代碼使用了重定向,還需要在fastcgi選項下設置bin-environment變數。 如果你的代碼重定向到http://domain.com/ 而在url欄中你會看到 http://domain.com/code.py/, 你可以通過設置這個環境變數來阻止。 這樣你的fastcgi.server設置將會如下:
fastcgi.server = ( /code.py =>
((
socket => /tmp/fastcgi.socket,
bin-path => /path/to/root/code.py,
max-procs => 1,
bin-environment => (
REAL_SCRIPT_NAME =>
),
check-local => disable
))
)
Apache
使用 CGI
添加以下到 httpd.conf 或 apache2.conf。
Alias /foo/static/ /path/to/static
ScriptAlias /foo/ /path/to/code.py
.. 使用 CGI .htaccess
CGI很容易配置, 但不適合高性能網站。 添加以下到你的 .htaccess:
Options +ExecCGI
AddHandler cgi-script .py
將你的瀏覽器指向 http://example.com/code.py/。 不要忘記最後的斜杠,否則你將會看到 not found 消息 (因為在 urls 列表中你輸入的沒有被匹配到). 為了讓其運行的時候不需要添加 code.py, 啟用mod_rewrite 法則 (查看如下)。
注意: web.py 的實現破壞了 cgitb 模塊,因為它截取了 stdout。 可以通過以下的方法來解決該問題:
import cgitb; cgitb.enable()
import sys
# ... import web etc here...
def cgidebugerror():
_wrappedstdout = sys.stdout
sys.stdout = web._oldstdout
cgitb.handler()
sys.stdout = _wrappedstdout
web.internalerror = cgidebugerror FastCGI很容易配置,運行方式如同mod_python。
添加以下到 .htaccess:
<Files code.py> SetHandler fastcgi-script
</Files>
不幸的是, 不像lighttpd, Apache不能夠暗示你的web.py腳本以FastCGI 伺服器的形式工作,因此你需要明確的告訴web.py。 添加以下到 code.py的 if __name__ == __main__: 行前:
web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
將你的瀏覽器指向 http://example.com/code.py/。 不要忘記最後的斜杠,否則你將會看到 not found 消息 (因為在 urls 列表中你輸入的沒有被匹配到). 為了讓其運行的時候不需要添加 code.py, 啟用mod_rewrite 法則 (查看如下)。
Walter 還有一些額外建議. https://www.mems-exchange.org/software/scgi/ 從 http://www.mems-exchange.org/software/files/mod_scgi/ 下載 mod_scgi 代碼 windows apache 用戶: 編輯 httpd.conf:
LoadMole scgi_mole Moles/mod_scgi.so
SCGIMount / 127.0.0.1:8080
重啟apache,並在命令行中如下方式啟動code.py:
python code.py 127.0.0.1:8080 scgi
打開你的瀏覽器,訪問127.0.0.1 It's ok!
.. 使用 mod_python
mod_python 運行方式如同FastCGI, 但不是那麼方便配置。
對於 Python 2.5 按照如下:
cd /usr/lib/python2.5/wsgiref
# or in windows: cd /python2.5/lib/wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser
對於 Python <2.5 按照如下:
cd /usr/lib/python2.4/site-packages
# or in windows: cd /python2.4/lib/site-packages
svn co svn://svn.eby-sarna.com/svnroot/wsgiref/wsgiref
cd wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser
重命名 code.py 為 codep.py 或別的名字, 添加:
app = web.application(urls, globals())
main = app.wsgifunc()
在 .htaccess 中, 添加:
AddHandler python-program .py
PythonHandler wsgiref.modpython_gateway::handler
PythonOption wsgi.application codep::main
你應該希望添加 RewriteRule 將 / 指向 /codep.py/
確保訪問 /codep.py/ 的時候有添加最後的 /。 否則,你將會看到一條錯誤信息,比如 A server error occurred. Please contact the administrator.
.. 使用 mod_wsgi
mod_wsgi 是一個新的Apache模塊 通常優於mod_python 用於架設WSGI應用,它非常容易配置。
在 code.py 的最後添加:
app = web.application(urls, globals(), autoreload=False)
application = app.wsgifunc()
mod_wsgi 提供 許多可行方法 來實現WSGI應用, 但一種簡單的方法是添加以下到 .htaccess:
<Files code.py>
SetHandler wsgi-script
Options ExecCGI FollowSymLinks
</Files>
如果在apache的 error.log 文件中出現 ImportError: No mole named web, 在導入web之前,你可能需要在code.py中嘗試設置絕對路徑:
import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
os.chdir(abspath)
import web
同時, 你可能需要查看 WSGI應用的常見問題的 Application Working Directory 部分。
最終應該可以訪問 http://example.com/code.py/。
mod_rewrite 法則,Apache
如果希望 web.py 能夠通過 'http://example.com' 訪問,代替使用 'http://example.com/code.py/', 添加以下法則到 .htaccess 文件:
<IfMole mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/icons
RewriteCond %{REQUEST_URI} !^/favicon.ico$
RewriteCond %{REQUEST_URI} !^(/.*)+code.py/
RewriteRule ^(.*)$ code.py/$1 [PT]
</IfMole>
如果 code.py 在子目錄 myapp/中, 調整 RewriteBase 為 RewriteBase /myapp/。 如果還有一些靜態文件如CSS文件和圖片文件, 復制這些並改成你需要的地址。
Ⅹ nginx django部署問題
runfcgi沒有安裝吧
推薦uwsgi或者gunicon方式部署。