通過IIS部署Flask項目

  本文主要介紹在Windows Server 2012R2上通過IIS部署Flask項目的過程,以及對TTFB延遲大問題的思考。關於如何申請雲伺服器,註冊(子)域名,備案,開放雲伺服器埠,獲取SSL證書等不做介紹,感興趣可以參考通過二級域名解決1台雲伺服器搭建多個公眾號後端服務的問題

一.部署環境準備

1.作業系統和IIS版本

作業系統的版本是Windows Server 2012R2,IIS版本為8.5.9600.16384:

2.CGI和ISAPI安裝

通過伺服器管理器添加角色和功能,主要是安裝CGI、ISAPI擴展、ISAPI篩選器:

二.IIS部署Flask項目

這裡的Flask項目特指通過Flask框架封裝的REST API後端介面的單個文件。

1.安裝和啟用wfastcgi模組

安裝、啟用和禁用wfastcgi命令如下所示:

pip install wfastcgi #安裝
wfastcgi-enable      #啟用
wfastcgi-disable     #禁用

通過命令wfastcgi-enable啟用後輸出結果如下:

2.添加和綁定網站

添加和編輯網站如下所示:

添加和編輯網站綁定如下所示:

3.添加模組映射

首先選中要配置的Flask項目,然後點擊處理程式映射,添加模組映射:

(1)請求路徑:*
(2)模組:FastCgiModule
(3)可執行文件:執行命令wfastcgi-enable的輸出
(4)名稱:自定義填寫
說明:填寫完畢後,在彈出的對話框中選擇是。

4.請求限制

取消”僅當請求映射至以下內容時才調用處理程式’前面的對號:

5.FastCGI設置

首先選中伺服器,然後點擊FastCGI設置:

對環境變數PYTHONPATH和WSGI_HANDLER的設置:

其中,PYTHONPATH表示Flask項目的根目錄,WSGI_HANDLER表示文件名.app。

6.項目配置

主要是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項目介面了。

三.關於TTFB延遲大的問題

1.首次請求TTFB延遲大

通過IIS部署Flask介面後,發現在首次請求API的時候,TTFB延遲大:

當再次請求API的時候,響應速度就非常的快了:

2.沒有得到解決

  主要參考了[5]和其它的相關文章,無論是網站高級設置->預載入已啟用,還是配置編輯器,還是應用程式池高級設置(隊列長度|啟動模式|固定時間間隔|閑置超時)等都做了嘗試,但是首次請求API的時候,TTFB延遲大的問題仍然存在。現在的權宜之計是在app啟動的時候自動發一次測試請求,這樣用戶在首次使用的時候不會覺得請求時間過長,畢竟TTFB幾十秒的延遲實在是太高了。

參考文獻:
[1]Windows Server 2012R2伺服器IIS安裝步驟://jingyan.baidu.com/article/93f9803f234eade0e46f559f.html
[2]IIS伺服器SSL證書安裝部署://cloud.tencent.com/document/product/400/35225
[3]將基於Flask框架的Web應用部署到IIS上://www.jianshu.com/p/8b6b263144ba
[4]wfastcgi 3.0.0://pypi.org/project/wfastcgi/
[5]IIS解決首次載入慢的問題://www.cnblogs.com/chasingdreams2017/p/13972644.html

吾愛DotNet
右邊的圖片
專註於.NET領域的技術分享

人工智慧乾貨推薦
左邊的圖片1
專註於人工智慧領域的技術分享

Tags: