在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