2011-05-25 45 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(未测试)

相关问题