前幾天接到了一個臨時的任務,寫一個 API。我速速就完成了工作,一切都滿順利的。直到昨天, Mentor 跟我說了一句話:你這個服務是要架在 Windows Server 上的哦…



前言

Flask 要 Deploy 有很多的方法,看了很多的文章,最後決定用 Apache + mod_wsgi 來完成。

所以我現在有三樣東西:

  • Flask:一個 Python 的 Web 框架
  • Apache:一架直升機 一個開放原始碼的網頁伺服器軟體
  • mod_wsgi:一個為了那些以 Python 為主的 web application 要在 Apache 上運行所實作的 WSGI compliant interface

好,開始。

安裝各個元件之前,要先注意一件事,就是電腦裡的 Python 跟之後要安裝的 Apache 和 mod_wsgi 都必須是用相同版本的 C/C++ 編譯器產生的。比如說我的 Python 是 2.7.12 64bit,所以我的 Apache 也要選擇 64 bit 來裝,等下會有詳細說明。

以下是步驟(已經寫好 Flask Web App):

  1. 安裝 Apache
  2. 安裝 mod_wsgi
  3. 建立 wsgi 檔
  4. Apache 配置
  5. 測試

安裝 Apache

直接到 https://www.apachelounge.com/download/ 下載需要的版本。前面有說要載相同編譯器產生的版本。因為 Python 2.7 相對應的 C/C++ 編譯器版本是 VC9,所以這次我載的是 Apache 2.4 binaries VC10 (VC10 包含 VC9)Win64。載下來會是一個壓縮資料夾,解壓縮之後放入 C:\ ,這也是 Apache 預設的配置。

解壓縮完成之後,打開 cmd ,到 C:\Apache\bin 底下,輸入指令:

 httpd

然後打開瀏覽器,輸入:

 http://localhost

如果畫面顯示 “It Works!” 就代表成功了。

安裝 mod_wsgi

跟 Apache 一樣,mod_wsgi 也要選擇正確的版本安裝。這邊從 https://github.com/GrahamDumpleton/mod_wsgi/releases 下載了一包 mod_wsgi-windows-4.4.12.tar.gz。解壓縮之後裡面有很多不同版本的 mod_wsgi,我選擇了 \Apache24-win64-VC10\modules\mod_wsgi-py27-VC9.so 這個檔案。

要放進 Apache 的方法很簡單,只要把這個檔案改名為 mod_wgsi.so 然後複製到 C:\Apache24\modules ,接著修改 Apache 的配置文件 C:\Apache24\conf\httpd.conf,加入這一行:

LoadModule wsgi_module modules/mod_wsgi.so

存檔後再重新啟動一次 httpd,如果沒有噴錯,就成功囉。

建立 wsgi 檔

1
2
3
4
5
6
7
8
9
10
11
import sys
#Expand Python classes path with your app's path
sys.path.insert(0, "c:/Test_Web")
from test import app
#Put logging code (and imports) here ...
#Initialize WSGI app object
application = app

Apache 配置

修改 Apache 的配置文件 C:\Apache24\conf\httpd.conf,在最下面加入:

1
2
3
4
5
6
7
8
<VirtualHost *:80 >
DocumentRoot c:\Test_Web
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /flasktest c:\Test_Web\test.wsgi
<Directory "c:\Test_Web">
Require all granted
</Directory>
</VirtualHost>

至於為什麼和參考文不一樣,要加入 WSGIApplicationGroup,可以看這篇:http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIApplicationGroup.html

另外這裡 VirtualHost 和 Listen 的 port 是 80,如果跟其他 port 有衝突,可以直接修改(兩個都要改)就可以了。

測試

只要打開瀏覽器,一樣到 localhost 上,看看 App 有沒有正常運行就可以了!大功告成!

好吧這真的是一個很特別的經驗,雖然寫起來一點點,但是中間的障礙我卻是弄了三天啊!最後才發現是 Python Lib 和沒有設定 WSGIApplicationGroup %{GLOBAL} 的問題,這些都弄好之後就很快了。僅以此紀念這次神奇的經驗。

參考連結