en relación con las cuestiones anteriores:
- Sí se puede. De forma muy efectiva. Sólo ten en cuenta que tus sitios Django no se integrarán en la GUI de Server App a menos que te restrinjas a Python 2.7; Apache mod_wsgi; sin virtualenvs.
- No si deseas hacer un proxy a un servidor wsgi como Gunicorn, porque cuando guardes el panel del sitio web, OS X Server saneará algunas de tus directivas esenciales de Apache y perderás el control sobre cómo se sirven tus archivos estáticos de Django, por ejemplo. OS X Server tiene un modelo particular de ejecución y configuración en mente y hace un buen trabajo en la gestión de sitios web que concuerdan con ese modelo - pero a costa de la flexibilidad. Sé que la gente despliega con éxito Django usando el mod_wsgi de Apache, pero eso viene con severas limitaciones.
- Como en 2. El
proxies
del plist de su aplicación web en la sección de OS X Server ../apache2/webapp
es todo o nada. Por ejemplo, no se puede incluir un ProxyPass /static/ !
en el lugar adecuado para que tenga efecto.
- No con Apache mod_wsgi.
- No. OS X Server 3.2.1 utiliza Apache 2.2. Los proxies vía UDS no se incluyeron en Apache hasta más tarde. (Tal vez podría tener Apache proxy a Nginx (a través de un puerto TCP) y, a su vez, proxy a Gunicorn a través de cada UDS propio del sitio Django ... si usted pensó que había una razón de peso).
- Sí.
El enfoque que tomé:
- Ponga el Apache de su aplicación
.conf
en el archivo de OS X Server ../apache2/other
donde será dejada por la aplicación del servidor.
- Olvídese de intentar utilizar la interfaz gráfica de usuario del servidor y de "vincular" las aplicaciones web a los sitios a través de su Configuración avanzada ventana. Una buena idea, pero ...
- Utilice virtualenv(wrapper) para configurar las diferentes versiones de Python y de los paquetes para un enfoque más a prueba de futuro ... ¡OS X Server 4 en Yosemite se acerca!
Ejemplo de código:
.conf para el servidor virtual Django
Está adaptado directamente del archivo que genera OS X Server desde su GUI con estas diferencias principales:
-
ProxyPreserveHost
está desactivado por defecto.
-
ProxyPass /static/ !
evita que la directiva Alias sea ignorada. Encontré que, al incluir esta directiva utilizando el .plist de la aplicación web recomendado por Apple includeFiles
sección, las líneas incluidas estaban en el lugar equivocado para tener el efecto deseado.
sed
su SITENAME y PORT:
<VirtualHost *:80>
ServerName SITENAME
ServerAdmin mail@you.com
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 el servidor wsgi de Gunicorn
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 del servidor de OS X .bash_exports
Muestra las rutas de virtualenv especificadas por las variables de entorno de 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
Espectáculos:
-
Las rutas de destino - los directorios donde terminarán sus archivos de configuración;
-
Los comandos para activar el sitio Django en los pasos finales del despliegue
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')