/ 中存储网

配置Apache+mod_wsgi运行Python环境

2013-11-06 11:45:01 来源:kejihao
开始用Django做项目了,Django自带的服务器说是只能开发测试用,上线还是要配置Apache。

从来没用过Apache,配置wsgi的时候遇到了各种各样的问题。

1. 首先查看下自己Apache的配置,在terminal输入apachectl -V可以看到版本,安装目录等。os x 自带的Apache配置文件在private/etc/apache2/ 目录下;mod安装好都在/usr/libexec/apache2/ 目录下;log文件在/private/var/log/apache2/ 目录下。

2. 下载wsgi源文件:wsgi。下载完成后terminal进wsgi目录,./configure配置wsgi。配置完成make。在make的时候遇到报错,说是-bash: make: command not found. 这个原因是我升级了xcode, command line tools 需要重新安装下。 安装完command line tools继续make. 新的错误:env: /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain/usr/bin/cc: No such file or directory apxs:Error: Command failed with rc=65536

原因是因为安装了Mountain Lion系统后Xcode文件位置被动过了。建symlink可以解决:$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain

3. make 之后, sudo make install就完成安装了。之后可以查看mod目录里生成了mod_wsgi.so就说明安装好了。

4. 在httpd.conf里面加上LoadModule wsgi_module libexec/apache2/mod_wsgi.so。 重启apache, sudo apachectl restart。再去error_log里查看,可以看到Apache/2.2.22 (Unix) DAV/2 mod_wsgi/3.4 Python/2.7.2 mod_ssl/2.2.22 OpenSSL/0.9.8r configured -- resuming normal operations。 mod_wsgi成功load了。

5. 配置wsgi的document root.

WSGIScriptAlias /myapp /Applications/MAMP/htdocs/wsgi/myapp.wsgi

Order allow,deny

Allow from all

Alias后面第一个参数是url入口,后面一个参数就是本地文件入口。之后配置文件夹权限。就完成了。这里如果本地文件目录用的是users/xxxx下面的目录的话会有个权限的问题。Apache好像有admin group的权限,但是users/xxxx目录是staff group的权限。要么把users改成admin, 要么在配置文件中加

# User/Group: The name (or #number) of the user/group to run httpd as.

# It is usually good practice to create a dedicated user and group for

# running httpd, as with most system services.

#

User xxxx

Group staff

这样apache就会以staff的权限启动。

6. 进入http://127.0.0.1/myapp 就能看到hello world了。

7. 测试可以用这个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]

最后感谢下好基友cixining的帮忙。