Πως να χρησιμοποιήσετε το Django με τον Apache και το mod_wsgi

Το να ανεβάσετε το Django site σας (deploying) στην παραγωγή (production) χρησιμοποιώντας τον Apache Web server και το mod_wsgi είναι μια δοκιμασμένη και πετυχημένη μέθοδος.

Το mod_wsgi είναι ένα Apache module το οποίο μπορεί να φιλοξενήσει κάθε Python WSGI εφαρμογή, συμπεριλαμβανομένου και του Django. Το Django θα δουλέψει με κάθε έκδοση του Apache που υποστηρίζει το mod_wsgi.

Το official mod_wsgi documentation είναι φανταστικό. Είναι η πηγή για όλες τις λεπτομέρειες σχετικά με τη χρήση του mod_wsgi. Το πιο πιθανό είναι να ξεκινήσετε με το installation and configuration documentation.

Βασική παραμετροποίηση

Αφού εγκαταστήσετε και ενεργοποιήσετε το mod_wsgi, επεξεργαστείτε το αρχείο httpd.conf του Apache Web server και προσθέστε τα ακόλουθα. Αν χρησιμοποιείτε κάποια έκδοση του Apache παλαιότερη της 2.4, αντικαταστήστε το Require all granted με το Allow from all και επίσης προσθέστε τη γραμμή Order deny,allow από πάνω.

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Η πρώτη παράμετρος στη γραμμή του WSGIScriptAlias είναι το βασικό URL path που θέλετε να εξυπηρετηθεί η εφαρμογή σας (η κάθετος, /, υποδεικνύει το root url) και η δεύτερη είναι η τοποθεσία που βρίσκεται το “WSGI file” – δείτε παρακάτω – στο σύστημα σας, συνήθως μέσα στο φάκελο του project σας (mysite, σε αυτό το παράδειγμα). Αυτό λέει στον Apache να εξυπηρετήσει κάθε request κάτω από αυτό το url (αν κατέχετε το url με το όνομα πχ www.mysite.com τότε θα εξυπηρετηθούν όλα τα urls που ξεκινούν με αυτό το όνομα) χρησιμοποιώντας την WSGI εφαρμογή η οποία ορίζεται σε αυτό το αρχείο (wsgi.py).

Αν εγκαταστήσετε τα Python dependencies του project σας μέσα σε ένα virtualenv, τότε προσθέστε το μονοπάτι (path) του virtualenv χρησιμοποιώντας το WSGIPythonHome. Δείτε περισσότερα στον οδηγό mod_wsgi virtualenv guide για περισσότερες πληροφορίες.

Η γραμμή WSGIPythonPath βεβαιώνει ότι το project σας θα είναι διαθέσιμο για να γίνει import στο Python path. Με άλλα λόγια, ότι το import mysite δουλεύει.

Το κομμάτι του <Directory> απλώς βεβαιώνει ότι ο Apache μπορεί να έχει πρόσβαση στο αρχείο σας wsgi.py.

Επόμενο βήμα είναι να σιγουρευτούμε ότι υπάρχει το αρχείο wsgi.py με το WSGI application object. Από την έκδοση του Django 1.4 και μετά, η εντολή startproject θα δημιουργήσει ένα τέτοιο αρχείο. Αν όχι, θα χρειαστεί να το δημιουργήσετε εσείς. Δείτε στο εγχειρίδιο του WSGI για τα προεπιλεγμένα περιεχόμενα που μπορείτε να βάλτε σε αυτό το αρχείο καθώς και άλλα πράγματα που μπορείτε να προσθέσετε.

Προειδοποίηση

Αν μια mod_wsgi process τρέχει πολλά Django sites, τότε όλα τα sites θα χρησιμοποιήσουν τις ρυθμίσεις του Django της εφαρμογής που θα τύχει να τρέξει πρώτη. Αυτό το πρόβλημα μπορεί να λυθεί αλλάζοντας το:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

μέσα στο αρχείο wsgi.py, με το:

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

ή χρησιμοποιώντας το mod_wsgi daemon mode και βεβαιώνοντας ότι κάθε site τρέχει σε ένα δικό του daemon process.

Διορθώνοντας το σφάλμα UnicodeEncodeError για uploads αρχείων

Αν λαμβάνετε το σφάλμα UnicodeEncodeError όταν ανεβάζετε αρχεία που τα ονόματα τους περιέχουν χαρακτήρες που δεν ανήκουν στον ASCII κώδικα (όπως είναι οι ελληνικοί χαρακτήρες), σιγουρευτείτε ότι ο Apache είναι ρυθμισμένος να δέχεται ονόματα αρχείων με χαρακτήρες που δεν είναι ASCII:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

Ένα συνηθισμένο μέρος για να βάλετε τα άνωθεν είναι το /etc/apache2/envvars.

Δείτε στην ενότητα Files του Unicode οδηγού για λεπτομέρειες.

Χρησιμοποιώντας το mod_wsgi daemon mode

Η λειτουργία daemon (“daemon mode”) είναι η προτεινόμενη λειτουργία για να τρέχετε το mod_wsgi (σε πλατφόρμες εκτός Windows). Για να δημιουργήσετε το απαραίτητο daemon process group και να εξουσιοδοτήσετε το Django instance να το τρέξει, θα πρέπει να προσθέσετε τα κατάλληλα directives WSGIDaemonProcess και WSGIProcessGroup. Αν χρησιμοποιείτε την παραπάνω ρύθμιση με το daemon mode δεν θα μπορείτε να χρησιμοποιήσετε το WSGIPythonPath. Αντ’ αυτού θα πρέπει να χρησιμοποιήσετε την επιλογή python-path μέσα στο WSGIDaemonProcess. Για παράδειγμα:

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

Αν θέλετε να εξυπηρετήσετε το project σας σε κάποιον υποφάκελο (πχ στη διεύθυνση https://example.com/mysite), μπορείτε να προσθέσετε το WSGIScriptAlias στην παραπάνω παραμετροποίηση:

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

Δείτε το επίσημο εγχειρίδιο του mod_wsgi για περισσότερες λεπτομέρειες στην παραμετροποίηση του daemon mode.

Εξυπηρετώντας αρχεία

Το Django δεν εξυπηρετεί το ίδιο, αρχεία. Αυτό το αφήνει στον Web server τον οποίο θα διαλέξετε εσείς.

Προτείνουμε να διαλέξετε έναν διαφορετικό Web server – πχ κάποιον ο οποίος δεν τρέχει ήδη Django – για να εξυπηρετήσετε τα media files. Παρακάτω φαίνονται μερικές καλές επιλογές:

Αν, παρόλ’ αυτά, δεν έχετε άλλη επιλογή παρά να εξυπηρετήσετε τα media files στον ίδιο Apache VirtualHost που τρέχει και το Django, μπορείτε να ρυθμίσετε τον Apache να εξυπηρετήσει μερικά URLs ως static media και άλλα χρησιμοποιώντας το mod_wsgi interface στο Django.

Αυτό το παράδειγμα ρυθμίζει το Django στο site root, αλλά εξυπηρετεί τα αρχεία robots.txt, favicon.ico και οτιδήποτε μέσα στα URLs /static/ και /media/ ως ένα static file (πχ JavaScript, CSS, fonts αρχείο κλπ). Όλα τα άλλα URLs θα εξυπηρετηθούν χρησιμοποιώντας το mod_wsgi:

Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Αν χρησιμοποιείτε κάποια παλαιότερη έκδοση του Apache από 2.4, αντικαταστήστε το Require all granted με το Allow from all και, επίσης, προσθέστε τη γραμμή Order deny,allow από πάνω.

Εξυπηρετώντας τα αρχεία του admin

Όταν η εφαρμογή django.contrib.staticfiles είναι μέσα στα INSTALLED_APPS, ο Django development server αυτόματα εξυπηρετεί τα static files της εφαρμογής admin (και κάθε άλλης εγκατεστημένης εφαρμογής). Αυτό, ωστόσο, δεν ισχύει ότι χρησιμοποιείτε κάποια άλλη διάταξη server. Είστε υπεύθυνοι για να ρυθμίσετε τον Apache ή οποιονδήποτε άλλο Web server χρησιμοποιείτε, για να εξυπηρετήσετε τα αρχεία για το site του admin.

Τα αρχεία του admin βρίσκονται στην τοποθεσία django/contrib/admin/static/admin της Django διανομής.

Συνιστούμε θερμά να χρησιμοποιείτε την εφαρμογή django.contrib.staticfiles για να διαχειριστείτε τα αρχεία του admin (μαζί με κάποιον Web server όπως περιγράφηκε στην προηγούμενη ενότητα. Αυτό σημαίνει ότι χρησιμοποιείτε την διαχειριστική εντολή collectstatic για να συγκεντρώσετε τα static files στο φάκελο in STATIC_ROOT και κατόπιν να ρυθμίσετε τον Web server σας να εξυπηρετεί το φάκελο STATIC_ROOT στη διεύθυνση STATIC_URL), αλλά αν δεν το κάνετε, παρακάτω φαίνονται τρεις διαφορετικές προσεγγίσεις του θέματος:

  1. Δημιουργήστε ένα symbolic link στα static files του admin από το document root σας (αυτό ίσως απαιτήσει να χρησιμοποιήσετε το +FollowSymLinks στη ρύθμιση του Apache).

  2. Χρησιμοποιήστε ένα directive Alias, όπως περιγράφηκε παραπάνω, για να κάνετε alias το κατάλληλο URL (πιθανόν το STATIC_URL + admin/) με την ακριβή τοποθεσία των αρχείων του admin.

  3. Αντιγράψτε τα static files του admin ούτως ώστε να υπάρχουν μέσα στο document root του Apache σας.

Πιστοποίηση της βάσης δεδομένων ενός Django χρήστη μέσω Apache

Το Django παρέχει έναν handler που επιτρέπει στον Apache να πιστοποιεί τους χρήστες απ’ ευθείας μέσω το σύστημα πιστοποίησης του Django. Δείτε περισσότερα στο εγχειρίδιο της πιστοποίησης του mod_wsgi.

Back to Top