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 下載地址:
注意選擇好對應的apache、python版本下載
- 專案路徑:d:\pyproject\test\
- 建議使用pycharm開發,新建專案預設使用venv。
步驟:
- 安裝python37 64bit,預設安裝目錄。
- 下載並解壓ApacheHaus至:“d:\Apache24”。進入"d:\Apache24\bin",執行httpd.exe,使用瀏覽器開啟localhost:80,若沒問題則可看到一個apache預設的頁面。若是出錯,此時一般就是預設埠被佔用。
- 下載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\",一次搞定。
- 使用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]
- 修改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
- 在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>
- 再次重啟d:\Apache24\bin\httpd.exe,瀏覽器中開啟localhost:5002,可以看到“Hello Flask-test”,意味著python專案已啟動了。
-
:
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是同一個道理,但我沒有回頭再去嘗試。因為覺得把所有設定都放在同一個地方會更好。
-
:
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”
路徑是你的專案路徑。用分號隔開,可以有多個專案同時執行。 -
:
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”