最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

005. 重讀 Hypercorn 文檔,進一步提升服務(wù)器性能

2023-01-08 21:29 作者:姚千山  | 我要投稿

在之前的一篇文章(Flask + Hypercorn 搭建 HTTP2 服務(wù)器)中,我們實現(xiàn)了一個基于 Flask 和?Hypercorn 的簡單服務(wù)器的搭建,并實現(xiàn)了 HTTP2 協(xié)議。但這樣的一個服務(wù)器顯然不能滿足一個現(xiàn)代(2023年)高性能服務(wù)器的需求,需要使用更多的新技術(shù)來進一步提升服務(wù)器性能與質(zhì)量。

今天,重讀?Hypercorn 文檔,溫故而知新,在上一次的基礎(chǔ)上取得了一些突破。

啟用 ASGI

WSGI (Web Server Gateway Interface) 和 ASGI (Asynchronous Server Gateway Interface) 都是用于構(gòu)建 Web 應(yīng)用的服務(wù)器中間件標準。

WSGI 是一種單調(diào)用、同步接口。當應(yīng)用處理請求時,服務(wù)器不能處理其他請求,這會導(dǎo)致阻塞。

ASGI 是一種異步的接口,它使用事件循環(huán)來處理請求。當應(yīng)用處理請求時,服務(wù)器可以同時處理多個請求,這可以避免阻塞。

因此,ASGI 比 WSGI 具有更高的性能,可以在高流量環(huán)境下更好地工作。同時,ASGI 還支持一些 WSGI 不支持的功能,例如 WebSocket 和異步 I/O。

顯然,使用 ASGI 可以獲得更高的性能和更多的功能,因此應(yīng)盡可能地使用 ASGI。

在 2.0 以上版本的 Flask 里已經(jīng)支持使用 ASGI 服務(wù)器。但由于?Flask 是一個 WSGI 應(yīng)用框架,所以如果你想使用 ASGI 服務(wù)器,就需要使用一個能將 WSGI 轉(zhuǎn)換為 ASGI 的中間件。在 Flask 官方文檔中,推薦使用 asgiref 提供的 WsgiToAsgi 適配器(adapter)來實現(xiàn)這一點。

然后你就可以使用 ASGI 服務(wù)器為?asgi_app?提供服務(wù)。例如使用?Hypercorn?:

HTTP 重定向

在上一次搭建的服務(wù)器中,未綁定(bind)80 端口,無法使用 HTTP 訪問服務(wù)器。當輸入域名或 IP 地址時,由于瀏覽器默認使用 HTTP 訪問網(wǎng)站,就無法獲取網(wǎng)站內(nèi)容。因此,啟用 HTTP ,并強制將 HTTP 請求重定向為 HTTPS 請求,是一個十分必要的功能。

首先,我們需要在 Hypercorn 的配置中啟用 80 端口:

?注意,在啟用 HTTP2 時,bind 綁定的是 HTTPS 請求,而 HTTP 請求需要使用“不安全綁定”(insecure_bind)。

此時還不能實現(xiàn)??HTTP 請求重定向到 HTTPS,需要使用?Hypercorn 中間件(middleware)模塊中的 HTTPToHTTPSRedirectMiddleware

這樣,當我們訪問?http://127.0.0.1 時,就能自動重定向到?https://127.0.0.1 了。

?HTTP 請求重定向到 HTTPS

注意,使用這一中間件的前提是 Flask 啟用了 ASGI ,這在其源代碼中可以清晰看到。傳入的 app 必須是 ASGIFramework,否則會引發(fā)未知錯誤(實測):

日志

Hypercorn 有兩個日志記錄器(logger),一個記錄訪問日志(accesslog),另一個記錄錯誤日志(errorlog)。在默認情況下僅啟用了錯誤日志。當配置項中的 accesslog 與 errorlog 的值為 '-' 時,日志將被輸出到標準輸出(stdout 和 stderr)中, 任何其他值都將被視為目標日志文件的路徑。

在實際的服務(wù)器中,我們往往是將日志記錄到專門日志文件:

另外,也可配置 Web 服務(wù)器訪問日志的格式。

默認情況下,Hypercorn 會選擇 %(h)s %(l)s %(l)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s?作為格式。這個格式由一些原子(atoms)組成,每個原子代表一個信息字段,如 請求的方法、URL、來源 IP 地址、用戶代理信息、狀態(tài)碼和響應(yīng)時間等。

可以使用配置變量 access_log_format 來指定日志格式:

配置

在 Hypercorn 中,除了之前使用到的通過實例化 Config 類來配置以外,還有其他幾種方式。

1.通過 TOML 文件

2.通過?Python?模塊

Python 模塊或 Python 模塊中的實例可用于配置 Hypercorn 。

3.通過?Python?文件

在實際情況中,最常用的方法是從配置文件中加載配置項:

另外,Hypercorn 中還有一些比較有用的配置項,值得引起注意。

1.include_server_header

Server 響應(yīng)頭是一個標準的 HTTP 響應(yīng)頭,用于指示服務(wù)器軟件的名稱和版本。

如果服務(wù)器響應(yīng)頭包含了 Server 字段,則惡意用戶可能會利用這些信息來尋找漏洞進行攻擊。例如,如果服務(wù)器使用的是某個版本的軟件,并且有知名的漏洞存在,那么惡意用戶可能會嘗試利用該漏洞進行攻擊。

因此,為了避免這種情況,應(yīng)該盡量避免在響應(yīng)頭中包含 Server 字段,或者將 Server 字段設(shè)置為不敏感的值。

在 Hypercorn 中,提供了刪除 Server?字段的功能,僅需將?include_server_header 配置為 False 即可。

2.use_reloader

use_reloader 是一個 Hypercorn 配置選項,它控制是否在代碼更改時重新加載服務(wù)器。

當 use_reloader 設(shè)置為 True 時,Hypercorn 會監(jiān)視你的代碼,如果有更改,則會自動重新加載服務(wù)器。這對于開發(fā)和調(diào)試非常方便,因為你可以在保存代碼時立即看到更改的效果。

當 use_reloader 設(shè)置為 False 時,Hypercorn 不會自動重新加載服務(wù)器。這可以避免不必要的資源浪費,提高生產(chǎn)環(huán)境的性能。

總的來說,use_reloader 配置是一個方便的功能,可以幫助你在開發(fā)和調(diào)試時更快速地看到代碼更改的效果。在生產(chǎn)環(huán)境中,你可以設(shè)置為 False 以提高性能。

3.wsgi_max_body_size

在 WSGI 模式下,可以使用這一配置來改變服務(wù)器可接受的最大請求體大小,默認大小是 16 MB(16 * 1024 * 1024 * BYTES)。

當然,在 ASGI 模式下,這一配置不起作用。

延伸閱讀

  1. ASGI — Flask Documentation (2.2.x):https://flask.palletsprojects.com/en/2.2.x/deploying/asgi/

  2. 2020你的工具箱里該出現(xiàn)ASGI了——ASGI介紹:https://zhuanlan.zhihu.com/p/102325052

  3. Configuring — Hypercorn 0.14.3+dev documentation:https://hypercorn.readthedocs.io/en/latest/how_to_guides/configuring.html

  4. HTTP to HTTPS Redirects — Hypercorn 0.14.3+dev documentation:https://hypercorn.readthedocs.io/en/latest/how_to_guides/http_https_redirect.html

  5. Logging — Hypercorn 0.14.3+dev documentation:https://hypercorn.readthedocs.io/en/latest/how_to_guides/logging.html






005. 重讀 Hypercorn 文檔,進一步提升服務(wù)器性能的評論 (共 條)

分享到微博請遵守國家法律
大荔县| 琼海市| 如皋市| 玉门市| 美姑县| 镇沅| 绥滨县| 德清县| 神农架林区| 新宁县| 彩票| 永靖县| 静海县| 金乡县| 香格里拉县| 泰州市| 上林县| 九寨沟县| 四会市| 华宁县| 洛扎县| 潞西市| 临沧市| 梁平县| 乐昌市| 桂东县| 博爱县| 全州县| 神农架林区| 乌兰浩特市| 双鸭山市| 长春市| 鸡泽县| 贵德县| 城固县| 宝鸡市| 安化县| 永修县| 东光县| 江川县| 彭山县|