本文主要介紹在Windows Server 2012R2上通過IIS部署Flask專案的過程,以及對TTFB延遲大問題的思考。關於如何申請雲伺服器,註冊(子)域名,備案,開放雲伺服器埠,獲取SSL證書等不做介紹,感興趣可以參考通過二級域名解決1臺雲伺服器搭建多個公眾號後端服務的問題。
作業系統的版本是Windows Server 2012R2,IIS版本為8.5.9600.16384:
通過伺服器管理器新增角色和功能,主要是安裝CGI、ISAPI擴充套件、ISAPI篩選器:
這裡的Flask專案特指通過Flask框架封裝的REST API後端介面的單個檔案。
安裝、啟用和禁用wfastcgi
命令如下所示:
pip install wfastcgi #安裝
wfastcgi-enable #啟用
wfastcgi-disable #禁用
通過命令wfastcgi-enable
啟用後輸出結果如下:
新增和編輯網站如下所示:
新增和編輯網站繫結如下所示:
首先選中要設定的Flask專案,然後點選處理程式對映,新增模組對映:
(1)請求路徑:*
(2)模組:FastCgiModule
(3)可執行檔案:執行命令wfastcgi-enable
的輸出
(4)名稱:自定義填寫
說明:填寫完畢後,在彈出的對話方塊中選擇是。
取消"僅當請求對映至以下內容時才呼叫處理程式'前面的對號:
首先選中伺服器,然後點選FastCGI設定:
對環境變數PYTHONPATH和WSGI_HANDLER的設定:
其中,PYTHONPATH表示Flask專案的根目錄,WSGI_HANDLER表示檔名.app。
主要是Flask專案根目錄下面的web.config檔案:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="XXX" path="*" verb="*" modules="FastCgiModule" scriptProcessor="d:\python37\python.exe|d:\python37\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
</handlers>
</system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="server_fastapi.app" />
<add key="PYTHONPATH" value="YYY" />
<add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
</appSettings>
</configuration>
wfastcgi官方完整的web.config組態檔[4]如下所示:
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="C:\Python36\python.exe|C:\Python36\Lib\site-packages\wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script" />
</handlers>
</system.webServer>
<appSettings>
<!-- Required settings -->
<add key="WSGI_HANDLER" value="my_app.wsgi_app()" />
<add key="PYTHONPATH" value="C:\MyApp" />
<!-- Optional settings -->
<add key="WSGI_LOG" value="C:\Logs\my_app.log" />
<add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
<add key="APPINSIGHTS_INSTRUMENTATIONKEY" value="__instrumentation_key__" />
<add key="DJANGO_SETTINGS_MODULE" value="my_app.settings" />
<add key="WSGI_PTVSD_SECRET" value="__secret_code__" />
<add key="WSGI_PTVSD_ADDRESS" value="ipaddress:port" />
</appSettings>
</configuration>
說明:重新啟動伺服器後就可以使用https+域名存取Flask專案介面了。
通過IIS部署Flask介面後,發現在首次請求API的時候,TTFB延遲大:
當再次請求API的時候,響應速度就非常的快了:
主要參考了[5]和其它的相關文章,無論是網站高階設定->預載入已啟用,還是設定編輯器,還是應用程式池高階設定(佇列長度|啟動模式|固定時間間隔|閒置超時)等都做了嘗試,但是首次請求API的時候,TTFB延遲大的問題仍然存在。現在的權宜之計是在app啟動的時候自動發一次測試請求,這樣使用者在首次使用的時候不會覺得請求時間過長,畢竟TTFB幾十秒的延遲實在是太高了。
參考文獻:
[1]Windows Server 2012R2伺服器IIS安裝步驟:https://jingyan.baidu.com/article/93f9803f234eade0e46f559f.html
[2]IIS伺服器SSL證書安裝部署:https://cloud.tencent.com/document/product/400/35225
[3]將基於Flask框架的Web應用部署到IIS上:https://www.jianshu.com/p/8b6b263144ba
[4]wfastcgi 3.0.0:https://pypi.org/project/wfastcgi/
[5]IIS解決首次載入慢的問題:https://www.cnblogs.com/chasingdreams2017/p/13972644.html
吾愛DotNet 專注於.NET領域的技術分享
人工智慧乾貨推薦 專注於人工智慧領域的技術分享