記錄 apache+mod_wsgi+flask 基於 python3 詳細安裝步驟,同時配置站點訪問的 html 和站點 restful api 請求
由於我是按照 apache 加載擴展的方式引入 mod_wsgi ,因此我須要拿到編譯後的 mod_wsgi.so 文件。能夠本身去 github下載文件進行編譯安裝,下面是我使用的 pip3
安裝html
使用 pip3
安裝 mod_wsgipython
$ yum install python36-devel httpd-devel $ /usr/bin/pip3 install -v mod_wsgi
安裝成功後找到 mod_wsgi 文件夾下 server 文件夾 path/to/python3.6/site-package/smod_wsgi/server
,在該文件夾下有個 mod_wsgi 的 .so 文件 mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
,在 apache 中引入該擴展:linux
# 進入 mod_wsgi 下 server 文件夾 $ cd /usr/local/lib64/python3.6/site-packages/mod_wsgi/server # 將文件夾下 mod_wsgi.so 文件複製到 apache 的 modules 模塊下 $ cp mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so /usr/local/apache/modules/mod_wsgi.so
用 pip
安裝virtualenvgit
$ pip3 install virtualenv
建立開發項目 project ,並進入該項目github
$ mkdir project $ cd project
建立一個獨立的Python運行環境,命名爲 venv
,並用 source
進入該環境shell
$ virtualenv --no-site-packages venv $ source venv/bin/activate
在虛擬環境中安裝 flaskapache
$ pip3 install flask
/data/www/project ├── api │ └── api.py ├── index.html
站點目錄結構如圖所示,首頁是根目錄下的 index.html 請求http://localhost/index.html
,api請求爲 http://localhost/api/list
json
在 api 目錄下新建文件 app.wsgiflask
import sys sys.path.insert(0, "/data/www/project/api/") from api import app as application if __name__ == "__main__": application.run()
編輯 api.py 文件vim
from flask import Flask,jsonify app = Flask(__name__) @app.route('/list') def getList(): return jsonify('success') if __name__ == '__main__': app.run()
加載 mod_wsgi.so 模塊,修改 apache 的 httpd.conf ,加入 LoadModule wsgi_module modules/mod_wsgi.so
$ vim /usr/local/apache/conf/httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
修改站點配置文件
$ vim /usr/local/apache/conf/vhost/default.conf
<VirtualHost *:80> ServerName localhost # 指定根目錄 DocumentRoot /data/www/project/ # WSGIDaemonProcess用於指定應建立不一樣的守護進程,設置守護進程組的名稱爲 wsgi_api # threads 指定線程數爲5 # python-home 指定守護進程使用的 Python 虛擬環境的位置爲/data/www/project/venv # python-path 引用 Python 虛擬環境的 site-packages 目錄 WSGIDaemonProcess wsgi_api threads=5 python-home=/data/www/project/venv python-path=/data/www/project/venv/lib/python3.6/site-packages # WSGIScriptAlias 與 Alias 指令相同,將特定文件路徑 /api 標記爲腳本 /data/www/project/api/app.wsgi,此腳本應由mod_wsgi 的 wsgi-script 處理程序處理 WSGIScriptAlias /api /data/www/project/api/app.wsgi <Directory /data/www/project/api> WSGIProcessGroup wsgi_api WSGIApplicationGroup %{GLOBAL} # WSGIScriptReloading 設置對WSGI腳本文件的更改都觸發從新加載機制 WSGIScriptReloading On AllowOverride None Require all granted </Directory> </VirtualHost>
重啓 apache
$ /etc/init.d/httpd restart
http://localhost/index.html
curl http://localhost/api/list
/usr/bin/pip3 install -v mod_wsgi
報錯 src/server/wsgi_python.h:24:20: fatal error: Python.h: No such file or directory
$ yum install python36-devel httpd-devel
apache 能夠不加配置選項 WSGIDaemonProcess
修改 app.wsgi 文件爲
# 進入虛擬環境 activate_this = '/data/www/project/venv/bin/activate_this.py' execfile(activate_this, dict(__file__=activate_this)) import sys sys.path.insert(0, "/data/www/project/api/") from api import app as application if __name__ == "__main__": application.run()