详解如何在Apache中运行Python WSGI应用
本文详细介绍在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官方文档。
本文内容至此结束,希望能为您的学习提供助益,也欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









