[ruby-on-rails] Phusion Passenger 및 Rails를 사용할 때 초기 서버 시작 속도가 느림

Phusion Passenger의 악 대차에 뛰어 들기 위해 우리는 작은 레일 앱을위한 스테이징 서버를 설정하여 테스트했습니다.

지금까지는 사용하기가 매우 좋았으며 앱 설치 / 구성 및 배포가 매우 간편합니다. 문제는 우리가 사용하는 사이트가 자주 방문하지 않고 백그라운드에서 서버를 종료하는 것처럼 보인다는 것입니다. 누군가가 사이트에 가면 요청을 처리하기 위해 새 서버를 시작할 때까지 정말 오래 기다립니다. 우리는 문서를 읽고 꽤 다른 설정 (smart / smart-lv2 모드, passengeridletime 등)을 시도했지만 여전히 실제 해결책을 찾지 못했습니다.

Google 결과를 살펴본 후 유용한 정보를 찾을 수 없습니다. 현재 서버 실행을 유지하기 위해 자주 요청하는 크론 작업이 있습니다.

이 문제를 겪고있는 다른 사람이 있습니까? 해결책에 대한 조언이 있습니까?



답변

무슨 일이 일어나고 있는지는 응용 프로그램 및 / 또는 ApplicationSpawners가 시간 초과로 인해 종료되고 있다는 것입니다. 새 요청을 처리하기 위해 Passenger는 애플리케이션의 새 복사본을 시작해야합니다. 이는 빠른 시스템에서도 몇 초가 걸릴 수 있습니다. 문제를 해결하기 위해 애플리케이션을 활성 상태로 유지하는 데 사용할 수있는 몇 가지 Apache 구성 옵션이 있습니다.

다음은 내 서버에서 수행 한 작업입니다. PassengerSpawnMethod 및 PassengerMaxPreloaderIdleTime은 상황에서 가장 중요한 구성 옵션입니다.

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

“스마트”스폰 모드를 사용하고 PassengerMaxPreloaderIdleTime을 끄면 Passenger는 항상 메모리에 애플리케이션 사본 1 개를 보관합니다 (Apache 시작 후 첫 번째 요청 이후). 개별 Application리스너는 fork이 사본에서 추출되며 이는 매우 저렴한 작업입니다. 너무 빨리 발생하여 애플리케이션이 리스너를 생성해야했는지 여부를 알 수 없습니다.

앱이 스마트 스폰과 호환되지 않는 경우, 나는 큰 PassengerPoolIdleTime을 유지하고 리스너가 살아남을 수 있도록 curl과 cronjob 또는 monit 또는 무언가를 사용하여 주기적으로 사이트를 방문하는 것이 좋습니다.

여객 사용 설명서는 다음과 추가 구성 옵션에 대한 멋진 참조입니다.

편집 : 앱이 스마트 스폰과 호환되지 않는 경우 매우 좋은 몇 가지 새로운 옵션 이 있습니다.

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

따라서 PassengerPreStart와 PassengerMinInstances를 결합하면 Passenger는 아파치로드 직후 3 개의 인스턴스를 스핀 업하고 항상 최소 3 개의 인스턴스를 유지하므로 사용자가 지연을 거의 볼 수 없습니다.

또는 PassengerMaxPreloaderIdleTime 0이미 스마트 스폰 (권장)을 사용 중인 경우 추가 PassengerPreStart하여 즉시 시작의 추가 이점을 얻을 수 있습니다 .

phusion.nl 의 영웅들에게 감사드립니다 !


답변

이 질문에 걸려 넘어지는 nginx 서버 사용자가있는 경우를 대비하여 ‘PassengerMaxRequests’및 ‘PassengerStatThrottleRate’지시문은 모두 nginx로 변환되지 않습니다. 그러나 나머지는 다음을 수행합니다.

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDIT rails_spawn_method는 승객 3에서 더 이상 사용되지 않습니다.

passenger_spawn_method smart;

다른 모든 것은 날짜까지 좋습니다.


답변

PassengerMinInstances를 사용할 수도 있습니다.

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

이는 PassengerPreStart와 결합 될 수 있습니다.


답변

레:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

추가하고 유용 할 수 있습니다.

현재 릴리스의 기본 생성 방법은 프레임 워크 생성기를 건너 뛰는 “smart-lv2″입니다. 따라서 명시 적으로 생성 방법을 “스마트”로 설정하지 않는 한 프레임 워크 생성기 시간 제한을 설정해도 효과가 없습니다.

출처 :
http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


답변

호스트가 저와 같은 공유 서버 인 경우 설정을 변경할 수 없으며 크론 작업이 중단됩니다.


답변

나도이 문제가 있었지만이 파일에 대한 쓰기 권한이 없기 때문에 승객 설정을 변경할 수 없었습니다. 내 앱이 빠르게 응답하도록 하는 도구 ( http://www.wekkars.com )를 찾았습니다 . 아마도 이것은 당신에게 해결책이 될 수 있습니다.


답변

승객의 버전을 확인하십시오. RailsSpawnMethod였습니다.<string>이전 버전의 경우 였습니다.

그렇다면 (올바르게 기억한다면) 모든 구성 지침에서 Passenger를 Rails로 바꾸거나 자세한 내용은 이전 승객 문서를 찾아보십시오.