【问题标题】:How does one deploy a django application on OS X Server?如何在 OS X Server 上部署 django 应用程序?
【发布时间】:2012-09-02 05:23:01
【问题描述】:

如何在 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
  • Apache 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 已正确配置并且能够执行应用程序,并且我的设置有其他问题。

【问题讨论】:

    标签: django macos apache2 mod-wsgi


    【解决方案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 迁移。

    【讨论】:

    • 如果操作系统更新 mod_wsgi,您的 .so 文件将被覆盖。您应该将您的版本放在其他地方,并在 Apache 配置中更改 mod_wsgi 的 LoadModule 行。
    • 好点 @GrahamDumpleton ,每当您发现自己在复制负载模块时,这是一个危险信号。
    【解决方案2】:

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

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

    【讨论】:

    • 安装在/Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so
    • 你是对的,将 wsgi.py 重命名为 mysite.wsgi 调用了 mod_wsgi。我遇到了其他问题,这些问题通过在mysite.wsgi 中添加使用sys.path.append 的路径得到解决,如this answer 中所述。谢谢。
    【解决方案3】:

    两件事:

    1. 如果你想使用 WSGIScriptAlias 指令,你需要有 mod_wsgi apache 模块。我没有 OS X 服务器,但据我所知,山狮标准的 /usr/libexec/apache2 文件夹中不存在该模块。你必须从here 下载它。不知道命令行工具是否包含在 OS X 服务器中。我确实需要安装 X 代码才能将它们安装到标准版本上。好像有instruction on how to install it on macos x

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

    祝你好运

    【讨论】:

    • mod_wsgi 包可能不在 Mountain Lion 标准中,但我在发布之前收到的一份报告说它在 Mountain Lion 服务器中。虽然自发布以来尚未确认。
    • 模块存在于/Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so
    • 正如我的问题中所述,我在我的应用程序中使用了 Cocoa 绑定,并且在使用 Homebrew 使其工作时遇到了一些麻烦。因此,我宁愿避免它。
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多