在服務(wù)器運(yùn)行 WSGI 應(yīng)用

2018-02-24 15:39 更新

在服務(wù)器運(yùn)行 WSGI 應(yīng)用

這里有一些在服務(wù)器運(yùn)行 WSGI 應(yīng)用的方式。當(dāng)你正在開發(fā)一個(gè)應(yīng)用,你往往不想在一個(gè)成熟服務(wù)器上部署和運(yùn)行,取而代之的是一個(gè)輕量服務(wù)器。 Werkzeug 就內(nèi)置了這樣一個(gè)輕量的服務(wù)器。

在一個(gè)服務(wù)器上運(yùn)行 start-myproject.py 最簡單的方法如下示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from werkzeug.serving import run_simple
from myproject import make_app

app = make_app(...)
run_simple('localhost', 8080, app, use_reloader=True)

你可以添加一個(gè) extra_files 關(guān)鍵字參數(shù),一個(gè)你想要添加的文件(比如配置文件)列表。

serving.run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None)
用 wsgiref 帶可選參數(shù) reloader 運(yùn)行一個(gè)應(yīng)用,通過包裹 wsgiref 來改正多線程 WSGI的默認(rèn)的錯(cuò)誤報(bào)告,添加可選的多線程,支持 fork。

這個(gè)函數(shù)也有一個(gè)命令行接口:

python -m werkzeug.serving --help

0.5 新版功能: 通過添加 static_files 簡單支持靜態(tài)文件和 passthrough_errors。

0.6 新版功能: 支持添加 SSL。

0.8 新版功能: 添加支持從 certificate 自動(dòng)加載 SSL 上下文和私鑰。file and private key.

0.9 新版功能: 添加命令行接口。

參數(shù):
  • hostname – 應(yīng)用的服務(wù)器。例子: 'localhost'。
  • port – 服務(wù)器接口。 例子: 8080
  • application – 要執(zhí)行的 WSGI 應(yīng)用。
  • use_reloader – 當(dāng)模塊更改是否自動(dòng)重啟 python 進(jìn)程?
  • use_debugger – 是否開啟 werkzeug 調(diào)試?
  • use_evalex – 是否開啟異常診斷功能?
  • extra_files – 模塊可以加載的件列表。比如配置文件。
  • reloader_interval – 加載的時(shí)間間隔。
  • threaded – 每個(gè)請求是否被放在一個(gè)獨(dú)立線程?
  • processes – 請求處理線程的最大個(gè)數(shù)。
  • request_handler – 用于替換默認(rèn)的可選參數(shù)。你可以用一個(gè)不同的BaseHTTPRequestHandler子類替換它。
  • static_files – 一個(gè)靜態(tài)文件地址的字典。和 SharedDataMiddleware差不多。它實(shí)際上僅僅是在服務(wù)器運(yùn)行前用中間件包裹一個(gè)應(yīng)用。
  • passthrough_errors – 設(shè)為 True 關(guān)閉錯(cuò)誤捕獲。這意味著服務(wù)可能會(huì)因錯(cuò)誤而崩潰,但是對于調(diào)試鉤子很有用 (比如pdb)。
  • ssl_context – 連接的 SSL 上下文?;蛘咭粋€(gè) OpenSSL 上下文,從(cert_file, pkey_file) 得到的一個(gè)元組,服務(wù)是 'adhoc' 的則會(huì)自動(dòng)創(chuàng)建一個(gè),如果是 None 則會(huì)關(guān)閉 SSL(這是默認(rèn)的)。

serving.make_ssl_devcert(base_path, host=None, cn=None)
創(chuàng)建一個(gè) SSL 密鑰。用于代替 'adhoc' 密鑰將會(huì)在服務(wù)啟動(dòng)的時(shí)候創(chuàng)建一個(gè)新的證書。他接受一個(gè)存放密鑰、證書和主機(jī)或 CN 的路徑。如果主機(jī)擁有這個(gè)將會(huì)使用 CN *.host/CN=host。

更多信息請看 run_simple()。

0.9 新版功能.

展名為 .key 的文件被添加到密鑰。:param host: 主機(jī)的名字。這個(gè)用于替代 cn。:param cn: 使用 CN。

Information

開發(fā)服務(wù)器不是為了生產(chǎn)環(huán)境,它的出現(xiàn)是為了開發(fā)方便,在高負(fù)載情況下效率是很低的。生產(chǎn)環(huán)境部署一個(gè)應(yīng)用請看 Application Deployment 頁面。

虛擬主機(jī)

一些應(yīng)用有多個(gè)子域名,你需要模擬本地。幸運(yùn)的是 hosts file 文件可以給本機(jī)分配多個(gè)名字。

這允許你使用 yourapplication.local 和 api.yourapplication.local (或者其他)代替 localhost 訪問本機(jī)。

你可以從下面的地方找到 hosts 文件:

Windows %SystemRoot%\system32\drivers\etc\hosts
Linux / OS X /etc/hosts

你可以用你喜歡的文本編輯器打開 hosts 文件,在 localhost 后面加上:

127.0.0.1       localhost yourapplication.local api.yourapplication.local

保存之后你應(yīng)該就可以通過你添加的主機(jī)名字訪問開發(fā)服務(wù)器了。你可以使用URL Routing 系統(tǒng)調(diào)度”兩個(gè)”主機(jī)或自己解析 request.host 。

關(guān)閉服務(wù)

0.7 新版功能.

從 Werkzeug 0.7 版本開始,開發(fā)服務(wù)器允許在一個(gè)請求后關(guān)閉服務(wù)。目前要求你的Python版本在 2.6 以上,同時(shí)也只能在開發(fā)服務(wù)器啟用。通過在 WSGI 環(huán)境調(diào)用'erkzeug.server.shutdown' 來開啟 shutdown:

def shutdown_server(environ):
    if not 'werkzeug.server.shutdown' in environ:
        raise RuntimeError('Not running the development server')
    environ['werkzeug.server.shutdown']()

故障排除

在一些支持并配置 ipv6 的操作系統(tǒng),比如 Linux, OS X 10.4 或更高 和 Windows Vista一些瀏覽器有時(shí)候訪問本地服務(wù)器很慢,原因有可能是本機(jī)被設(shè)置為同時(shí)支持 ipv4 和ipv6 套接字,一些瀏覽器會(huì)首先嘗試 ipv6 協(xié)議。

而目前集成的服務(wù)器不能同時(shí)支持兩種協(xié)議。為了更好的可移植性,將會(huì)默認(rèn)支持 ipv4協(xié)議。

注意到解決這個(gè)問題有兩種方法。如果你不需要ipv6 支持,你可以移除 hosts file 文件中的下面一行:

::1             localhost

另外你也可以關(guān)閉瀏覽器的 ipv6 支持。比如,在火狐瀏覽器中你可以進(jìn)入about:config 關(guān)閉 network.dns.disableIPv6 。然后,在 werkzeug 0.6.1中不推薦這種做法。

從 Werkzeug 0.6.1 開始服務(wù)器將不再根據(jù)操作系統(tǒng)的配置來轉(zhuǎn)換協(xié)議。這意味著如果你的瀏覽器關(guān)閉 ipv6 支持,而你的操作系統(tǒng)更傾向于 ipv6,你將連接不上服務(wù)器。這種情況下,你可以移除本機(jī) hosts 文件的 ::1 或者明確的用一個(gè) ipv4 協(xié)議地址(127.0.0.1)綁定主機(jī)名。

SSL

0.6 新版功能.

內(nèi)置服務(wù)器支持測試目的的 SSL,如果提供一個(gè) SSL上下文,他將會(huì)被使用,這意味著服務(wù)器可以在 HTTP 或 HTTPS 模式下運(yùn)行,但不可同時(shí)在兩種模式下運(yùn)行。這個(gè)功能需要Python OpenSSL 庫。

快速開始

在werkzeug開發(fā)過程中使用 SSL 最簡單的方法就是通過 werkzeug 生成一個(gè) SSL 證書和私鑰存起來。對于證書你需要提供生成證書的服務(wù)器名或一個(gè) CN.

  1. 生成一個(gè) SSL 密鑰并存放在某個(gè)地方:

>>> from werkzeug.serving import make_ssl_devcert
>>> make_ssl_devcert('/path/to/the/key', host='localhost')
('/path/to/the/key.crt', '/path/to/the/key.key')
  1. 現(xiàn)在這個(gè)元組會(huì)當(dāng)作 ssl_context 傳入 run_simple() 方法:

run_simple(‘localhost', 4000, application,ssl_context=(‘/path/to/the/key.crt',
‘/path/to/the/key.key'))

現(xiàn)在當(dāng)你通過瀏覽器訪問 web 應(yīng)用的時(shí)候?qū)⑿枰?yàn)證證書。

手動(dòng)加載上下文

你也可以通過代碼創(chuàng)建一個(gè)上下文代替使用 ssl_context 元組。這個(gè)方法是更好控制的:

from OpenSSL import SSL
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file('ssl.key')
ctx.use_certificate_file('ssl.cert')
run_simple('localhost', 4000, application, ssl_context=ctx)

生成證書

使用 openssl 工具代替 make_ssl_devcert() 預(yù)先創(chuàng)建一個(gè)證書。這要求你的系統(tǒng)安裝 openssl 命令行工具:

$ openssl genrsa 1024 > ssl.key
$ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert

Adhoc 證書

開啟 SSL 最簡單的方法就是用 adhoc 模式運(yùn)行服務(wù)。在這個(gè)例子中 Werkzeug 將會(huì)為你創(chuàng)建一個(gè)證書:

run_simple('localhost', 4000, application,
           ssl_context='adhoc')

當(dāng)然這種方法也有缺點(diǎn),那就是每次重載服務(wù)你都需要驗(yàn)證證書。不推薦 Adhoc 證書因?yàn)楝F(xiàn)在的瀏覽器因?yàn)榘踩驅(qū)λ麄冎С植⒉缓谩?/p>

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)