Sto implementando il mio primo tentativo di usare django + gunicorn + nginx.Come posso verificare se gunicorn funziona e comunicare con nginx?
- Ho django working (
curl -XGET http://127.0.0.0.1:8000
funziona correttamente se si esegue il server di sviluppo). - Ho nginx che funziona per contenuto statico (ad esempio, posso recuperare
http://example.com/static/my_pic.png
nel mio browser). - Non ricevo alcun contenuto wsgi dal mio sito Web e non sono riuscito a trovare una buona guida per la risoluzione dei problemi (funziona solo per tutti gli altri ?!). Comincio gunicorn utilizzando supervisore, che riferisce che è davvero in esecuzione:
(in guscio :)
supervisorctl status my_app
my_app RUNNING pid 1002, uptime 0:29:51
Ecco lo script boilerplate ho usato per avviarlo:
#!/bin/bash
#script variables
NAME="gunicorn_myapp" # Name of process
DJANGODIR=/webapps/www/my_project # Django project directory
SOCKFILE=/webapps/www/run/gunicorn.sock # communicte using this socket
USER=app_user # the user to run as
GROUP=webapps # the group to run as
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=my_project.settings # settings file
DJANGO_WSGI_MODULE=my_project.wsgi # WSGI module name
# Activate the virtual environment
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE
Ecco il file di configurazione nginx (condensato):
upstream my_server {
server unix:/webapps/www/run/gunicorn.sock fail_timeout=10s;
}
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
client_max_body_size 4G;
access_log /webapps/www/logs/nginx-access.log;
error_log /webapps/www/logs/nginx-error.log;
location /favicon.ico { access_log off; log_not_found off; }
location /static/ {
autoindex on;
alias /webapps/www/my_project/my_app/static/;
}
location /media/ {
autoindex on;
alias /webapps/www/my_project/my_app/media/;
}
location/{
proxy_pass http://my_server;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://example.com;
break;
}
}
location /robots.txt {
alias /webapps/www/my_project/my_app/static/robots.txt ;
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /webapps/www/my_project/my_app/static/;
}
}
Quindi: gunicorn è in esecuzione, nginx è in esecuzione ... quali test (e come?) dovrei eseguire per determinare se gunicorn sta facendo la roba wsgi correttamente (e se nginx sta inoltrando correttamente le suddette cose)?
Modifica: ho ridotto il problema alla comunicazione tra gunicorn e nginx tramite il socket unix. Se cambio $ SOCKFILE in modo che sia legato a 0.0.0.0:80
e fermi nginx, le pagine dell'app vengono pubblicate dal mio sito web. La cattiva notizia è che le stringhe del file socket sono esattamente le stesse tra i due file conf, quindi non so perché non stiano comunicando. Suppongo che questo significhi che nginx non sta recuperando e passando i dati correttamente attraverso?
Beh, ti dico vedendo se serve il vostro sito, che si dice non è così. Dov'è la parte della configurazione di nginx in cui viene indicata come proxy tramite il socket $ SOCKFILE? –
Mi dispiace Daniel, ho aggiunto il file di configurazione nginx (commenti rimossi). La voce proxy_pass è ora disponibile. Grazie enormemente per le tue risposte su SE - hanno aiutato a risolvere la maggior parte dei miei problemi di Django nel corso dell'ultimo mese. – Escher
Daniel, su suggerimento ho provato a eseguire il debug di ciò che accade con il socket. Ho modificato con più informazioni; Spero sia utile – Escher