在Apache上用mod_wsgi部署Flask (python 3.8, Ubuntu)


因为项目源码用了一些>python3.5的语法糖,但是Ubuntu的mod_wsgi包对应的是python3.5,所以采用从pip安装mod_wsgi的方法

参考:

  • Flask教程
  • mod_wsgi文档
  • https://stackoverflow.com/questions/44914961/install-mod-wsgi-on-ubuntu-with-python-3-6-apache-2-4-and-django-1-11

Project/Python部分

准备WSGI文件

准备一个wsgi.py文件,内容如下:

import sys

sys.path.insert(0, "")
from yourapplication import app as application

if __name__ == "__main__":
    application.run()

配置Python虚拟环境

为了不要修改系统python
安装工具:

sudo pip install virtualenv

进入我们的project目录,新建环境:

virtualenv myprojectenv

进入虚拟环境安装python包:

source myprojectenv/bin/activate

然后命令行应该会长这样:
(myprojectenv)user@host:~/myproject$

安装自己project的依赖项:

pip install -r requirements.txt

Apache部分

安装必要的包

sudo apt-get update
sudo apt-get install apache2 apache2-dev

apache2-dev是因为如果想用pip安装特定python版本的mod_wsgi的话,需要它。

pip安装特定python版本的mod_wsgi:

pip install mod_wsgi

通过这个命令得到对应的配置:

mod_wsgi-express module-config

会输出一个这样的东西

LoadModule wsgi_module "/mnt/disk1/miniconda3/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
WSGIPythonHome "/mnt/disk1/miniconda3"

把这两行复制到/etc/apache2/mods-available/wsgi.load里,替换掉原来的内容
最后enable wsgi模块:

sudo a2enmod wsgi

配置Apache

/etc/apache2/sites-available下新建一个配置文件yourapplication.conf,内容如下:


    ServerName localhost

    # WSGIDaemonProcess用于指定应创建不同的守护进程,设置守护进程组的名称为 yourapplication
    # python-home 指定守护进程使用的 Python 虚拟环境的位置为/data/www/project/venv
    # python-path 可以理解为PYTHONPATH环境变量,可以有多个。最好一个是引用 Python 虚拟环境的 site-packages 目录, 另一个可以是项目的目录
    WSGIDaemonProcess yourapplication  python-home= python-path= python-path=
    # WSGIScriptAlias 与 Alias 指令相同 如果不是/而/api,那就该app的访问路径就是localhost/api了
    WSGIScriptAlias / /var/www/yourapplication/wsgi.py

    
        WSGIProcessGroup yourapplication
        WSGIApplicationGroup %{GLOBAL}
        # WSGIScriptReloading 设置对WSGI脚本文件的更改都触发重新加载机制
        WSGIScriptReloading On
        # apache 2.4 之后用这个来控制访问
        Require all granted
    

重启apache

记得重启apache:sudo service apache2 reload