Sanic 應用配置

veelion發表於2019-04-09

我們寫的web應用可能會很複雜,Sanic提供了簡潔的配置而不用寫實際程式碼。 不同環境或安裝的設定可能不同。

Sanic configuration 配置

應用配置基礎

Sanic 把配置儲存在應用物件的config屬性中,這個配置物件可以使用點號或類似字典那樣進行修改:

app = Sanic('myapp')
app.config.DB_NAME = 'appdb'
app.config.DB_USER = 'appuser'

其實,這個配置物件就是一個字典,可以是update方法一次性修改多個值:

db_settings = {
    'DB_HOST': 'localhost',
    'DB_NAME': 'appdb',
    'DB_USER': 'appuser'
}
app.config.update(db_settings)

通常的約定是隻有UPPERCASE配置引數。 下面描述的用於載入配置的方法僅查詢這樣的大寫引數。

載入配置

Sanic 提供了幾種不同的載入配置的方法。

1.從環境變數載入

任何以 SANIC_ 開頭定義的環境變數都會被應用到 Sanic 的配置中。比如,設定環境變數 SANIC_REQUEST_TIMEOUT,它就會被應用字典載入並儲存為配置變數 REQUEST_TIMEOUT

當然,你可以傳遞一個不同的字首給Sanic 應用:

app = Sanic(load_env='YRX_')

那麼,上面的變數就要定義為 YRX_REQUEST_TIMEOUT

同樣,我們也可以禁止載入環境變數,只需設定 load_envFalse即可:

app = Sanic(load_env=False)

2.從物件載入

如果有很多配置值並且它們具有合理的預設值,那麼將它們放入模組可能會有所幫助:

import myapp.default_settings

app = Sanic('myapp')
app.config.from_object(myapp.default_settings)

也可以使用類(class)或其它物件來載入配置。

3.從檔案載入

通常,我們希望從檔案載入配置,而不是把它寫到釋出的應用程式中。這個需求可以通過 from_pyfile(/path/to/config_file) 來實現。但是,這需求程式知道配置檔案的路徑。但我們可以把配置檔案路徑定義為環境變數,並告訴 Sanic 應用使用它來找到配置檔案:

app = Sanic('myapp')
app.config.from_envvar('MYAPP_SETTINGS')

然後,我們先定義環境變數 MYAPP_SETTINGS 在執行應用程式:

$ MYAPP_SETTINGS=/path/to/config_file python3 myapp.py
INFO: Goin' Fast @ http://0.0.0.0:8000

配置檔案是常規Python檔案,為了載入它們而執行。 這允許我們使用任意邏輯來構造正確的配置。 只有大寫變數才會新增到配置中。 最常見的配置包括簡單的鍵值對:

# config_file
DB_HOST = 'localhost'
DB_NAME = 'appdb'
DB_USER = 'appuser'

內建的配置值

Sanic 只預先定義了少數幾個配置值,它們可以在建立應用時被覆蓋。

Variable Default Description
REQUEST_MAX_SIZE 100000000 請求資料的最大值 (bytes)
REQUEST_BUFFER_QUEUE_SIZE 100 流快取佇列的大小
REQUEST_TIMEOUT 60 請求超時時間 (sec)
RESPONSE_TIMEOUT 60 響應超時時間 (sec)
KEEP_ALIVE True 是否保持長連結
KEEP_ALIVE_TIMEOUT 5 保持TCP連結的時間 (sec)
GRACEFUL_SHUTDOWN_TIMEOUT 15.0 等待強制關閉非空閒連結的時間 (sec)
ACCESS_LOG True 是否啟用訪問日誌

不同超時變數的差異

REQUEST_TIMEOUT

請求超時測量的是,從新開啟的TCP連線傳遞到Sanic後端伺服器的時刻,到收到整個HTTP請求的時刻之間的持續時間。 如果所花費的時間超過REQUEST_TIMEOUT值(以秒為單位),則將其視為客戶端錯誤,以便Sanic生成HTTP 408響應並將其傳送到客戶端。 如果客戶端通常會非常緩慢地傳遞非常大的請求負載或上傳請求,請將此引數的值設定得更高。

RESPONSE_TIMEOUT

響應超時測量的是,Sanic伺服器將HTTP請求傳遞給Sanic App的瞬間與HTTP響應傳送到客戶端的時間之間的持續時間。 如果所花費的時間超過RESPONSE_TIMEOUT值(以秒為單位),則將其視為伺服器錯誤,以便Sanic生成HTTP 503響應並將其傳送到客戶端。 如果我們的應用程式可能具有延遲生成響應的長時間執行程式,請將此引數的值設定得更高。

KEEP_ALIVE_TIMEOUT

Keep-Alive 是HTTP 1.1中引入的HTTP功能。傳送HTTP請求時,客戶端(通常是Web瀏覽器應用程式)可以設定 Keep-Alive 頭,以指示http伺服器(Sanic)在傳送響應後不關閉TCP連線。這允許客戶端重用現有的TCP連線來傳送後續HTTP請求,並確保客戶端和伺服器的網路流量更高效。

KEEP_ALIVE 配置變數在Sanic中預設設定為True。 如果我們的應用程式中不需要此功能,請將其設定為False以使所有客戶端連線在傳送響應後立即關閉,而忽略請求中的 Keep-Alive 頭。

伺服器保持TCP連線開啟的時間由伺服器本身決定。 在Sanic中,使用 KEEP_ALIVE_TIMEOUT 值配置該值。 預設情況下,它設定為5秒。這與Apache HTTP伺服器的預設設定相同,並且在允許客戶端有足夠的時間傳送新請求和不同時保持開啟太多連線之間取得了良好的平衡。 除非我們知道我們的客戶端正在使用支援長時間保持開啟的TCP連線的瀏覽器,否則不要超過75秒。

下面是其它 http 伺服器的相關預設值以供參考:

Apache httpd server default keepalive timeout = 5 seconds
Nginx server default keepalive timeout = 75 seconds
Nginx performance tuning guidelines uses keepalive = 15 seconds
IE (5-9) client hard keepalive limit = 60 seconds
Firefox client hard keepalive limit = 115 seconds
Opera 11 client hard keepalive limit = 120 seconds
Chrome 13+ client keepalive limit > 300+ seconds

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章