Flask 應(yīng)用可以采用多種方式部署。在開(kāi)發(fā)時(shí),你可以使用內(nèi)置的服務(wù)器,但是在生產(chǎn)環(huán)境 下你就應(yīng)當(dāng)選擇功能完整的服務(wù)器。下面為你提供幾個(gè)可用的選擇。
除了下面提到的服務(wù)器之外,如果你使用了其他的 WSGI 服務(wù)器,那么請(qǐng)閱讀其文檔中與使用 WSGI 應(yīng)用相關(guān)的部分。因?yàn)?Flask 應(yīng)用對(duì)象的實(shí)質(zhì)就是一個(gè) WSGI 應(yīng)用。
如果需要快速體驗(yàn),請(qǐng)參閱《快速上手》中的部署到一個(gè)網(wǎng)絡(luò)服務(wù)器 。
如果你正在使用 Apache 網(wǎng)絡(luò)服務(wù)器,那么建議使用 mod_wsgi 。
請(qǐng)務(wù)必把 app.run() 放在 if name == 'main': 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 mod_wsgi 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。
可以使用包管理器或編譯的方式安裝 mod_wsgi 。在 UNIX 系統(tǒng)中如何使用源代碼安裝請(qǐng)閱讀 mod_wsgi 安裝介紹 。
如果你使用的是 Ubuntu/Debian ,那么可以使用如下命令安裝:
# apt-get install libapache2-mod-wsgi
在 FreeBSD 系統(tǒng)中,可以通過(guò)編譯 www/mod_wsgi port 或使用 pkg_add 來(lái)安裝 mod_wsgi :
# pkg_add -r mod_wsgi
如果你使用 pkgsrc ,那么可以通過(guò)編譯 www/ap2-wsgi 包來(lái)安裝 mod_wsgi 。
如果你遇到子進(jìn)程段錯(cuò)誤的話,不要理它,重啟服務(wù)器就可以了。
為了運(yùn)行應(yīng)用,你需要一個(gè) yourapplication.wsgi 文件。這個(gè)文件包含 mod_wsgi 開(kāi)始時(shí)需要運(yùn)行的代碼,通過(guò)代碼可以獲得應(yīng)用對(duì)象。文件中的 application 對(duì)象就是以后要使用的應(yīng)用。
對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō),文件包含以下內(nèi)容就可以了:
from yourapplication import app as application
如果你的應(yīng)用沒(méi)有創(chuàng)建函數(shù),只是一個(gè)獨(dú)立的實(shí)例,那么可以直接把實(shí)例導(dǎo)入為 application 。
把文件放在一個(gè)以后可以找得到的地方(例如 /var/www/yourapplication ),并確保 yourapplication 和所有需要使用的庫(kù)都位于 pythonpath 中。如果你不想在整個(gè)系統(tǒng)中安裝,建議使用 virtual python 實(shí)例。請(qǐng)記住,最好把應(yīng)用安裝到虛擬環(huán)境中。 有一個(gè)可選項(xiàng)是在 .wsgi 文件中,在導(dǎo)入前加入路徑:
import sys
sys.path.insert(0, '/path/to/the/application')
最后一件事是為你的應(yīng)用創(chuàng)建一個(gè) Apache 配置文件?;诎踩?,在下例中我們告訴 mod_wsgi 使用另外一個(gè)用戶運(yùn)行應(yīng)用:
<VirtualHost *>
ServerName example.com
WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi
<Directory /var/www/yourapplication>
WSGIProcessGroup yourapplication
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
注意: WSGIDaemonProcess 在 Windows 中不會(huì)被執(zhí)行, 使用上面的配置 Apache 會(huì)拒絕運(yùn)行。在 Windows 系統(tǒng)下,請(qǐng)使用下面內(nèi)容:
<VirtualHost *>
ServerName example.com
WSGIScriptAlias / C:\yourdir\yourapp.wsgi
<Directory C:\yourdir>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
更多信息參見(jiàn) mod_wsgi 維基 。
如果你的應(yīng)用無(wú)法運(yùn)行,請(qǐng)按以下指導(dǎo)排除故障:
問(wèn)題: 應(yīng)用無(wú)法運(yùn)行,出錯(cuò)記錄顯示 SystemExit ignored
應(yīng)用文件中有 app.run() 調(diào)用,但沒(méi)有放在 if __name__ == '__main__’: 塊內(nèi)。要么把這個(gè)調(diào)用放入塊內(nèi),要么把它放在一個(gè)單獨(dú)的 run.py 文件中。
問(wèn)題: 權(quán)限錯(cuò)誤 有可以是因?yàn)槭褂昧隋e(cuò)誤的用戶運(yùn)行應(yīng)用。請(qǐng)檢查用戶及其所在的組 ( WSGIDaemonProcess 的 user 和 group 參數(shù))是否有權(quán)限訪問(wèn)應(yīng)用 文件夾。
問(wèn)題: 打印時(shí)應(yīng)用歇菜 請(qǐng)記住 mod_wsgi 不允許使用 sys.stdout 和 sys.stderr 。把 WSGIRestrictStdout 設(shè)置為 off 可以去掉這個(gè)保護(hù):
WSGIRestrictStdout Off
或者你可以在 .wsgi 文件中把標(biāo)準(zhǔn)輸出替換為其他的流:
import sys
sys.stdout = sys.stderr
問(wèn)題: 訪問(wèn)資源時(shí)遇到 IO 錯(cuò)誤
你的應(yīng)用可能是一個(gè)獨(dú)立的 .py 文件,且你把它符號(hào)連接到了 site-packages 文件夾。這樣是不對(duì)的,你應(yīng)當(dāng)要么把文件夾放到 pythonpath 中,要么把你的應(yīng)用轉(zhuǎn)換為一個(gè)包。
產(chǎn)生這種錯(cuò)誤的原因是對(duì)于非安裝包來(lái)說(shuō),模塊的文件名用于定位資源,如果使用符號(hào)連接的話就會(huì)定位到錯(cuò)誤的文件名。
為了輔助部署工具,你可以激活自動(dòng)重載。這樣,一旦 .wsgi 文件有所變動(dòng), mod_wsgi 就會(huì)自動(dòng)重新轉(zhuǎn)入所有守護(hù)進(jìn)程。
在 Directory 一節(jié)中加入以下指令就可以實(shí)現(xiàn)自動(dòng)重載:
WSGIScriptReloading On
使用虛擬環(huán)境的優(yōu)點(diǎn)是不必全局安裝應(yīng)用所需要的依賴,這樣我們就可以更好地按照自己的需要進(jìn)行控制。如果要在虛擬環(huán)境下使用 mod_wsgi ,那么我們要對(duì) .wsgi 略作改變。
在你的 .wsgi 文件頂部加入下列內(nèi)容:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
以上代碼會(huì)根據(jù)虛擬環(huán)境的設(shè)置載入相關(guān)路徑。請(qǐng)記住路徑必須是絕對(duì)路徑。
有一些用 Python 寫的流行服務(wù)器可以容納 WSGI 應(yīng)用,提供 HTTP 服務(wù)。這些服務(wù)器是 獨(dú)立運(yùn)行的,你可以把代理從你的網(wǎng)絡(luò)服務(wù)器指向它們。如果遇到問(wèn)題,請(qǐng)閱讀代理設(shè)置一節(jié)。
Gunicorn ‘Green Unicorn’ 是一個(gè) UNIX 下的 WSGI HTTP 服務(wù)器,它是一個(gè)移植自 Ruby 的 Unicorn 項(xiàng)目的 pre-fork worker 模型。它既支持 eventlet , 也支持 greenlet 。在 Gunicorn 上運(yùn)行 Flask 應(yīng)用非常簡(jiǎn)單:
gunicorn myproject:app
Gunicorn 提供許多命令行參數(shù),可以使用 gunicorn -h 來(lái)獲得幫助。下面的例子使用 4 worker 進(jìn)程( -w 4 )來(lái)運(yùn)行 Flask 應(yīng)用,綁定到 localhost 的 4000 端口( -b 127.0.0.1:4000 ):
gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
Tornado 是構(gòu)建 FriendFeed 的服務(wù)器和工具的開(kāi)源版本,具有良好的伸縮性,非阻塞性。得益于其非阻塞的方式和對(duì) epoll 的運(yùn)用,它可以同步處理數(shù)以千計(jì)的獨(dú)立 連接,因此 Tornado 是實(shí)時(shí) Web 服務(wù)的一個(gè)理想框架。用它來(lái)服務(wù) Flask 是小事一樁:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from toranado.ioloop import IOLoop
from yourapplication import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
Gevent 是一個(gè) Python 并發(fā)網(wǎng)絡(luò)庫(kù),它使用了基于 libevent 事件循環(huán)的 greenlet 來(lái)提供一個(gè)高級(jí)同步 API:
from gevent.wsgi import WSGIServer
from yourapplication import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
Twisted Web 是一個(gè) Twisted 自帶的網(wǎng)絡(luò)服務(wù)器,是一個(gè)成熟的、異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)庫(kù)。 Twisted Web 帶有一個(gè)標(biāo)準(zhǔn)的 WSGI 容器,該容器可以使用 twistd 工具運(yùn)行命令行來(lái)控制:
twistd web --wsgi myproject.app
這個(gè)命令會(huì)運(yùn)行一個(gè)名為 app 的 Flask 應(yīng)用,其模塊名為 myproject 。
與 twistd 工具一樣, Twisted Web 支持許多標(biāo)記和選項(xiàng)。更多信息參見(jiàn) twistd -h 和 twistd web -h 。例如下面命令在前臺(tái)運(yùn)行一個(gè)來(lái)自 myproject 的應(yīng)用, 端口為 8080:
twistd -n web --port 8080 --wsgi myproject.app
如果你要在一個(gè) HTTP 代理后面在上述服務(wù)器上運(yùn)行應(yīng)用,那么必須重寫一些頭部才行。 通常在 WSGI 環(huán)境中經(jīng)常會(huì)出現(xiàn)問(wèn)題的有兩個(gè)變量: REMOTE_ADDR 和 HTTP_HOST 。 你可以通過(guò)設(shè)置你的 httpd 來(lái)傳遞這些頭部,或者在中間件中修正這些問(wèn)題。 Werkzeug 帶有一個(gè)修復(fù)工具可以用于常用的設(shè)置,但是你可能需要為特定的設(shè)置編寫你自己的 WSGI 中間件。
下面是一個(gè)簡(jiǎn)單的 nginx 配置,代理目標(biāo)是 localhost 8000 端口提供的服務(wù),設(shè)置了適當(dāng)?shù)念^部:
server {
listen 80;
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
如果你的 httpd 無(wú)法提供這些頭部,那么最常用的設(shè)置是調(diào)用 X-Forwarded-Host 定義的主機(jī)和 X-Forwarded-For 定義的遠(yuǎn)程地址:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
請(qǐng)注意,在非代理情況下使用這個(gè)中間件是有安全問(wèn)題的,因?yàn)樗鼤?huì)盲目信任惡意客戶端發(fā)來(lái)的頭部。
如果你要根據(jù)另一個(gè)頭部來(lái)重寫一個(gè)頭部,那么可以像下例一樣使用修復(fù)工具:
class CustomProxyFix(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
host = environ.get('HTTP_X_FHOST', '')
if host:
environ['HTTP_HOST'] = host
return self.app(environ, start_response)
app.wsgi_app = Cus
tomProxyFix(app.wsgi_app)
uWSGI 也是部署 Flask 的途徑之一,類似的部署途徑還有 nginx 、 lighttpd 和 cherokee 。其他部署途徑的信息參見(jiàn) FastCGI 和 獨(dú)立 WSGI 容器 。使用 uWSGI 協(xié)議來(lái)部署 WSGI 應(yīng)用的先決條件是需要一個(gè) uWSGI 服務(wù)器。 uWSGI 既是一個(gè)協(xié)議也是一個(gè)服務(wù)器。如果作為一個(gè)服務(wù)器, 它可以服務(wù)于 uWSGI 、 FastCGI 和 HTTP 協(xié)議。
最流行的 uWSGI 服務(wù)器是 uwsgi ,本文將使用它來(lái)舉例,請(qǐng)先安裝它。
請(qǐng)務(wù)必把 app.run() 放在 if __name__ == '__main__':內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 uWSGI 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。
uwsgi 是基于 python 模塊中的 WSGI 調(diào)用的。假設(shè) Flask 應(yīng)用名稱為 myapp.py , 可以使用以下命令:
$ uwsgi -s /tmp/uwsgi.sock --module myapp --callable app
或者這個(gè)命令也行:
$ uwsgi -s /tmp/uwsgi.sock -w myapp:app
一個(gè) nginx 的基本 uWSGI 配置如下:
location = /yourapplication { rewrite ^ /yourapplication/; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /yourapplication;
uwsgi_modifier1 30;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
這個(gè)配置把應(yīng)用綁定到 /yourapplication 。如果你想要在根 URL 下運(yùn)行應(yīng)用非常簡(jiǎn)單,因?yàn)槟悴槐刂赋?WSGI PATH_INFO 或讓 uwsgi 修改器來(lái)使用它:
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
FastCGI 是部署 Flask 的途徑之一,類似的部署途徑還有 nginx 、 lighttpd 和 cherokee 。其他部署途徑的信息參見(jiàn) uWSGI 和獨(dú)立 WSGI 容器 。本文講述的是使用 FastCGI 部署,因此先決條件是要有一個(gè) FastCGI 服務(wù)器。 flup 最流行的 FastCGI 服務(wù)器之一,我們將會(huì)在本文中使用它。在閱讀下文之前先安裝好 flup 。
請(qǐng)務(wù)必把 app.run() 放在 if name == 'main': 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 FastCGI 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。
首先你必須創(chuàng)建 FastCGI 服務(wù)器配置文件,我們把它命名為 yourapplication.fcgi:
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()
如果使用的是 Apache ,那么使用了這個(gè)文件之后就可以正常工作了。但是如果使用的是 nginx 或老版本的 lighttpd ,那么需要顯式地把接口傳遞給 FastCGI 服務(wù)器,即把接口的路徑傳遞給 WSGIServer:
WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
這個(gè)路徑必須與服務(wù)器配置中定義的路徑一致。
把這個(gè) yourapplication.fcgi 文件放在一個(gè)以后可以找得到的地方,最好是 /var/www/yourapplication 或類似的地方。
為了讓服務(wù)器可以執(zhí)行這個(gè)文件,請(qǐng)給文件加上執(zhí)行位,確保這個(gè)文件可以執(zhí)行:
# chmod +x /var/www/yourapplication/yourapplication.fcgi
上面的例子對(duì)于基本的 Apache 部署已經(jīng)夠用了,但是你的 .fcgi 文件會(huì)暴露在應(yīng)用的 URL 中,比如 example.com/yourapplication.fcgi/news/ 。有多種方法可以避免出現(xiàn)這中情況。一個(gè)較好的方法是使用 ScriptAlias 配置指令:
<VirtualHost *>
ServerName example.com
ScriptAlias / /path/to/yourapplication.fcgi/
</VirtualHost>
如果你無(wú)法設(shè)置 ScriptAlias ,比如你使用的是一個(gè)共享的網(wǎng)絡(luò)主機(jī),那么你可以使用 WSGI 中間件把 yourapplication.fcgi 從 URL 中刪除。你可以這樣設(shè)置 .htaccess:
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
<Files ~ (\.fcgi)>
SetHandler fcgid-script
Options +FollowSymLinks +ExecCGI
</Files>
</IfModule>
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ yourapplication.fcgi/$1 [QSA,L]
</IfModule>
設(shè)置 yourapplication.fcgi:
#!/usr/bin/python
#: optional path to your local python site-packages folder
import sys
sys.path.insert(0, '<your_local_path>/lib/python2.6/site-packages')
from flup.server.fcgi import WSGIServer
from yourapplication import app
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
if __name__ == '__main__':
WSGIServer(app).run()
一個(gè) lighttpd 的基本 FastCGI 配置如下:
fastcgi.server = ("/yourapplication.fcgi" =>
((
"socket" => "/tmp/yourapplication-fcgi.sock",
"bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
"check-local" => "disable",
"max-procs" => 1
))
)
alias.url = (
"/static/" => "/path/to/your/static"
)
url.rewrite-once = (
"^(/static($|/.*))$" => "$1",
"^(/.*)$" => "/yourapplication.fcgi$1"
請(qǐng)記住啟用 FastCGI 、 alias 和 rewrite 模塊。以上配置把應(yīng)用綁定到 /yourapplication 。如果你想要讓應(yīng)用在根 URL 下運(yùn)行,那么必須使用 LighttpdCGIRootFix 中間件來(lái)解決一個(gè) lighttpd 缺陷。
請(qǐng)確保只有應(yīng)用在根 URL 下運(yùn)行時(shí)才使用上述中間件。更多信息請(qǐng)閱讀 FastCGI 和 Python (注意,已經(jīng)不再需要把一個(gè)接口顯式傳遞給 run() 了)。
在 Nginx 上安裝 FastCGI 應(yīng)用有一些特殊,因?yàn)槿笔∏闆r下不傳遞 FastCGI 參數(shù)。
一個(gè) Nginx 的基本 FastCGI 配置如下:
location = /yourapplication { rewrite ^ /yourapplication/ last; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_split_path_info ^(/yourapplication)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
這個(gè)配置把應(yīng)用綁定到 /yourapplication 。如果你想要在根 URL 下運(yùn)行應(yīng)用非常簡(jiǎn)單,因?yàn)槟悴槐刂赋鋈绾斡?jì)算出 PATH_INFO 和 SCRIPT_NAME:
location / { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME "";
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
Nginx 和其他服務(wù)器不會(huì)載入 FastCGI 應(yīng)用,你必須自己載入。 Supervisor 可以管理 FastCGI 進(jìn)程。 在啟動(dòng)時(shí)你可以使用其他 FastCGI 進(jìn)程管理器或?qū)懸粋€(gè)腳本來(lái)運(yùn)行 .fcgi 文件,例如使用一個(gè) SysV init.d 腳本。如果是臨時(shí)使用,你可以在一個(gè) GNU screen 中運(yùn)行 .fcgi 腳本。運(yùn)行細(xì)節(jié)參見(jiàn) man screen ,同時(shí)請(qǐng)注意這是一個(gè)手動(dòng)啟動(dòng)方法, 不會(huì)在系統(tǒng)重啟時(shí)自動(dòng)啟動(dòng):
$ screen
$ /var/www/yourapplication/yourapplication.fcgi
在大多數(shù)服務(wù)器上, FastCGI 部署難以調(diào)試。通常服務(wù)器日志只會(huì)告訴你類似 “ premature end of headers ”的內(nèi)容。為了調(diào)試應(yīng)用,查找出錯(cuò)的原因,你必須切換到正確的用戶并手動(dòng)執(zhí)行應(yīng)用。
下例假設(shè)你的應(yīng)用是 application.fcgi ,且你的網(wǎng)絡(luò)服務(wù)用戶為 www-data:
$ su www-data
$ cd /var/www/yourapplication
$ python application.fcgi
Traceback (most recent call last):
File "yourapplication.fcgi", line 4, in <module>
ImportError: No module named yourapplication
上面的出錯(cuò)信息表示 “yourapplication” 不在 python 路徑中。原因可能有:
如果其他的部署方式都不管用,那么就只能使用 CGI 了。 CGI 適應(yīng)于所有主流服務(wù)器, 但是其性能稍弱。
這也是在 Google 的 App Engine 使用 Flask 應(yīng)用的方法,其執(zhí)行方式類似于 CGI 環(huán)境。
請(qǐng)務(wù)必把 app.run() 放在 if __name__ == '__main__’: 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 CGI 或 App Engine 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。
在使用 CGI 時(shí),你還必須確保代碼中不包含任何 print 語(yǔ)句,或者 sys.stdout 被重載,不會(huì)寫入 HTTP 響應(yīng)中。
首先,你需要?jiǎng)?chuàng)建 CGI 應(yīng)用文件。我們把它命名為 yourapplication.cgi:
#!/usr/bin/python
from wsgiref.handlers import CGIHandler
from yourapplication import app
CGIHandler().run(app)
設(shè)置服務(wù)器通常有兩種方法。一種是把 .cgi 復(fù)制為 cgi-bin (并且使用 mod_rewrite 或其他類似東西來(lái)改寫 URL );另一種是把服務(wù)器直接指向文件。
例如,如果使用 Apache ,那么可以把如下內(nèi)容放入配置中:
ScriptAlias /app /path/to/the/application.cgi
在共享的網(wǎng)絡(luò)服務(wù)器上,你可能無(wú)法變動(dòng) Apache 配置。在這種情況下,你可以使用你的公共目錄中的 .htaccess 文件。但是 ScriptAlias 指令會(huì)失效:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f # Don't interfere with static files
RewriteRule ^(.*)$ /path/to/the/application.cgi/$1 [L]
更多信息參見(jiàn)你所使用的服務(wù)器的文檔。
? Copyright 2013, Armin Ronacher. Created using Sphinx.