Portanto, tenho um servidor nginx que funciona em https com o Sinatra. Quando tento baixar um arquivo jnlp em uma configuração que funciona bem em Mongrel e http (sem s), o servidor nginx falha ao servir o arquivo com um erro 504. A verificação subsequente dos logs indica que esse erro se deve ao estouro do número disponível de identificadores de arquivo, ou seja, "24: muitos arquivos abertos". Correndo
sudo lsof -p <nginx worker pid>
me dá 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 em nada, porque o nginx simplesmente ultrapassa esse limite. E não é à toa que parece que está em algum tipo de loop para extrair todos os arquivos disponíveis.
Alguma ideia do que está acontecendo e como consertar?
EDITAR:nginx 0.7.63, ubuntu linux, sinatra 1.0
EDITAR 2:Aqui está o código ofensivo. É sinatra servindo jnlp, que 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 funcionará bem. Se eu servir isso com Sinatra e nginx via https, recebo o erro acima. Todas as outras partes do site parecem ser equivalentes.
EDITAR: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 redirecionamentos infinitos devido ao uso de SSL. Não sei como consertar isso, a não ser hospedar o arquivo jnlp no diretório raiz do servidor (o que prefiro não fazer, pois isso 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;
}
}
O engraçado disso é que, primeiro, eu estava colocando o jnlp em um diretório chamado 'uploader', não 'upload', mas isso ainda parecia desencadear o problema, já que a diretiva proxy_pass apareceu nos logs. Em segundo lugar, novamente, mover o jnlp para root evitou o problema, porque não havia nenhum proxy devido ao SSL.
Então, como posso evitar o loop infinito proxy_pass no nginx?
Responder1
O nginx está escutando na porta 443. Quando você recebe uma solicitação para /uploader
, você faz proxy para ... porta 443. Esse é o nginx. Parece que você deveria fazer proxy para seu aplicativo sinatra, que está escutando em alguma outra porta? Não conheço bem o nginx, mas não parece certo.