Como entender erros internos aleatórios 500 no Nginx?

2

Nosso servidor está exibindo muitas 500 páginas de erro internas para solicitações aleatórias. Sabemos que o aplicativo está funcionando porque nosso código é testado na unidade. A configuração do servidor é Nginx com Unicorn executando um único aplicativo Rails em um Ubuntu 10.4 LTS.

Até onde podemos dizer que as solicitações falharam antes de serem passadas para o Unicorn porque não há entradas de log no arquivo de log do Unicorn ou no Airbrake (outro serviço de log que estamos usando), mas o arquivo de log do Nginx mostra o 500 entradas de status. O servidor está sob carga normal, por isso não está ficando sem RAM nem nada.

O arquivo Nginx error.log não está nos dando nada de útil. Não há entradas que sugiram problemas com arquivos ou recursos.

Como devo proceder para encontrar o problema?

Obrigado

Aqui está a nossa configuração do nginx para o site:

# This is the socket that unicorn listens to
upstream unicorn {
        server unix:/tmp/unicorn.sock;
}

server {
  listen 80;
  client_max_body_size 10m;
  server_name oursite.com;
  root /var/www/current/public;
  access_log  /var/log/nginx/access.log;
  error_page 500 502 503 504 /var/www/shared/500.html;

  if ($http_user_agent ~* (majestic12|easou|Sogou|baidu|ahrefs) ) {
    return 403;
  }

  location / {
#    auth_basic "Restricted";
#    auth_basic_user_file /var/www/shared/.htpasswd;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_max_temp_file_size 0;

    if (-f $request_filename) {
      break;
    }
    if (-f $document_root/system/maintenance.html) {
      rewrite  ^(.*)$  /system/maintenance.html last;
      break;
    }
    if (-f $request_filename/index.html) {
      rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename.html) {
      rewrite (.*) $1.html break;
    }

   if (!-f $request_filename) {
      proxy_pass http://unicorn;
      break;
    }
  }
}
    
por Roman 04.03.2013 / 01:20

1 resposta

1

Se você não tem nada em logs de erro de trilhos, provavelmente é o erro HTTP 503 (backend indisponível) ou 504 (tempo limite de backend). O erro exato e a causa estarão no log de erros do nginx. Ambos os erros ocorrem porque o unicórnio não pode atender a todas as solicitações HTTP.

Você pode fazer algumas coisas:

  • aumenta o worker_processes em unicorn.rb
  • aumenta proxy_read_timeout em nginx.conf
  • adicione o segundo servidor de unicórnio e balance a carga entre dois adicionando-o no unicórnio upstream
por 04.03.2013 / 08:56