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

Το uWSGI είναι ένας γρήγορος, αυτό-θεραπευόμενος και φιλικός προς τον developer και τον διαχειριστή application container server ο οποίος είναι γραμμένος αμιγώς σε C.

Δείτε επίσης

Τα εγχειρίδια του uWSGI παρέχουν ένα tutorial που καλύπτουν το Django, τον nginx και το uWSGI (ένας από τους πολλούς συνδυασμούς για να κάνετε deployment). Τα άρθρα, παρακάτω, εστιάζουν στο πως να ενσωματώσετε το Django με το uWSGI.

Προαπαιτούμενο: uWSGI

Το uWSGI wiki περιγράφει πολλά installation procedures. Μπορείτε να εγκαταστήσετε οποιαδήποτε uWSGI έκδοση επιθυμείτε χρησιμοποιώντας τον διαχειριστή πακέτων της Python, pip. Για παράδειγμα:

# Install current stable version.
$ pip install uwsgi

# Or install LTS (long term support).
$ pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

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

Μερικές διανομές, συμπεριλαμβανομένων της Debian και του Ubuntu, έρχονται με ξεπερασμένες εκδόσεις του uWSGI οι οποίες δεν συμμορφώνονται με την προδιαγραφή του WSGI. Εκδόσεις πριν την 1.2.6 δεν καλούν τη μέθοδο close στο response object μετά το πέρας χειρισμού ενός request. Σε αυτές τις περιπτώσεις το σήμα request_finished δεν στέλνεται. Αυτό μπορεί να έχει ως αποτέλεσμα αδρανείς συνδέσεις στη βάση δεδομένων και στους memcache servers.

Το μοντέλο του uWSGI

Το uWSGI λειτουργεί πάνω σε ένα μοντέλο πελάτη-εξυπηρετητή (client-server model). Ο δικός σας Web server (πχ nginx, Apache) επικοινωνεί με έναν django-uwsgi εργάτη (“worker” process) για να εξυπηρετήσει το δυναμικό περιεχόμενο. Δείτε στο background documentation του uWSGI για περισσότερες λεπτομέρειες.

Παραμετροποιώντας και ξεκινώντας τον uWSGI server για το Django

Το uWSGI υποστηρίζει πολλούς τρόπους για να παραμετροποιήσετε το process. Δείτε στο configuration documentation και στο examples του uWSGI.

Παρακάτω φαίνεται ένα παράδειγμα της εντολής uwsgi για να ξεκινήσετε έναν uWSGI server:

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

Τα παραπανω προϋποθέτουν ότι έχετε ένα project με το όνομα mysite και μέσα σε αυτό ένα module mysite/wsgi.py το οποίο περιέχει ένα WSGI application object. Αυτή θα είναι η διάταξη που θα έχετε αν τρέξετε την εντολή django-admin startproject mysite (χρησιμοποιώντας το δικό σας όνομα project στη θέση του mysite, φυσικά) με μια νεώτερη έκδοση του Django. Αν το αρχείο mysite/wsgi.py δεν υπάρχει, θα χρειαστεί να το δημιουργήσετε. Δείτε στο άρθρο Πως να ανεβάσετε το site σας χρησιμοποιώντας το WSGI για τα προεπιλεγμένα περιεχόμενα που θα πρέπει να βάλετε σε αυτό το αρχείο καθώς και άλλα που μπορείτε να προσθέσετε.

Οι επιλογές που αφορούν το Django είναι:

  • chdir: Το path στο φάκελο που χρειάζεται να είναι στο import path της Python – πχ ο φάκελος που περιέχει το project mysite.

  • module`: Το module WSGI που θα χρησιμοποιηθεί – πιθανόν το αρχείο mysite.wsgi που δημιουργεί η εντολή startproject.

  • env: Θα πρέπει να περιέχει τουλάχιστον τη μεταβλητή DJANGO_SETTINGS_MODULE.

  • home: Προαιρετικό path για το to virtualenv του project σας.

Παράδειγμα του configuration αρχείου ini:

[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log

Παράδειγμα χρήσης του configuration αρχείου ini:

uwsgi --ini uwsgi.ini

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

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

env = LANG=en_US.UTF-8

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

Ανατρέξτε στα εγχειρίδια του uWSGI σχετικά με managing the uWSGI process για πληροφορίες σχετικά με την εκκίνηση, παύση και επαναφόρτωση των uWSGI workers.

Back to Top