Nginx-Server über https verbraucht alle verfügbaren Dateihandles (upd: Endlosschleife?)

Nginx-Server über https verbraucht alle verfügbaren Dateihandles (upd: Endlosschleife?)

Ich habe also einen Nginx-Server, der über https mit Sinatra arbeitet. Wenn ich versuche, eine JNLP-Datei in einer Konfiguration herunterzuladen, die über Mongrel und http (kein s) einwandfrei funktioniert, schlägt der Nginx-Server beim Bereitstellen der Datei mit einem 504-Fehler fehl. Eine anschließende Überprüfung der Protokolle ergibt, dass dieser Fehler auf einen Überlauf der verfügbaren Anzahl von Dateihandles zurückzuführen ist, d. h. „24: zu viele offene Dateien“. Ausführen

sudo lsof -p <nginx worker pid>

erhalte ich eine riesige Liste mit Dateien, die alle so aussehen:

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)

Das Erhöhen der Anzahl der zu öffnenden Dateien ist keine Hilfe, da nginx diese Grenze dann einfach überschreitet. Und kein Wunder, es sieht so aus, als ob es sich in einer Art Schleife befindet, um alle verfügbaren Dateien abzurufen.

Irgendeine Idee, was los ist und wie man es beheben kann?

BEARBEITEN:nginx 0.7.63, Ubuntu Linux, Sinatra 1.0

BEARBEITEN 2:Hier ist der fehlerhafte Code. Es ist Sinatra, das JNLP bedient, was ich schließlich herausgefunden habe:

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

Wenn ich dies mit Sinatra über Mongrel und http bereitstelle, funktioniert alles einwandfrei. Wenn ich dies mit Sinatra und nginx über https bereitstelle, erhalte ich den obigen Fehler. Alle anderen Teile der Website scheinen gleichwertig zu sein.

BEARBEITEN:Ich habe seitdem auf Passenger 2.2.14, Ruby 1.9.1, Nginx 0.8.40, OpenSSL 1.0.0a aktualisiert und es hat sich nichts geändert.

BEARBEITEN:Der Übeltäter scheint die unendlichen Weiterleitungen aufgrund der Verwendung von SSL zu sein. Ich weiß nicht, wie ich das beheben kann, außer die JNLP-Datei im Stammverzeichnis des Servers zu hosten (was ich lieber nicht tun würde, da ich dann auf eine JNLP-basierte App gleichzeitig beschränkt bin).

Die relevanten Zeilen aus 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;
   }
}   

Das Lustige daran ist, dass ich das JNLP zunächst in ein Verzeichnis namens „Uploader“ und nicht „Upload“ gelegt habe, aber das schien trotzdem das Problem auszulösen, da diese Proxy_pass-Direktive in den Protokollen erschien. Zweitens wurde das Problem wiederum vermieden, indem ich das JNLP ins Stammverzeichnis verschoben habe, da es aufgrund von SSL kein Proxying gab.

Wie kann ich also die unendliche Proxy_Pass-Schleife in Nginx vermeiden?

Antwort1

nginx lauscht auf Port 443. Wenn Sie eine Anfrage erhalten /uploader, leiten Sie einen Proxy an ... Port 443 weiter. Das ist nginx. Es sieht so aus, als ob Sie einen Proxy an Ihre Sinatra-App leiten sollten, die auf einem anderen Port lauscht? Ich kenne mich mit nginx nicht gut aus, aber das sieht nicht richtig aus.

verwandte Informationen