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


Posted in Python onJanuary 02, 2019

在生产环境上,一般会使用比较健壮的Web服务器,如Apache来运行我们的应用。如果我们的Web应用是采用Python开发,而且符合WSGI规范,比如基于Django,Flask等框架,那如何将其部署在Apache中呢?本文中,我们就会介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用。

安装mod_wsgi

我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装。在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应用运行时需要将.egg压缩包解开。默认的解压路径很有可能没有访问权限,比如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 相关文章推荐
Python编程中time模块的一些关键用法解析
Jan 19 Python
Python中装饰器高级用法详解
Dec 25 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 #Python
对Python发送带header的http请求方法详解
Jan 02 #Python
Django渲染Markdown文章目录的方法示例
Jan 02 #Python
使用python 打开文件并做匹配处理的实例
Jan 02 #Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 #Python
python之验证码生成(gvcode与captcha)
Jan 02 #Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 #Python
You might like
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
主管会计岗位责任制
2014/02/10 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
科技之星事迹材料
2014/06/02 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
校园安全主题班会
2015/08/12 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers