windows conda + python apache 安装 mod_wsgi

背景

本地有个项目,服务器是Apache,之前后端实现一部分是PHP,一部分是通过PHP exec调用的Python,还有一些本地定时执行调用Python的bat脚本。最近项目复杂了起来,把后端重构了下,统一改成了Python实现,并且单独给Python代码创建了一个conda的虚拟环境,在使用的过程中发现PHP exec激活conda环境+执行Python脚本的速度很慢,有1.5s,所以想直接把Python集成到Apache中。

Apache集成Python有两种方式,fastcgi和Python专用的mod_wsgi,现在最流行和推荐的是mod_wsgi模式,所以研究了下,发现网上关于windows + conda python + mod_wsgi的教程很乱,也很少,还都是很古早之前的文章,里面引用的网址都已经没有了,所以在成功之后写了这篇文章,给大家参考下。

准备

推荐大家直接看mod_wsgi作者的github,写的很详细。注:作者GrahamDumpleton明确表示,他不提供预编译的mod_wsgi.so文件,因为每个版本的Apache和Python必须是一一对应的,他推荐在安装的时候在本地自行编译so。

  1. Apache
    必须是完整安装的Apache,要附带开发包,因为之后要手动打出so模块。我用的是XAMPP里的Apache,包含了完整的开发包。完整的Apache可以从这里下载。
  2. Python
    Python理论上也需要完整的头文件,不过windows上的Python都自带头文件,所以windows只用按自己的情况安装Python就行了。其他操作系统可能只有Python的运行时,缺少头文件,大家可以按GrahamDumpleton的github readme的教程补齐头文件。

安装

整个安装过程比较简单

设置环境变量

默认安装时会自动到C:/Apache24目录下寻找Apache,但是如果你的Apache不在这个位置,那就需要设置一下环境变量MOD_WSGI_APACHE_ROOTDIR,指明系统上的Apache的位置。

安装

运行pip install mod_wsgi,就这一个命令

配置Apache

mod_wsgi安装完成之后,运行mod_wsgi-express install-module命令,脚本会输出

LoadFile "C:/Users/XXX/anaconda3/envs/XXX/python312.dll"
LoadModule wsgi_module "C:/Users/XXX/anaconda3/envs/XXX/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp312-win_amd64.pyd"
WSGIPythonHome "C:/Users/XXX/anaconda3/envs/XXX"

直接把这三行copy到Apache的httpd.conf文件就行。conda的虚拟环境也是一样的,脚本能识别的出来,我这个就是虚拟环境。

上面命令给Apache指明了在哪里找到python和mod_wsgi模块。然后再配置一个命令,这个命令是指示Apache把 /XXX/XXX 开头的请求发送给mod_wsgi处理程序。

WSGIScriptAlias /XXX/XXX "C:/Users/XXX/Xampp/htdocs/XXX/python/app.wsgi"

网上其他教程都会创建一个虚拟主机,我这里不需要虚拟主机,就直接copy到文件最后了。

WSGI处理程序

mod_wsgi本身是一种通信格式,也是需要三方库解析的,我找了一个比较简单的flask web框架来处理。需要新建两个文件
第一个文件就是标准的flask入口,具体参考flask教程

app = Flask(__name__)

@app.route("/")
def main():
    return ""

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

第二个是对接Apache的,主要作用有两个,一是from app import app as application,把你上一个文件里的app导入,命名为application,它是mod_wsgi预定义的名称,会默认找它处理请求。第二个是导入Python的path,import你的Python代码用的,一般是你项目的根目录。

import sys

path = "C:\\Users\\XXX\\Xampp\\htdocs\\XXX"

if path not in sys.path:
    sys.path.append(path)

from app import app as application

到这里mod_wsgi就算是配完了。

杂谈

安装mod_wsgi对Apache有要求,必须要包含开发包,安装之前我不知道我的XAMPP安装的Apache是完整的,只是想试一下,没想到一次就成功了。

如果Apache不是完整的,又不想卸载重装的话,我这里有一个没有经过测试的办法,在https://www.apachelounge.com/下载一个和本地安装Apache同版本&同VC编译版本的Apache,安装的时候把环境变量MOD_WSGI_APACHE_ROOTDIR指向这个新的Apache,mod_wsgi安装成功之后,把配置命令写进旧的Apache,再把新的删掉就行,理论上这种操作应该也可以。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值