2011-05-25 143 views
3

我想用Plack部署在Apache2中運行的PSGI腳本。 Apache的配置有:如何在Apache中部署PSGI腳本而不重新啓動?

<Location "/mypath"> 
    SetHandler perl-script 
    PerlResponseHandler Plack::Handler::Apache2 
    PerlSetVar psgi_app /path/to/my/script.psgi 
</Location> 

當我測試的腳本plackup的--reload參數手錶上.psgi文件更新。在生產環境中,由於性能原因,Apache和Plack沒有檢查並重新啓動每個更改,但如何才能明確告訴它們重新啓動Plack::Handler::Apache2和/或PSGI腳本以部署新版本?

它看起來像普拉克定期檢查一些變化,但我不知道什麼時候。此外,它似乎創建多個實例,所以我有時在/mypath時獲得不同版本的script.psgi。手動刷新perl響應處理程序而不必重新啓動Apache或等待未知的時間會很有幫助。

回答

6

簡短的回答是你不能。這就是爲什麼我們建議您使用plackup(使用-r)進行快速開發,並僅將Apache用於部署(生產使用)。

另一種選擇是有一個開發apache進程,並將MaxRequestsPerChild設置爲一個非常小的值,以便您可以在很短的時間內產生一個新的子進程。我沒有測試過這個,如果你運行在同一個進程上運行的非開發應用程序(這首先是一個壞主意),那麼這樣做肯定會影響整個httpd的性能。

+1

謝謝,經過一番思考和閱讀,我現在認爲這是功能,而不是錯誤:它迫使你將可能改變的東西放入配置文件和模板中,而不是放到應用程序中。應用程序可以更好地觀看這些動態文件並僅在需要時重新加載它們。 – Jakob 2011-05-26 14:59:26

1

您可以將應用程序移出應用程序進程,例如

FastCgiExternalServer /virtual/filename/fcgi -socket /path/to/my/socket 

的運行與

plackup -s FCGI --listen /path/to/my/socket --nproc 10 /path/to/my/script.psgi 

這樣PROGRAMM你可以無需重新啓動Apache的重新啓動應用程序。

如果您保存主要fcgi進程(--pid $ pid_file)的pid 您可以輕鬆地重新加載新代碼。

還有一個模塊無濟於事管理(啓動,停止,重新啓動)所有FCGI池: https://metacpan.org/pod/FCGI::Engine::Manager::Server::Plackup(未測試)

相關問題