搭建Apache+Wsgi+Flask的环境

突然想去学习一个 Python 的 Web 框架,当然第一步是先配置一下可以运行 Python 代码的环境。

从搜索引擎转了一圈,选择从熟悉的地方入手——Apache+Wsgi+Python 成为了我的选择,而框架暂选 Flask,而配置居然花了一个晚上的时间(而且还有许多问题没有解决)。

以下都是在 CentOS 下的操作,也默认在 Python2.7.5 下操作

安装 Virtualenv

首先,参考文档:http://dormousehole.readthedocs.org/en/latest/installation.html 安装 Virtualenv,安装 Flask,一切正常 注意,建立的目录最好在之前网站的目录之下,比如/var/www/html/pythonTest 这样

安装 WSGI

然后安装 Wsgi,没想到直接用 yum 安装就可以

1
yum install mod_wsgi

如果没有的话,可以 i 从 github 下载 swgi:https://github.com/GrahamDumpleton/mod_wsgi/releases 然后编译安装:

1
2
3
./configure --with-python=/usr/local/bin/python2.7
make
make install

(参考了http://www.cnblogs.com/shadowturtle/archive/2012/11/25/2787690.html

配置 Apache

查看 Apache 的 moudle 目录(一般在/etc/httpd/moudles 下),发现其中多了一个 mod_wsgi.so 模块,说明安装成功。

然后打开 apache 的配置文件,一般在/etc/httpd/conf/conf.d 目录下,编辑加入以下代码(没有用虚拟主机)

1
2
3
4
5
6
7
8
#Rules for WSGI
WSGIScriptAlias /py /var/www/html/py/py.wsgi/ #脚本的路径
WSGIScriptReloading On #允许脚本改动之后自动重载
AddType text/html .py #应该是说在返回 Py 脚本的时候返回 html 标记
<Directory "/var/www/html/py/py/">
AllowOverride None
Require all granted
</Directory>

Apache 还可以配置成虚拟主机,这里采用 8080 端口调试(需要在防火墙打开 8080 端口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Listen 8080
<VirtualHost*:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/py
WSGIScriptAlias / /var/www/html/py/py.wsgi
WSGIScriptReloading On
<Directory "/var/www/html/py">
<Files py.wsgi>
Order deny,allow
Allow from all
</Files>
</Directory>
ErrorLog /var/www/html/py/error.log
LogLevel warn
</VirtualHost>

配置 WSGI

我的目录结构是这样的

1
2
3
4
5
6
7
8
9
10
|---py
|---py.wsgi
|---py
|---__init__.py
|---static
|----.(静态文件目录)
|---templates
|---.(模板目录)
|---venv
|---(虚拟环境文件)

其实现在有用的也只有 py.wsgi,编辑之

1
2
3
4
import sys
def application(environ,start_response):
start_response('200 OK',[('Content-Type','text/html')])
return "<h1>Hello Wsgi,Hello Flask</h1>"+sys.version

会输出 Hello Wsgi,Hello Flask 和 Python 的版本号 这时,WSGI 配置完成,可以从外部通过 Apache 访问 Python 搭建的网站

问题

不过,也出现了一些问题,就是如何让 WSGI 使用 Python3 来解析之后的文件。

本来以为是 Virtualenv 的问题,但是关闭之后,问题依旧。所以很可能是使用 Yum 安装时候导致的问题,这个问题留作以后解决。

Virtualenv 的简单使用方法

新建环境

1
2
cd xxx 目录
virtualenv test_env

默认情况下,虚拟环境会依赖系统环境中的 site packages,就是说系统中已经安装好的第三方 package 也会安装在虚拟环境中,如果不想依赖这些 package,那么可以加上参数 –no-site-packages。

启动环境

1
source ./bin/activate

退出环境

1
deactivate

次日更新

问题解决

后来查看 Apache 的 log 文件,发现是 WSGI 一直无法 import 其他文件,看来真的是因为我用 Yum 安装的 WSGI 有问题,解决方法如下: 用 Python2 的 pip 安装 WSGI

1
python2 pip install mod_wsgi

然后进入 WSGI 的目录

1
cd /usr/lib64/python2.7/site-packages/mod_wsgi

进入 server 文件夹,将 mod_wsgi-py27.so 复制到 Apache 的 modules 文件夹,替换原有的 WSGI

1
cp mod_wsgi-py27.so /etc/httpd/modules/mod_wsgi.so

操作成功。

接入 Flask 框架

还是按照配置 WSGI 时候的目录结构 在 py 目录下的init.py 中写入一个简单的测试网页

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello,Flask!"
if__name__ == "__main__":
app.run()

将 py.wsgi 文件内容改为

1
2
3
4
5
import sys
import os
sys.path.insert(0,"你的 py.wsgi 目录")
sys.path.insert(0,"你的__init__.py 目录")
from py import app as application(一定要有 as application)

然后去访问服务器,发现显示了”Hello,Flask”,大功告成!