Internal Error - Django + NGinx + Gunicorn

65 views
Skip to first unread message

Fellipe Henrique

unread,
Apr 26, 2014, 11:38:19 AM4/26/14
to django...@googlegroups.com
Amigos, 

Vocês me ajudaram com o apache, mas estudando o nginx, vi que ele serve para o meu proposito, bem melhor que o apache. Então estou configurando o nginx para trabalhar com o django.

Consegui fazer ele funcionar e chegar no aplicativo django, porem está dando o Internal Error, do Debug = False..

Já coloquei tudo quanto é coisa no ALLOWED_HOSTS, até ALLOWED_HOSTS = ['*']

Nada de funcionar.

Aqui está meu script que inicia o gunicorn: https://gist.github.com/fellipeh/11323127
No meu Settings eu coloquei:

DEBUG = True

ALLOWED_HOSTS = ['*']
INTERNAL_IPS = ['127.0.0.1', '179.188.1.51']

STATIC_ROOT = '/var/django/dig/static'

O que pode ser que está errado? Precisam de mais algum arquivo para tentar ver o problema?

Obrigado a todos.

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash

Fabio C. Barrionuevo da Luz

unread,
Apr 26, 2014, 11:47:23 AM4/26/14
to django...@googlegroups.com


--
Você recebeu essa mensagem porque está inscrito no grupo quot;Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio C. Barrionuevo da Luz
Acadêmico de Sistemas de Informação na Faculdade Católica do Tocantins - FACTO
Palmas - Tocantins - Brasil - América do Sul

Tito Gonzales

unread,
Apr 27, 2014, 3:20:29 AM4/27/14
to django...@googlegroups.com
Tem que debugar aos poucos

1- rode o gunicorn diretamente
$ gunicorn SEUPROJETO.wsgi:application -b 127.0.0.1:5000

Deu erro, então é alguma configuração da settings.
Passou, vai pro supervisor, esqueça seu script bash por enquanto, chame o gunicorn diretamente pelo supervisor command.

/etc/supervisor/supervisord.conf
[program:nome_do_projeto]
command=/caminho/para/seu/projeto/bin/python /caminho/para/seu/projeto/manage.py run_gunicorn -b 127.0.0.1:8000
directory=/caminho/para/seu/projeto
user=usuario
autostart=True
autorestart=True
log_stderr=True
logfile=/var/log/supervisor/seu_projeto.log

OBS, run_gunicorn se tiver ele no installed apps, ou gunicorn SEUPROJETO.wsgi:application como havia testado anteriormente.

Reinicie o supervisor, isso vai depender de sua distro e versão, mas normalmente

$ sudo service supervisor restart

Deu erro
veja em /var/log/supervisor/seu_projeto.log 
conforme sua configuração em supervisord.conf

Passou, agora é nginx, deu erro coloque sua conf do nginx no gist e mande pra cá.

Fellipe Henrique

unread,
Apr 27, 2014, 7:12:58 AM4/27/14
to django...@googlegroups.com
Amigos,

Testei um a um..

- Rodando o gunicorn diretamente funcionou, e vi o site no browser.. passando a porta.
- Coloquei no supervisor, e mandei listar, e está dando RUNNING, e nenhum erro no log e no log deu o seguinte:
Starting dig as webapps
2014-04-27 07:49:17 [1308] [INFO] Starting gunicorn 18.0
2014-04-27 07:49:17 [1308] [DEBUG] Arbiter booted
2014-04-27 07:49:17 [1308] [INFO] Listening at: unix:/var/django/run/dig_gunicorn.sock (1308)
2014-04-27 07:49:17 [1308] [INFO] Using worker: sync
2014-04-27 07:49:17 [1315] [INFO] Booting worker with pid: 1315
2014-04-27 07:49:17 [1316] [INFO] Booting worker with pid: 1316
2014-04-27 07:49:17 [1317] [INFO] Booting worker with pid: 1317

Ao que parece o supervisor funcionou...não deu nenhum erro.

Então sobrou o nginx.. parece que ele é o causador do problema.


O mais estranho.. rodando pelo gunicorn puro, eu consigo ver a pagina (sem usar o unix sock, usando a porta) mas pelo nginx, dei um restart no servidor e parou de fornecer a pagina.. então tudo está levando a crer que o problema é no nginx. Mas o pior é que, não gera log de erro! 

Quando dou um service nginx restart, ele não mostra os normais: stop e start...



T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash


Jonathan Querubkna

unread,
Apr 27, 2014, 7:28:25 AM4/27/14
to django...@googlegroups.com
Eu tambem nao consigo levantar o nginx na DO. Ate o gunicorn fica tudo tranquilo usando a porta. Mas ai tentando pelo nginx, da internal error

Jonathan
Diretor de Tecnologia

Sent from my iPhone

Jonathan Querubkna

unread,
Apr 27, 2014, 7:29:20 AM4/27/14
to django...@googlegroups.com
Fora que fiz um droplet do zero e fiz tudo exatamente como no tutorial deles pra testar se nao era algo do meu lado. E tive o mesmo resultado


Jonathan
Diretor de Tecnologia

Sent from my iPhone

On Apr 27, 2014, at 8:12, Fellipe Henrique <fell...@gmail.com> wrote:

Fellipe Henrique

unread,
Apr 27, 2014, 7:29:59 AM4/27/14
to django...@googlegroups.com
No meu caso, o server é meu mesmo.. não estou usando na DO.

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash


Fellipe Henrique

unread,
Apr 27, 2014, 11:22:44 AM4/27/14
to django...@googlegroups.com
Amigos, consegui!!!

O problema era justamente o nginx..

Minha configuração ficou assim: https://gist.github.com/fellipeh/11348313

Agora, minha outra pergunta seria, essa minha config, serve pra sub-domains? pois irei precisar disso.. seria só trocar o "server" no config?

[]s

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash


Tito Gonzales

unread,
Apr 27, 2014, 11:55:03 AM4/27/14
to django...@googlegroups.com
Legal, se funcionou blz, o mais tradicional seria fazer o upstream para localhost apontando para a porta onde o supervisor segura o gunicorn. Inclusive você pode fazer um balanceamento de carga ex.

upstream dig_app_server {
}

Claro que o supervisor tem que levantar o gunicorn para as respectivas portas.

Sobre o subdomínio, sim, seu server recebe a solicitação de um subdomínio específico através do nginx,serve os statics e manda para o gunicorn servir a aplicação. Na sua conf irá servir teste.com.br e www.teste.com.br, vc poderá criar outra config para meusub.teste.com.br para outra aplicação etc...

Felipe, confesso que não entendi se o seu nginx está servindo os estáticos ou o pŕoprio gunicorn, pois nunca vi esse if request.filename, eu normalmente faço o nginx servir os estáticos colocando location /static/ como você fez mas o proxy_pass diretamente sem if.

Problemas com DigitalOcean, veja o erro e coloquem aqui, existem algumas sutilizas lá. entre elas colocar os parâmetros no nginx
  types_hash_max_size 2048;
  server_names_hash_bucket_size 64; 

Fellipe Henrique

unread,
Apr 27, 2014, 2:03:47 PM4/27/14
to django...@googlegroups.com

Em 27 de abril de 2014 12:55, Tito Gonzales <produtoram...@gmail.com> escreveu:
Felipe, confesso que não entendi se o seu nginx está servindo os estáticos ou o pŕoprio gunicorn, pois nunca vi esse if request.filename, eu normalmente faço o nginx servir os estáticos colocando location /static/ como você fez mas o proxy_pass diretamente sem if.

Entendi. Peguei esse código na net, por isso coloquei ele.

Existe uma maneira de saber, e ter certeza de quem está servindo os arquivos static ?

Tito Gonzales

unread,
Apr 28, 2014, 5:44:28 PM4/28/14
to django...@googlegroups.com
Agora que eu vi, você está usando UWSGI para o proxy reverso

location / {
include uwsgi_params;
uwsgi_pass unix:/var/django/run/digsoft_gunicorn.sock fail_timeout=0;

depois faz novamente o proxy reverso

if (!-f $request_filename) {
break;
}


Faz o seguinte, dê uma atualizada em sua conf. vai aqui uma receita mais atual e entendível.

upstream dig_app_server{
    server 127.0.0.1:9000;
}

server {
    listen 80;
    listen [::]:80 ipv6only=on default_server;

    server_name  teste.com.br www.teste.com.br;
    client_max_body_size 50M;

    access_log /var/django/logs/digsoft-access.log;
error_log /var/django/logs/digsoft-error.log;

    location ^~ /static/ {
        root /var/django/digsoft;
        if ($query_string) {
            expires max;
        }
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://dig_app_server;
    }
}


Atento a essas linhas.
server 127.0.0.1:9000; colquei 9000 como exemplo, tem que ser a porta que roda o gunicorn configurado no supervisor.
root /var/django/digsoft; Usar root no lugar de alias é o recomendado pelos caras do Nginx. Estou considerando que seus estáticos estão em /var/django/digsoft/static. Veja a sutiliza de em root não ter o static no final diferentemente o alias, isso atrapalha muita gente.
access_log /var/django/logs/digsoft-access.log; olhe aqui para debugar e ver se está tudo ok
error_log /var/django/logs/digsoft-error.log; olhe aqui para debugar e ver se está tudo ok

e principalmente, não copie e cole esse código pois pode dar problema de formatação, tente escrevê-lo pois assim você entenderá melhor pra que serve da linha da configuração.
Reply all
Reply to author
Forward
0 new messages