nginx server over https usando todos os manipuladores de arquivos disponíveis (upd: loop infinito?)

1

Então, eu tenho um servidor nginx que está trabalhando sobre https com o Sinatra. Quando tento baixar um arquivo jnlp em uma configuração que funciona bem sobre Mongrel e http (no s), o servidor nginx falha em exibir o arquivo com um erro 504. A verificação subseqüente dos logs indica que esse erro é devido ao estouro do número disponível de identificadores de arquivos, ou seja, "24: muitos arquivos abertos". Correndo

sudo lsof -p <nginx worker pid>

me faz uma lista enorme de arquivos, todos parecidos com:

nginx   1771 nobody   11u     IPv4           10867997         0t0      TCP localhost:44704->localhost:https (ESTABLISHED)
nginx   1771 nobody   12u     IPv4           10868113         0t0      TCP localhost:https->localhost:44704 (ESTABLISHED)
nginx   1771 nobody   13u     IPv4           10868114         0t0      TCP localhost:44705->localhost:https (ESTABLISHED)
nginx   1771 nobody   14u     IPv4           10868191         0t0      TCP localhost:https->localhost:44705 (ESTABLISHED)
nginx   1771 nobody   15u     IPv4           10868192         0t0      TCP localhost:44706->localhost:https (ESTABLISHED)
nginx   1771 nobody   16u     IPv4           10868255         0t0      TCP localhost:https->localhost:44706 (ESTABLISHED)
nginx   1771 nobody   17u     IPv4           10868256         0t0      TCP localhost:44707->localhost:https (ESTABLISHED)
nginx   1771 nobody   18u     IPv4           10868330         0t0      TCP localhost:https->localhost:44707 (ESTABLISHED)
nginx   1771 nobody   19u     IPv4           10868331         0t0      TCP localhost:44708->localhost:https (ESTABLISHED)
nginx   1771 nobody   20u     IPv4           10868434         0t0      TCP localhost:https->localhost:44708 (ESTABLISHED)

Aumentar o número de arquivos que podem ser abertos não ajuda, porque o nginx simplesmente passa desse limite. E não é de admirar, parece que está em algum tipo de loop para puxar todos os arquivos disponíveis.

Alguma ideia do que está acontecendo e como corrigi-lo?

EDITAR: nginx 0.7.63, ubuntu linux, sinatra 1.0

EDIT 2: Este é o código incorreto. É sinatra servindo jnlp, que eu finalmente descobri:

get '/uploader' do
  #read in the launch.jnlp file                                                               
  theJNLP = ""
  File.open("/launch.jnlp", "r+") do |file|
    while theTemp = file.gets
      theJNLP = theJNLP + theTemp
    end
  end                                                                    
  content_type :jnlp
  theJNLP
end

Se eu servir isso com Sinatra via Mongrel e http, tudo funciona bem. Se eu servir isso com Sinatra e nginx via https, recebo o erro acima. Todas as outras partes do site parecem ser equivalentes.

EDIT: Desde então, atualizei para o passageiro 2.2.14, ruby 1.9.1, nginx 0.8.40, openssl 1.0.0a e nenhuma alteração.

EDITAR: O culpado parece ser um redirecionamento infinito devido ao uso de SSL. Eu não sei como consertar isso, além de hospedar o arquivo jnlp no diretório raiz do servidor (o que eu prefiro não fazer, já que ele me limita a um aplicativo baseado em jnlp por vez).

As linhas relevantes do nginx.conf:

# HTTPS server                                                                            
#                                                                                         
server {                                                       
    listen       443;                                                
    server_name   MyServer.org
    root         /My/Root/Dir;
    passenger_enabled on;
    expires           1d;

    proxy_set_header X-FORWARDED_PROTO https;
    proxy_set_header X_FORWARDED_PROTO https;#the almighty google is not clear on which to use   


   location /upload {
      proxy_pass https://127.0.0.1:443;
   }
}   
A coisa engraçada sobre isso é, primeiro, eu estava colocando o jnlp em um diretório chamado 'uploader', não 'upload', mas isso ainda parecia acionar o problema, já que a diretiva proxy_pass apareceu nos logs. Segundo, novamente, mover o jnlp para a raiz evitou o problema, porque não havia nenhum desse proxy devido ao SSL.

Então, como posso evitar o loop infinito do proxy_pass no nginx?

    
por mmr 07.06.2010 / 20:06

1 resposta

1

O nginx está escutando na porta 443. Quando você recebe um pedido para /uploader , você faz proxy para ... a porta 443. Isso é nginx. Parece que você deveria estar se aproximando do seu aplicativo sinatra, que está escutando em alguma outra porta? Eu não conheço nginx bem, mas não parece certo.

    
por 11.09.2010 / 17:54

Tags