2012-09-02 9 views
6

¿Cómo se implementaría una aplicación Django en OS X Server 2.0 sin usar homebrew o un sabor diferente de python que el que se incluye con OS X 10.8.1? Estoy usando los enlaces de cacao en una aplicación de Django y tuve problemas para hacer que funcione con homebrew en mi máquina de escritorio (ejecutando OS X 10.8.1); de ahí la solicitud para implementar la aplicación en la versión instalada del sistema de Python.¿Cómo se implementa una aplicación django en OS X Server?

I tienen el siguiente entorno OS X Server, con la siguiente ya instalado:

  • OS X 10.8.1
  • OS X Server 2.0
  • Python 2.7.2
  • Apache 2.2. 22

Django 1.4.1 se instaló utilizando el siguiente comando:

sudo easy_install django 

Mi primer intento es implementar un sitio web vacío, y una vez que tiene éxito, implementar una aplicación real para usar en producción. El proyecto fue creado el /Library/Server/Web/Data/WebApps/mysite/ con el siguiente comando

django-admin.py startproject mysite 

me encontré con la aplicación mediante el siguiente comando. Simplemente confirmó que la aplicación estaba en funcionamiento. Es el estándar "¡funcionó!" página cuando creó por primera vez un proyecto.

python manage.py runserver 8080 

entonces creado un archivo de /Library/Server/Web/Config/apache2/httpd_mysite.conf con el siguiente contenido:

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

creé además un archivo de /Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plist con el siguiente contenido:

<?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> 

El archivo com.example.mysite.wsgi.plist fue adaptado de com.apple.webapp.wsgi.plist y httpd_mysite.conf adaptado de httpd_wsgi.conf. Ambos archivos se utilizan para ejecutar correctamente la aplicación python "independiente" cuando se configura a través del administrador del servidor.

Luego creé un sitio con el administrador del servidor, confirmé que mi aplicación estaba en la lista de aplicaciones web. Sin embargo, cuando visito http://example.com/mysite obtengo un error de 500. Los registros tiene las siguientes entradas (direcciones IP cambiado a 1.2.3.4 por razones de privacidad):

[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 

No parece que el módulo WSGI es el manejo de la solicitud, pero en su lugar, la solicitud puede ser procesada utilizando FCGI . Sin embargo, el registro indica que se cargó mod_wsgi/3.3.

Cuando creé una aplicación estándar de Python que se ve de la siguiente manera:

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] 

y actualizar los archivos para que apunte a /Library/Server/Web/Data/WebApps/helloworld.wsgi en lugar de /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py continuación, se muestra "Hello World". Por lo tanto, supongo que wsgi está configurado correctamente y es capaz de ejecutar aplicaciones y que algo más está mal con mi configuración.

Respuesta

0

Algunas configuraciones de Apache con distribuciones mapa .py a cualquiera de CGI o FastCGI y esto va a entrar en conflicto con mod_wsgi. Esta es la razón por la cual mod_wsgi recomienda usar una extensión .wsgi. Por lo tanto, cambie el nombre 'wsgi.py' por 'site.wsgi' y luego use 'site.wsgi' en WSGIScriptAlias.

BTW, puede confirmar que hay un mod_wsgi.com precompilado enviado con el servidor de Mountain Lion.

+0

Se instala en '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

Has acertado, renombrando' wsgi.py' a 'mysite.wsgi' invocado' mod_wsgi'. Me encontré con otros problemas que se resolvió agregando las rutas usando 'sys.path.append' en' mysite.wsgi' como se describe en [esta respuesta] (http: // stackoverflow.com/questions/2587251/configuration-problems-with-django-and-mod-wsgi). Gracias. – bloudraak

-1

dos cosas:

  1. Si desea utilizar el WSGIScriptAlias ​​Directiva sobre usted necesita tener el módulo de Apache mod_wsgi. No tengo el servidor OS X pero, por lo que puedo ver, el módulo no existe en la carpeta/usr/libexec/apache2 en el estándar del león de montaña. Tendrás que descargarlo desde here. No sé si las herramientas de línea de comandos están incluidas en el servidor OS X. Necesito instalar el código X para obtenerlos en la versión estándar. Parece que hay algunos instruction on how to install it on macos x

  2. Eche un vistazo a Homebrew. Esta es una gran manera de agregar software adicional al mac. En un giro, podría instalar la última versión de python, nginx y uwsgi. Nginx y uwsgi es una excelente manera de implementar aplicaciones django. Lo encuentro más flexible y eficiente que mod_wsgi (este segundo punto es muy subjetivo).

Buena suerte

+0

El paquete mod_wsgi puede no estar en el estándar Mountain Lion, pero un informe que tenía antes de su lanzamiento decía que estaba en el servidor de Mountain Lion. No he tenido confirmación de eso aún desde que fue lanzado. –

+0

El módulo existe en '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

Como se describe en mi pregunta, utilizo los enlaces Cocoa en mi aplicación y tuve algunos problemas para conseguirlo trabajo usando Homebrew. Por lo tanto, preferiría evitarlo. – bloudraak

1

Me encontré luchando para migrar mi macports django a Mountain Lion Server 10.8.2, y por alguna razón las respuestas aquí me ayudaron a recordar las diferencias de mod_wsgi.so.

Sobreescribí las /Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so con mi /opt/local/apache2/modules/mod_wsgi.so.

Tenía la esperanza de eliminar completamente el MacPorts apache2, pero creo que será mejor que lo mantenga. Todavía prefiero MacPorts Python en este momento, ya que es más fácil mantenerse al día con los paquetes numéricamente intensivos.

Sí, también asegúrese de cambiar ese wsgi.py a wsgi.wsgi.

He copiado httpd_wsgi.conf a httpd_mywsgi.conf; Agregué mi django.wsgi a/Library/Server/Web/Data/WebApps.
En/Library/Server/Web/Config/apache2/webapps, copié el com.apple.webapp.wsgi.plist.

Parece que eligió el mismo patrón plist.

Todavía estoy trabajando en mi contenido estático, sin embargo, pensé que el descubrimiento de mod_wsgi.so podría ayudar a otra persona a migrar desde MacPorts.

+1

Su archivo .so quedará anulado en una actualización del sistema operativo si actualiza mod_wsgi. Deberías haber puesto tu versión en otro lugar y haber cambiado la línea LoadModule para mod_wsgi en la configuración de Apache. –

+0

Buen punto @GrahamDumpleton, y es una señal de alerta cada vez que se encuentre copiando sobre módulos de carga. – zerocog

Cuestiones relacionadas