apache+mod_wsgi+flask 詳細安裝步驟

記錄 apache+mod_wsgi+flask 基於 python3 詳細安裝步驟,同時配置站點訪問的 html 和站點 restful api 請求

本機環境介紹

  1. 已安裝 apache/2.4.6
  2. 已安裝 python3.6
  3. 系統是 centos7

安裝 mod_wsgi

由於我是按照 apache 加載擴展的方式引入 mod_wsgi ,因此我須要拿到編譯後的 mod_wsgi.so 文件。能夠本身去 github下載文件進行編譯安裝,下面是我使用的 pip3 安裝html

  1. 使用 pip3 安裝 mod_wsgipython

    $ yum install python36-devel httpd-devel
    $ /usr/bin/pip3 install -v mod_wsgi
  2. 安裝成功後找到 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

在虛擬環境中安裝Flask

  1. pip 安裝virtualenvgit

    $ pip3 install virtualenv
  2. 建立開發項目 project ,並進入該項目github

    $ mkdir project
    $ cd project
  3. 建立一個獨立的Python運行環境,命名爲 venv ,並用 source 進入該環境shell

    $ virtualenv --no-site-packages venv
    $ source venv/bin/activate
  4. 在虛擬環境中安裝 flaskapache

    $ pip3 install flask

配置站點

/data/www/project 
├── api
│    └── api.py
├── index.html

站點目錄結構如圖所示,首頁是根目錄下的 index.html 請求http://localhost/index.html ,api請求爲 http://localhost/api/listjson

  1. 在 api 目錄下新建文件 app.wsgiflask

    import sys
    sys.path.insert(0, "/data/www/project/api/")
    from api import app as application
    
    if __name__ == "__main__":
       application.run()
  2. 編輯 api.py 文件vim

    from flask import Flask,jsonify
    app = Flask(__name__)
    
    @app.route('/list')
    def getList():
        return jsonify('success')
    
    if __name__ == '__main__':
        app.run()

配置 Apache

  1. 加載 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
  2. 修改站點配置文件

    $ 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>
  3. 重啓 apache

    $ /etc/init.d/httpd restart

測試

  1. 直接訪問首頁 http://localhost/index.html
  2. 請求接口 curl http://localhost/api/list

遇到並解決的問題

問題1:

/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
問題2:

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()

參考資料

  1. mod_wsgi 文檔
  2. mod-wsgi 4.7.1 安裝文檔
相關文章
相關標籤/搜索