1. 程式人生 > >Apache部署flask的一些踩坑記錄(win64+python36)

Apache部署flask的一些踩坑記錄(win64+python36)

基礎配置:
將一個Flask應用部署到本地的Windows伺服器上。作業系統是64位的,程式是基於Python 3.6開發的。

部署選擇:
mod_wsgi + Apache

注意事項:

  • 不能混用32位和64位的檔案
  • 安裝Python時要選擇“Install for all users”
  • 構建Apache使用的編譯器版本要與構建Python的一致
  • 構建mod_wsgi使用的編譯器版本要與構建Python的一致

準備:

Apache,官網即可,要選擇版本一致的,我選擇了官網的這個2.4版本,解壓即可使用;安裝Python時要選擇“Install for all users”。另外,自定義專案裡的“Add python.exe to Path”也最好選上。
把Apache24資料夾解壓縮到c:\Apache24。(因為配置檔案裡是預設的這個路徑,如果要放在別的地方,就自己修改下相應的配置)
ps.為了方便排錯,可以在這裡先測試一下Apache是否正常。執行bin資料夾裡httpd.exe,然後訪問

http://localhost/,如果沒有問題應該可以看到測試頁。
對於mod_wsgi的配置,就比較坑了,目前網上可見的打包好的資源(.so包)貌似只到4.4.12版本,而這個版本只相容到python3.3且對應VC10,所以與我這的3.6不相容(當然為省事,可以換成python3.3版本,可是總覺得3.5以前的版本不成熟),針對這兩種情況,解決方式如下:

若有.so包:
把mod_wsgi-py34-VC10.so複製到c:\Apache24\modules目錄下,檔名改成mod_wsgi.so,然後把
LoadModule wsgi_module modules/mod_wsgi.so
新增到配置檔案(httpd.conf)裡。

若沒有so包:
- 下載mod_wsgi Python的外掛

http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi

本人使用的這個 mod_wsgi‑4.5.15+ap24vc14‑cp36‑cp36m‑win_amd64.whl
i. 這個外掛對應的Apache版本是24 VC是14
ii. Python版本是3.6
iii. 64位系統
在下載時要選擇相應的版本,否則Apache啟動時會有問題.

2.把下載的.whl檔案複製到pythona安裝目錄 (os.file對應的地址) 的python\Scripts下使用
然後命令列裡
pip install “mod_wsgi-4.5.15+ap24vc14-cp36-cp36m-win_amd64.whl”
進行安裝,在安裝成功後,在python的安裝目錄的\scripts資料夾下dos裡執行mod_wsgi-express module-config
輸出類似如下三行結果:
LoadFile “d:/program files/python36/python36.dll”
LoadModule wsgi_module “d:/program files/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd”
WSGIPythonHome “d:/program files/python36”
把這三行內容複製到http.cnf檔案下進行配置
取代有so包情況下的
LoadModule wsgi_module modules/mod_wsgi.so

測試:

將測試檔案儲存為c:\mydir\myapp.wsgi,裡面程式碼如下:

def application(environ, start_response):
     status = '200 OK'
     output = b'Hello World!'
      response_headers = [('Content-type', 'text/plain'),
                         ('Content-Length', str(len(output)))]
     start_response(status, response_headers)
      return [output]

在apache的配置檔案conf/httpd.conf裡最末行新增:

 <VirtualHost *:80>
     WSGIScriptAlias /myapp c:\mydir\myapp.wsgi
     <Directory c:\mydir>
         Require all granted
     </Directory>
 </VirtualHost>

重新執行httpd.exe,然後訪問http://localhost/myapp,看到Hello World!就說明安裝成功了。
這裡,可能存在埠衝突的問題,這種情況下,可以更改配置檔案conf/httpd.conf為一個沒有佔用的埠,具體可以百度;

作者: 劉鹹尚

部署Flask應用:
這裡,我用pycharm做開發,pycharm裡,安裝flask,然後建立hello.py檔案,程式碼如下:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Well done"

if __name__ == '__main__':
    app.run()

mod_wsgi要求WSGI應用的入口叫“application”,所以我們還需要建立一個.wsgi檔案來做轉換。把下面的程式碼儲存為myapp.wsgi,然後按照之前的方式,更改apache配置檔案裡的VirtualHost 標籤裡的路徑,改成目前pycharm專案所在目錄。
myapp.wsgi內容為:

 import sys
 sys.path.insert(0, '替換你的專案原始碼包的目錄')
 from hello import app as application

重啟Apache,檢視一下配置好的成果吧,瀏覽器輸出Well done,就說明成功啦。

一些坑:

  • pycharm帶來的,就是比如建立了另外一個temp.py檔案,裡面有個cal方法,需要在hello.py中引用,這些檔案位於sample包下面,導包的時候出現了問題(from sample.temp import cal),apache總是報internal server error,檢視日誌後,發現ModuleNotFoundError: No module named ‘sample’,這種問題源自於路徑沒對應,事實上是pycharm預設該專案的根目錄為source目錄,所以import使用絕對路徑而不是相對路徑的話,就會從專案的根目錄中查詢,而不是我們希望的其中的/src目錄,所以import不成功。
    解決方式:更改pycharm的src路徑,在file–>setting–>project:server–>project structure裡面,將sample標記為Sources。

暫時先這麼多吧。