¿Puedo implementar mi sitio de Django en OS X Server?

1

Quiero ejecutar mi sitio web de Django en OS X Server 3.2.1 ejecutándose en Mavericks.

Estas consideraciones más detalladas surgen de mi pregunta.

  1. ¿Puedo implementarlo en OS X Server 3.2.1 sin interferir con la confiabilidad de las aplicaciones propias de OS X Server?
  2. ¿Puedo usar la GUI de la aplicación del servidor para instalar nuevos sitios y administrar los existentes?
  3. ¿Puedo usar Django como una aplicación web que puedo "enlazar" con otros sitios web a la manera de la aplicación web "hola mundo" de OS X Server?
  4. ¿Puedo usar diferentes versiones de python y usar virtualesenvs para administrar versiones de paquetes?
  5. ¿Puedo usar UNIX Domain Sockets para la comunicación entre procesos entre el servidor http de OS X Server y un servidor wsgi como puede hacerlo entre Nginx y Gunicorn?
  6. ¿Puedo usar Fabric para automatizar la implementación de Django en OS X Server?
pregunta iainH 19.10.2014 - 02:45

1 respuesta

0

resuelve los problemas anteriores:

  1. Sí, puedes. Muy efectivamente. Solo tenga en cuenta que sus sitios Django no se integrarán en la GUI de la aplicación del servidor a menos que se limite a python 2.7; Apache mod_wsgi; no virtualenvs.
  2. No, si deseas usar un servidor wsgi como Gunicorn, porque cuando guardes el panel del sitio web, OS X Server desinfectará algunas de tus directivas Apache esenciales y perderás el control sobre cómo están los archivos estáticos de Django, por ejemplo, son servidos. OS X Server tiene en mente un modelo particular de ejecución y configuración y hace un buen trabajo en la administración de sitios web que concuerdan con ese modelo, pero a un costo de flexibilidad. Sé que la gente implementa Django con éxito utilizando mod_wsgi de Apache, pero eso viene con graves limitaciones.
  3. Como en 2. La sección proxies de la lista para su aplicación web en el directorio ../apache2/webapp de OS X Server es todo o nada. p.ej. No puedes incluir un ProxyPass /static/ ! en el lugar correcto para que tenga efecto.
  4. No con Apache mod_wsgi.
  5. no OS X Server 3.2.1 utiliza Apache 2.2. Los proxies a través de UDS no se incluyeron en Apache hasta más tarde. (Quizás podría tener un proxy Apache para Nginx (a través de un puerto TCP) y, a su vez, un proxy a Gunicorn a través de cada UDS del sitio de Django ... si pensara que había una razón convincente).
  6. Sí.

El enfoque que tomé:

  • Coloque el archivo Apache .conf de su aplicación en el directorio ../apache2/other de OS X Server, donde la aplicación Servidor la dejará sola.
  • Olvídese de intentar usar la GUI del servidor y las aplicaciones web de "enlace" a los sitios a través de la ventana Configuración avanzada . Una buena idea, pero ...
  • Use virtualenv (envoltorio) para configurar las diferentes versiones de python y paquetes para un enfoque más seguro para el futuro ... ¡OS X Server 4 en Yosemite se aproxima!

Código de ejemplo:

.conf para el servidor virtual Django

Esto se adapta directamente del archivo que OS X Server genera desde su GUI con estas diferencias principales:

  1. ProxyPreserveHost está desactivado de forma predeterminada.

  2. ProxyPass /static/ ! evita que la directiva Alias se ignore. Descubrí que al incluir esta directiva en la sección .plist includeFiles de la aplicación web recomendada por Apple, las líneas incluidas estaban en el lugar equivocado para lograr el efecto deseado.

sed su SITENAME y PORT:

<VirtualHost *:80>
        ServerName SITENAME
        ServerAdmin [email protected]
        DocumentRoot "/usr/local/python_projects/SITENAME"
        ErrorLog /var/log/apache2/error_log
        <IfModule mod_ssl.c>
                SSLEngine Off
                SSLCipherSuite "ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM"
                SSLProtocol -ALL +SSLv3 +TLSv1
                SSLProxyEngine On
                SSLProxyProtocol -ALL +SSLv3 +TLSv1
        </IfModule>
        <Directory "/usr/local/python_projects/SITENAME">
                Options All -Indexes -ExecCGI -Includes +MultiViews
                AllowOverride None
                <IfModule mod_dav.c>
                        DAV Off
                </IfModule>
        </Directory>
        ProxyPass         /static/ !
        Alias             /static/ /usr/local/python_projects/SITENAME/static/
        ProxyPass         /         http://localhost:PORT/
        ProxyPassReverse  /         http://localhost:PORT/
        ProxyPreserveHost On
</VirtualHost>

LaunchDaemon plist para Gunicorn wsgi server

sed su SITENAME; REVERSED_SITENAME y PORT:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
     <key>Label</key>
     <string>REVERSED_SITENAME</string>
     <key>ProgramArguments</key>
     <array>
          <string>/usr/local/virtualenvs/SITENAME/bin/gunicorn</string>
          <string>--bind=127.0.0.1:PORT</string>
          <string>--workers=2</string>
          <string>superlists.wsgi:application</string>
     </array>
     <key>RunAtLoad</key><true/>
     <key>WorkingDirectory</key><string>/usr/local/python_projects/SITENAME/source</string>
<!--      <key>StandardErrorPath</key><string>/var/log/gunicorn/REVERSED_SITENAME.error.log</string> -->     
     <key>KeepAlive</key><true/>
</dict>
</plist>

Fragmento de código del servidor OS X .bash_exports

Muestra las rutas de virtualenv especificadas por las variables de entorno virtualenvwrapper

export WORKON_HOME=/usr/local/virtualenvs
export PROJECT_HOME=/usr/local/python_projects
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

Fragmento del archivo de automatización de Fabric fabfile.py

Muestra:

  1. Las rutas de destino: los directorios donde terminarán los archivos de configuración;

  2. Los comandos para activar el sitio de Django en los pasos finales de implementación

# copy (and overwrite if necssary) configuration files to the LaunchDaemons and apache2/sitesdirectories

sudo('cp -f %s /Library/LaunchDaemons/%s.plist' % (gunicorn_config_file, reversed_site_name))
sudo('cp -f %s /Library/Server/Web/Config/apache2/other/%s.conf' % (apache2_config_file, site_name))

# Get the gunicorn wsgi server running on its unique TCP port 

sudo('launchctl unload -w /Library/LaunchDaemons/%s.plist' % (reversed_site_name,), warn_only=True)
sudo('launchctl load -w /Library/LaunchDaemons/%s.plist' % (reversed_site_name,))  

# Give us some assurance that the gunicorn port is open

sudo('lsof -i TCP:%s' % (port,))

# Get Apache to include the new website; talk to gunicorn; and make it available to he world!

sudo('apache2ctl graceful')
    
respondido por el iainH 19.10.2014 - 02:45

Lea otras preguntas en las etiquetas