resuelve los problemas anteriores:
- 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.
- 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.
- 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.
- No con Apache mod_wsgi.
- 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).
- 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:
-
ProxyPreserveHost
está desactivado de forma predeterminada.
-
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:
-
Las rutas de destino: los directorios donde terminarán los archivos de configuración;
-
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')