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

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

参考:

Project/Python部分

准备WSGI文件

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

import sys

sys.path.insert(0, "<path_to_the_application>")
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,内容如下:

<VirtualHost *>
    ServerName localhost

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

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

重启apache

记得重启apache:sudo service apache2 reload

posted @ 2021-08-11 17:56  milliele  阅读(806)  评论(0编辑  收藏  举报