Posso distribuire il mio sito Django su OS X Server?

1

Voglio eseguire il mio sito Web Django su OS X Server 3.2.1 in esecuzione su Mavericks.

Queste considerazioni più dettagliate derivano dalla mia domanda.

  1. Posso distribuire su OS X Server 3.2.1 senza interferire con l'affidabilità delle app di OS X Server?
  2. Posso utilizzare la GUI dell'app Server per installare nuovi siti e gestire quelli esistenti?
  3. Posso utilizzare Django come app Web che posso "legare" ad altri siti web come l'app web Python "hello world" di OS X Server?
  4. Posso usare diverse versioni Python e usare virtualenvs per gestire le versioni dei pacchetti?
  5. Posso utilizzare i socket di dominio UNIX per la comunicazione tra processi tra il server http di OS X Server e un server wsgi come è possibile tra Nginx e Gunicorn?
  6. Posso utilizzare Fabric per automatizzare la distribuzione di Django su OS X Server?
posta iainH 19.10.2014 - 02:45
fonte

1 risposta

0

per i problemi precedenti:

  1. Sì, puoi. Molto efficace Tieni presente che i tuoi siti Django non si integreranno nella GUI di Server App a meno che tu non ti limiti a Python 2.7; Apache mod_wsgi; nessun virtualenvs.
  2. Non se desideri eseguire il proxy su un server wsgi come Gunicorn, perché quando salvi il pannello del sito web, OS X Server disinfetterà alcune delle tue direttive Apache essenziali e perderai il controllo su come i tuoi file statici Django, ad esempio, sono serviti OS X Server ha in mente un particolare modello di esecuzione e configurazione e fa un buon lavoro di gestione di siti Web che si accordano con quel modello, ma al costo della flessibilità. So che le persone distribuiscono con successo Django usando il mod_wsgi di Apache, ma ciò comporta gravi limitazioni.
  3. Come in 2. La sezione proxies del plist per la tua app Web nella directory ../apache2/webapp di OS X Server è tutto-o-niente. per esempio. Non puoi includere ProxyPass /static/ ! nel posto giusto perché abbia effetto.
  4. Non con Apache mod_wsgi.
  5. Nessun. OS X Server 3.2.1 utilizza Apache 2.2. I proxy via UDS non sono stati inclusi in Apache fino a più tardi. (Forse potresti avere il proxy Apache su Nginx (tramite una porta TCP) e, a turno, passare a Gunicorn tramite il proprio UDS di ogni sito Django ... se pensavi che ci fosse un motivo valido.
  6. Sì.

L'approccio che ho preso:

  • Inserisci il file apache .conf dell'applicazione nella directory ../apache2/other di OS X Server in cui verrà lasciato solo dall'app Server.
  • Dimentica di provare a utilizzare la GUI del server e "legare" le app web ai siti tramite la sua finestra Impostazioni avanzate . Una bella idea ma ...
  • Usa virtualenv (wrapper) per configurare le diverse versioni di python e package per un approccio più a prova di futuro ... OS X Server 4 su Yosemite in arrivo!

Codice di esempio:

.conf per il server virtuale Django

Questo è adattato direttamente dal file che OS X Server genera dalla sua GUI con queste differenze principali:

  1. ProxyPreserveHost è disattivato per impostazione predefinita.

  2. ProxyPass /static/ ! impedisce l'ignoranza della direttiva Alias. Ho scoperto che, quando si includeva questa direttiva utilizzando l'app web consigliata da Apple, la sezione% plos includeFiles , le righe incluse erano nel posto sbagliato per ottenere l'effetto desiderato.

sed di SITENAME e 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 per il server wsgi di Gunicorn

sed del tuo SITENAME; REVERSED_SITENAME e 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>

Snippet dal .bash_exports del server OS X

Mostra i percorsi virtualenv specificati dalle variabili di ambiente 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

Snippet dal file di automazione Fabric fabfile.py

Mostra:

  1. I percorsi di destinazione: le directory in cui finiranno i file di configurazione;

  2. I comandi per attivare il sito Django nei passaggi finali della distribuzione

# 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')
    
risposta data 19.10.2014 - 02:45
fonte

Leggi altre domande sui tag