6

如何在 OS X Server 2.0 上部署 Django 应用程序而不使用自制软件或与 OS X 10.8.1 附带的不同风格的 python?我在 Django 应用程序中使用 cocoa 绑定,但无法在我的桌面机器(运行 OS X 10.8.1)上使用自制软件;因此请求在系统安装的 Python 版本上部署应用程序。

我有以下 OS X Server 环境,已安装以下内容:

  • OS X 10.8.1
  • OS X 服务器 2.0
  • Python 2.7.2
  • 阿帕奇 2.2.22

Django 1.4.1 是使用以下命令安装的:

sudo easy_install django

我的第一次尝试是部署一个空网站,一旦成功,就部署一个真正的应用程序以用于生产。该项目是/Library/Server/Web/Data/WebApps/mysite/使用以下命令创建的

django-admin.py startproject mysite

我使用以下命令运行应用程序。它只是确认应用程序已启动并正在运行。这是标准的“它奏效了!” 首次创建项目时的页面。

python manage.py runserver 8080

然后我创建了一个/Library/Server/Web/Config/apache2/httpd_mysite.conf包含以下内容的文件:

WSGIScriptAlias /mysite /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py

我进一步创建了一个/Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plist包含以下内容的文件:

<?xml version="1.0" encoding="UTF-7"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>name</key>
        <string>com.example.mysite.wsgi</string>
        <key>displayName</key>
        <string>Python "My Site" app</string>
        <key>launchKeys</key>
        <array/>
        <key>proxies</key>
        <dict/>
        <key>installationIndicatorFilePath</key>
        <string>/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py</string>
        <key>includeFiles</key>
        <array>
                <string>/Library/Server/Web/Config/apache2/httpd_mysite.conf</string>
        </array>
        <key>requiredModuleNames</key>
        <array>
                <string>wsgi_module</string>
        </array>
</dict>
</plist>

该文件com.example.mysite.wsgi.plist改编自com.apple.webapp.wsgi.plisthttpd_mysite.conf改编自httpd_wsgi.conf. 当通过服务器管理器配置时,这两个文件都用于成功运行“独立”python 应用程序。

然后我使用服务器管理器创建了一个站点,确认我的应用程序在 Web 应用程序列表中。但是,当我访问http://example.com/mysite时,我收到 500 错误。日志包含以下条目(出于隐私原因,IP 地址更改为 1.2.3.4):

[Sat Sep 01 21:49:17 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Sat Sep 01 21:49:17 2012] [notice] Apache/2.2.22 (Unix) PHP/5.3.13 with Suhosin-Patch mod_wsgi/3.3 Python/2.7.2 mod_fastcgi/2.4.6 mod_ssl/2.2.22 OpenSSL/0.9.8r DAV/2 configured -- resuming normal operations
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] (8)Exec format error: exec of '/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py' failed
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] Premature end of script headers: wsgi.py

似乎不是 WSGI 模块正在处理请求,而是可以使用 FCGI 处理请求。但是,日志表明mod_wsgi/3.3已加载。

当我创建一个如下所示的标准 Python 应用程序时:

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]

并更新文件以指向/Library/Server/Web/Data/WebApps/helloworld.wsgi而不是/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py显示“Hello World”。因此,我假设 wsgi 已正确配置并且能够执行应用程序,并且我的设置有其他问题。

4

3 回答 3

1

我发现自己很难将我的 macports django 迁移到 Mountain Lion Server 10.8.2,出于某种原因,这里的答案帮助我记住了 mod_wsgi.so 的差异。

我用我的/opt/local/apache2/modules/mod_wsgi.so 覆盖了/Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so。

我希望完全删除 MacPorts apache2,但我认为我最好保留它。目前我仍然更喜欢 MacPorts Python,因为它更容易与数字密集型软件包保持同步。

是的,还要确保将 wsgi.py 更改为 wsgi.wsgi。

我将 httpd_wsgi.conf 复制到 httpd_mywsgi.conf;我将 django.wsgi 添加到 /Library/Server/Web/Data/WebApps。
在 /Library/Server/Web/Config/apache2/webapps 中,我复制了 com.apple.webapp.wsgi.plist。

看起来您选择了相同的 plist 模式。

但是,我仍在研究我的静态内容,我认为 mod_wsgi.so 发现可以帮助其他人从 MacPorts 迁移。

于 2012-11-01T05:11:27.933 回答
0

一些带有发行版的 Apache 配置将 .py 映射到 CGI 或 FASTCGI,这将与 mod_wsgi 冲突。这就是为什么 mod_wsgi 建议使用 .wsgi 扩展名的原因。因此,将“wsgi.py”重命名为“site.wsgi”,然后在 WSGIScriptAlias 中使用“site.wsgi”。

顺便说一句,您能否确认 Mountain Lion 服务器附带了一个预编译的 mod_wsgi.so。

于 2012-09-04T00:47:32.403 回答
-1

两件事情:

  1. 如果你想使用 WSGIScriptAlias 指令,你需要有 mod_wsgi apache 模块。我没有 OS X 服务器,但据我所知,山狮标准的 /usr/libexec/apache2 文件夹中不存在该模块。你必须从这里下载它。不知道命令行工具是否包含在 OS X 服务器中。我确实需要安装 X 代码才能将它们安装到标准版本上。似乎有一些关于如何在 macos x 上安装它的说明

  2. 看看Homebrew。这是向 Mac 添加额外软件的绝佳方式。你可以安装最新的 python、nginx 和 uwsgi。Nginx 和 uwsgi 是部署 django 应用程序的好方法。我发现它比 mod_wsgi 更灵活、更高效(第二点是非常主观的)。

祝你好运

于 2012-09-04T00:20:34.147 回答