사용 가능한 모든 파일 핸들을 사용하는 https를 통한 nginx 서버(upd: 무한 루프?)

사용 가능한 모든 파일 핸들을 사용하는 https를 통한 nginx 서버(upd: 무한 루프?)

그래서 Sinatra와 함께 https를 통해 작동하는 nginx 서버가 있습니다. Mongrel 및 http(s 없음)에서 제대로 작동하는 구성으로 jnlp 파일을 다운로드하려고 하면 nginx 서버가 504 오류와 함께 파일을 제공하지 못합니다. 이후 로그를 확인하면 이 오류는 사용 가능한 파일 핸들 수(예: "24: 열린 파일이 너무 많음")가 초과되어 발생한 것으로 나타납니다. 달리기

sudo lsof -p <nginx worker pid>

다음과 같은 거대한 파일 목록을 받습니다.

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)

열 수 있는 파일 수를 늘리는 것은 도움이 되지 않습니다. 왜냐하면 nginx가 그 한도를 바로 넘어서기 때문입니다. 그리고 당연히 사용 가능한 모든 파일을 가져오는 것이 일종의 루프에 있는 것처럼 보입니다.

무슨 일이 일어나고 있는지, 어떻게 해결하는지 아시나요?

편집하다:nginx 0.7.63, 우분투 리눅스, 시나트라 1.0

편집 2:문제가 되는 코드는 다음과 같습니다. jnlp를 제공하는 sinatra입니다. 마침내 알아냈습니다.

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

Mongrel 및 http를 통해 Sinatra와 함께 이를 제공하면 모든 것이 잘 작동합니다. https를 통해 Sinatra 및 nginx와 함께 이를 제공하면 위의 오류가 발생합니다. 웹사이트의 다른 모든 부분은 동등한 것으로 보입니다.

편집하다:이후 승객 2.2.14, Ruby 1.9.1, nginx 0.8.40, openssl 1.0.0a로 업그레이드했으며 변경 사항이 없습니다.

편집하다:SSL 사용으로 인한 무한 리디렉션이 원인인 것으로 보입니다. 서버의 루트 디렉터리에 jnlp 파일을 호스팅하는 것 외에는 이 문제를 해결하는 방법을 모르겠습니다(한 번에 하나의 jnlp 기반 앱으로 제한하므로 그렇게 하고 싶지 않습니다).

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;
   }
}   

이것에 대한 재미있는 점은 먼저 jnlp를 'upload'가 아닌 'uploader'라는 디렉토리에 넣었지만 해당 Proxy_pass 지시문이 로그에 나타나기 때문에 여전히 문제를 유발하는 것처럼 보였습니다. 둘째, jnlp를 루트로 이동하면 문제가 방지됩니다. SSL로 인한 프록시가 없었기 때문입니다.

그렇다면 nginx에서 무한 Proxy_pass 루프를 어떻게 피할 수 있나요?

답변1

nginx는 포트 443에서 수신 대기합니다. 에 대한 요청을 받으면 /uploader포트 443으로 프록시합니다. 그게 nginx입니다. 다른 포트에서 수신 대기 중인 sinatra 앱에 프록싱을 해야 하는 것 같나요? nginx를 잘 모르는데 맞는 것 같지 않네요.

관련 정보