1. 程式人生 > >window2008下,部署apache+mod_msgi+flask

window2008下,部署apache+mod_msgi+flask

注:本文前題是你已懂得怎麼使用python flask建站。這裡只是提供一種方法,使用apache + mod_wsgi來部署你的python專案
環境:

  • windows 2008
  • python 3.7 64bit
  • apache 2.4.35 x64(ApacheHaus) 下載地址:http://httpd.apache.org/download.cgi ->Files for Microsoft Windows ->ApacheHaus->Apache 2.4.35 x64
  • mod_wsgi‑4.6.4+ap24vc15‑cp37‑cp37m‑win_amd64.whl 下載地址:
    https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
    注意選擇好對應的apache、python版本下載
  • 專案路徑:d:\pyproject\test\
  • 建議使用pycharm開發,新建專案預設使用venv。

步驟:

  1. 安裝python37 64bit,預設安裝目錄。
  2. 下載並解壓ApacheHaus至:“d:\Apache24”。進入"d:\Apache24\bin",執行httpd.exe,使用瀏覽器開啟localhost:80,若沒問題則可看到一個apache預設的頁面。若是出錯,此時一般就是預設埠被佔用。
  3. 下載mod_wsgi‑4.6.4+ap24vc15‑cp37‑cp37m‑win_amd64.whl,將其副檔名.whl改為.zip,開啟並將"mod_wsgi\server\mod_wsgi.cp37-win_amd64.pyd"拷貝至"d:\Apache24\modules"。網上很多部落格介紹都是在python專案的虛擬環境中安裝mod_wsgi,若是主機裡有多個專案部署的話,就需要每個專案都安裝mod_wsgi,所以還不如直接將mod_wsgi-*.pyd放到"d:\Apache24\modules\",一次搞定。
  4. 使用pycharm建立新專案test,並先建wsgi.py(很多人建議使用"專案名稱.wsgi",但為了方便在pycharm中編輯,我還是用了wsgi.py,都可以用。)
def application(environ,start_response):
    status = "200 Ok"
    output = b"Hello wsgi"
    response_headers=[('Content-type','text/plain'),('Content-Length',str(len(output)))]
    start_response(status,response_headers)
return[output]
  1. 修改d:\Apache24\conf\httpd.conf:
    將LoadModule vhost_alias_module modules/mod_vhost_alias.so前面的#去掉,意思是讓其有效,這個是為之後的虛擬主機啟用做準備。
    在最底下加入以下程式碼。重啟d:\Apache24\bin\httpd.exe,在瀏覽器中開啟localhost:5002(監聽埠改為5002),應該可以看到"Hello wsgi"。至此說明mod_wsgi運作正常,以後就是怎麼與python程式連線的問題了。
LoadModule wsgi_module "modules/mod_wsgi.cp37-win_amd64.pyd"

Listen 5002 # (監聽埠)
<VirtualHost *:5002>
        WSGIScriptAlias / D:\pyproject\test\wsgi.py
        <Directory D:\pyproject\test>
                Require all granted
        </Directory>
</VirtualHost>

6.在 pycharm的虛擬環境中安裝flask:pip install flask。並建立test.py與wsgi.py同一目錄:

from flask import *
app=Flask(__name__)
@app.route('/')
def index():
    return '<center><h1>Hello Flask-test</h1></center>'
if __name__ == '__main__':
    app.run()
# def application(environ,start_response):
#     status = "200 Ok"
#     output = b"Hello wsgi"
#     response_headers=[('Content-type','text/plain'),('Content-Length',str(len(output)))]
#     start_response(status,response_headers)
#     return[output]

# import sys
#
# sys.path.insert(0, 'D:\\pyproject\\test\\')
# 如果你的test.py與wsgi.py放在同一目錄下,就不需要sys.path.insert()。若是在部署時出現找不到你的專案檔案、包之類的錯誤,可以嘗試在這裡加上這一句。
from test import app as application

  1. 在d:\Apache24\conf\httpd.conf中加入WSGIPythonHome(指向系統中安裝python的路徑)和WSGIPythonPath(python專案路徑,和該專案的虛擬環境包路徑,以“;”號隔開。不同專案不同路徑,也可在這裡新增,同樣以“;”號隔開。)
LoadModule wsgi_module "modules/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "C:\Users\Administrator\AppData\Local\Programs\Python\Python37"
WSGIPythonPath "D:/pyproject/test;D:\pyproject\test\venv\Lib\site-packages"

Listen 5002 # (監聽埠)
<VirtualHost *:5002>
        WSGIScriptAlias / D:\pyproject\test\wsgi.py
        <Directory D:\pyproject\test>
                Require all granted
        </Directory>
</VirtualHost>
  1. 再次重啟d:\Apache24\bin\httpd.exe,瀏覽器中開啟localhost:5002,可以看到“Hello Flask-test”,意味著python專案已啟動了。

  1. Fatal Python error: initfsencoding: unable to load the file system codec
    ModuleNotFoundError: No module named ‘encodings’
    這個錯誤是因為找不到python直譯器,在httpd.conf中加入:
    WSGIPythonHome “C:\Users\Administrator\AppData\Local\Programs\Python\Python37”
    路徑是你係統中python的安裝路徑。
    網上也有部落格介紹是在系統環境中加入:PYTHONHOME=“C:\Users\Administrator\AppData\Local\Programs\Python\Python37”
    PYTHONPATH=“C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib”
    系統環境中設定PYTHONHOME和PYTHONPATH可能和在httpd.conf中設定WSGIPythonHome和WSGIPythonPath是同一個道理,但我沒有回頭再去嘗試。因為覺得把所有設定都放在同一個地方會更好。


  2. Traceback (most recent call last):\r, referer: http://localhost:5002/
    File “D:/pyproject/test/wsgi.py”, line 3, in \r, referer: http://localhost:5002/
    from test import app as application\r, referer: http://localhost:5002/
    ImportError: cannot import name ‘app’ from ‘test’ (C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\test\init.py)\r, referer: http://localhost:5002/
    這個錯誤是找不到你的專案,在httpd.conf中加入:
    WSGIPythonPath “D:/pyproject/test”
    路徑是你的專案路徑。用分號隔開,可以有多個專案同時執行。


  3. Traceback (most recent call last):\r
    File “D:/pyproject/test/wsgi.py”, line 7, in \r
    from test import app as application\r
    File “D:\pyproject\test\test.py”, line 1, in \r
    from flask import Flask\r
    ModuleNotFoundError: No module named ‘flask’\r
    這個錯誤是找不到你專案(虛擬環境)中的依賴包,在httpd.conf中的WSGIPythonPath 在加入"D:\pyproject\test\venv\Lib\site-packages",即最終是:
    WSGIPythonPath “D:/pyproject/test;D:\pyproject\test\venv\Lib\site-packages”