windows下apache + mod_wsgi + python部署flask接口服務

 windows下apache + mod_wsgi + python部署flask接口服務python

用python3安裝虛擬環境

爲啥要裝虛擬環境?

緣由1:安裝虛擬環境是爲了使項目的環境和全局環境隔離開,在虛擬環境中,咱們可獨立的安裝須要的包,不影響系統中全局python環境的配置,一臺機器可根據不一樣項目建立多個虛擬環境,相互不會影響mysql

緣由2:根據網上的採坑經驗,若是在全局python環境下配置wsgi文件,會出現找不到系統中安裝的python包的狀況sql

 

填坑:爲啥用python3?

在下載apache文件時,發現能下載vc版本都時對應python3的,想找python2的沒找到。。。shell

因此只能從新裝python3環境,重裝虛擬環境,從新安裝python包,下載apache文件express

運行py -3 –m pip install pipenv 命令安裝虛擬環境

在裝虛擬環境前,可在項目根目錄下放一個Pipfile文件(用來指定安裝包的),這樣,建立python會把本目錄名稱做爲虛擬環境名稱的前綴,方便識別apache

 

 

運行pipenv shell激活虛擬環境

激活虛擬環境後,在目錄前方能夠看到安裝的虛擬環境名稱flask

 

安裝flask項目須要的包

pip install flask-sqlalchemywindows

 

pip install PyMySQLapi

pip install requestsrestful

pip install flask_restful

pip install python-dotenv

pip install mysqlclient #python3中鏈接mysql的,與python2不一樣

 

用python3安裝了虛擬環境後,能夠直接用pipenv shell激活虛擬環境,而不須要用py -3 –m pipenv shell這樣

 

另外,激活了py 3的虛擬環境後,安裝包的時候,不須要在用py -3 –m pip install這樣顯示的指定python3了,直接用pip install 就能夠,由於虛擬環境自己用的就是python3的解釋器

 

 

pycharm運行工程,看是否正常運行

裝完了虛擬環境和包後,在pycharm中打開項目文件,在interpreter中選擇虛擬環境中的python做爲解釋器,並查看安裝包是否能夠load出來

 

 

pycharm配置好解釋器後,在終端上是能夠看到虛擬環境的名稱

 

 

apache服務部署

 

下載apache,注意vc版本號:

參考:https://blog.csdn.net/mist99/article/details/80771289

 

我裝的python:v.1916,應該裝v.15

 

apache下載地址:

https://www.apachehaus.com/cgi-bin/download.plx

 

點擊對應的版本,跳到指定位置,直接下載

 

解壓後,放到本地某個位置

 

 

安裝apache:

參考:https://blog.csdn.net/k295330167/article/details/80616519

安裝過程比較簡單,解壓出來,運行幾個命令,配置一下配置文件

 

安裝apache服務:httpd –k install

運行目錄:在apache的bin目錄下

啓動apache:httpd –k start

重啓apache:httpd – k restart

 

若是apache版本和python的版本能夠對應的話,此處啓動應該沒啥問題,若是失敗的話,那多是apache的vc版本和python不對應,或者位數不對應(個人都是64位),能夠從新下一個,很簡單,只要能找到文件。

 

重點在配置httpd.conf文件後,是否可以正常啓動

 

安裝whl文件

爲啥要用whl文件?參考:https://blog.csdn.net/zhangtao0417/article/details/81564444

 

網上大多建議去下載xxx.so文件,而後loadModule進去,可是python3不到對應版本的.so文件,能夠經過python安裝mod_wsgi文件來達到loadModule的目的。

 

python3找不到對應版本(VC15)的.so文件,因此走.whl文件路線

 

下載whl地址:

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

 

whl文件要和apache的vc版本對應:

 

把whl文件放到flask項目的根目錄下

 

 

安裝whl文件

在虛擬環境下,進入項目根目錄放whl文件的地方

 

(apiServerGloryRoad-f6VPf2KB) D:\flask\apiServerGloryRoad>pip install "mod_wsgi-4.6.5+ap24vc15-cp37-cp37m-win_amd64.whl"

Processing d:\flask\apiservergloryroad\mod_wsgi-4.6.5+ap24vc15-cp37-cp37m-win_amd64.whl

Installing collected packages: mod-wsgi

Successfully installed mod-wsgi-4.6.5+ap24vc15

 

到虛擬環境所在的目錄下的Scripts下加載module-config

(apiServerGloryRoad-f6VPf2KB) C:\Users\Lenovo\.virtualenvs\apiServerGloryRoad-f6VPf2KB\Scripts>mod_wsgi-express module-config

LoadFile "C:/Users/Lenovo/AppData/Local/Programs/Python/Python37/python37.dll"

LoadModule wsgi_module "c:/users/lenovo/.virtualenvs/apiservergloryroad-f6vpf2kb/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"

WSGIPythonHome "c:/users/lenovo/.virtualenvs/apiservergloryroad-f6vpf2kb"

 

 

執行完後,把結果中的三行配置信息記錄下來

配置httpd.conf

把上面加載mudule時產生的三行信息複製到conf文件作最後邊

 

須要配置的地方:參考下面連接

https://blog.csdn.net/k295330167/article/details/80616519

其中涉及權限的地方,在vc15上按照下面的就能夠,網上說的Order開頭的在新版裏不支持了

1):

<VirtualHost *:5000 >

         ServerAdmin localhost

         DocumentRoot D:\flask\apiServerGloryRoad

         WSGIScriptAlias / D:\flask\apiServerGloryRoad\test.wsgi

         <Directory "D:\flask\apiServerGloryRoad">

                   Require all granted

             Require host ip 

         </Directory>

</VirtualHost>

 

2)

<Directory />

    Require all granted

         Require host ip

</Directory>

 

3)

Listen 5000

看apache日誌,分析錯誤

 

參考:https://blog.csdn.net/zhangtao0417/article/details/81564444

 

 

配置wsgi文件

在項目根目錄下新建一個.wsgi文件,定義application

 

 

部署時,在test.wsgi文件中直接寫代碼測試,先不引用其餘文件的app:

test.wsgi文件:

#encoding = 'utf-8'

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]

 

配置好wsgi文件後,重啓apache:httpd –k restart

 

訪問:http://127.0.0.1:5000

 

 

至此,apache服務算是搭建成功了80%~

 

接下來本應該很快搞定的地方,除了一個小坑,由於調查思路放在總體框架上,卡住了一天的時間!

從項目文件引入app

在wsgi文件中能夠引入其餘模塊的對象,在這裏須要從項目中引入ap和api

在引入時須要把項目目錄添加到系統環境變量中,讓wsgi可以識別到須要引入的對象位置

wsgi文件:import sys

flaskPath = 'D:\flask\apiServerGloryRoad'

if flaskPath not in sys.path: sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\test') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\apiServer') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\gloryRoadApi') from gloryRoadApi import app from apiServer import api application = app
 

注意:這裏的格式:sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad')

最大坑:ImportError: cannot import name 'app' from 'test' (一天)

在test.wsgi裏,從其餘文件導入app時,提示沒法映入’app’

在wsgi文件引入app時,報錯了

sys.path.insert(0, 'D:\flask\apiServerGloryRoad')

 

報錯提示信息:

ImportError: cannot import name 'app' from 'test'

(C:\\Users\\Lenovo\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\test\\__init__.py)\r

開始覺得可能緣由有:apache服務問題、apache配置文件問題、虛擬環境配置問題

各類搜索,百度,bing,最後,肯定大致框架上沒有問題,仍是工程自己的問題

緣由:

添加環境變量時用的sys.path.insert(0, 'D:\flask\apiServerGloryRoad'),少個’\’;

是由於添加環境變量時用的是一個’\’,實際須要兩個’\\’,緣由是經過打印環境變量的日誌發現目錄字符中間的\\處有特殊字符,沒有被識別到這個目錄!!!!

一個小地方,卡了一天!!!!!!

解決方案:

把添加環境變量的字符串’ D:\flask\apiServerGloryRoad'改成下面的:

sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad')
sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\test')

 

 

路徑修改好後,從新啓動apache:httpd –k restart

問題解決!

 

填坑:apache24權限是:Require all granted ,若是用order開頭的,會報錯

 

 

不用這兩行了:

Order allow,deny

Allow from all

 

用apache+wsgi部署flask服務的做用:

用apache部署了flask服務後,不用運行flask api代碼,直接訪問apache中配置的地址就能夠訪問api服務,每次訪問時,apache會把請求轉給flask api服務程序,進行返回

相關文章
相關標籤/搜索