详解如何在Apache中运行Python WSGI应用

纸上星河
纸上星河
发布时间:2026-10-13| 5人浏览过
原创

本文详细介绍在Apache服务器中部署Python WSGI应用的完整流程。涵盖mod_wsgi模块的编译安装、Apache配置加载、Hello World及Flask应用测试,并深入讲解Python虚拟环境的集成方法及.egg包解压权限问题的解决方案,帮助开发者高效完成生产环境部署。

在生产环境中,通常采用高稳定性的Web服务器(如Apache)来承载应用。若Web应用基于Python开发且遵循WSGI规范(例如使用Django或Flask框架),则需通过Apache模块mod_wsgi将其部署至Apache中。本文旨在阐述利用mod_wsgi运行Python WSGI应用的具体方法。

安装mod_wsgi

假设系统已具备Apache与Python环境(Linux或Mac),首要步骤为安装mod_wsgi。在Ubuntu或Debian系统中,可直接使用apt-get命令进行安装。

$ sudo apt-get install libapache2-mod-wsgi
$ sudo apt-get install libapache2-mod-wsgi-py3  # For Python 3

尽管包管理器安装便捷,但推荐采用源码编译方式以确保跨系统兼容性。具体操作步骤如下:

1、下载源码包

mod_wsgi源码托管于GitHub,可访问https://github.com/GrahamDumpleton/mod_wsgi/releases下载对应版本的源码压缩包。

2、解压源码并配置编译选项

若使用默认配置,直接执行以下命令即可:

$ ./configure

如需指定特定的Apache与Python路径,需添加“–with-apxs”和“–with-python”参数进行配置:

$ ./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=/usr/local/bin/python

3、编译并安装

$ sudo make && make install

4、在Apache配置文件中加载mod_wsgi模块

编辑Apache配置文件httpd.conf,其默认路径通常为:

$ sudo vi /etc/httpd/conf/httpd.conf  # For Linux
$ sudo vi /etc/apache2/httpd.conf   # For Mac

在文件末尾的“Load Module”配置项之后,添加mod_wsgi的加载指令。需注意Linux与Mac系统的模块路径存在差异:

LoadModule wsgi_module modules/mod_wsgi.so  # For Linux
# LoadModule wsgi_module libexec/apache2/mod_wsgi.so  # For Mac

5、重启Apache服务以应用配置

$ sudo service httpd restart    # For Linux
$ sudo service apachectl restart  # For Mac

测试mod_wsgi

最简单的验证方式是创建“Hello World”应用。在Apache的DocumentRoot根目录下新建文件“test.wsgi”,内容如下:

def application(environ, start_response):
  status = '200 OK'
  output = 'Hello World!'
 
  response_headers = [('Content-type', 'text/plain'),
            ('Content-Length', str(len(output)))]
  start_response(status, response_headers)
 
  return [output]

上述代码中的application函数即为WSGI应用对象,其返回值代表处理请求后的响应内容。随后,在Apache配置文件httpd.conf末尾添加URL路径映射:

WSGIScriptAlias /test /var/www/test.wsgi

此处假设Apache的文档根目录为“/var/www”。

此时,通过浏览器访问“http://localhost/test”,若页面显示“Hello World!”,则表明mod_wsgi安装成功。

接下来测试Flask应用。前提是本机Python环境已安装Flask,将“test.wsgi”内容修改为:

from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
  return '<h1>Hello World!</h1>'

注意,Flask应用对象必须命名为“application”,否则mod_wsgi无法识别。再次通过浏览器访问,若能看到大标题“Hello World!”,则部署成功。

使用Python虚拟环境

通常应用部署于虚拟环境中,以便独立更新而不影响其他应用。要在WSGI应用中调用虚拟环境,需在“.wsgi”文件中先执行虚拟环境的激活脚本。基于前述代码,修改如下:

activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
 
from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
  return '<h1>Hello World!</h1>'

示例中虚拟环境位于“/home/bjhee/virtualenv”,其“/bin”子目录下存在激活脚本“activate_this.py”。在WSGI应用初始化阶段执行该脚本即可。

补充内容

若Python环境中的模块以.egg压缩包形式安装,WSGI应用运行时需解压该包。默认解压路径(如Mac下的“/Library/WebServer/.python-eggs”)可能缺乏访问权限,因此需指定临时解压目录。方法包括:一是在Apache的httpd.conf中使用“WSGIPythonEggs”配置项指定路径;二是设置系统环境变量“PYTHON_EGG_CACHE”。建议采用第二种方法,并将其写入“.wsgi”文件,以避免影响其他应用:

activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
 
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs'
 
from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
  return '<h1>Hello World!</h1>'

运行前,请确认临时目录(如上例中的“/home/bjhee/.python-eggs”)具备访问及写入权限。

更多详细信息请参考mod_wsgi官方文档。

本文内容至此结束,希望能为您的学习提供助益,也欢迎继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。