如何在不重新启动的情况下在Apache中部署PSGI脚本?

时间:2011-05-25 11:50:40

标签: perl mod-perl plack

我想在Plack中部署一个在Apache2中运行的PSGI脚本。 Apache配置为:

<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脚本以部署新版本?

看起来普拉克会定期检查一些变化,但我不清楚何时。此外,它似乎创建了多个实例,因此我有时会在script.psgi处获得/mypath的不同版本。手动刷新perl响应处理程序而不必重新启动Apache或等待一段未知的时间会很有帮助。

3 个答案:

答案 0 :(得分:6)

简短的回答是你不能。这就是为什么我们建议您使用plackup(使用-r)进行快速开发,并仅将Apache用于部署(生产使用)。

另一个选项是开发apache进程,并将MaxRequestsPerChild设置为一个非常小的值,这样你就可以在很短的时间内生成一个新鲜的孩子。我没有对此进行测试,如果你运行在同一进程上运行的非开发应用程序(这首先是一个坏主意),这样做肯定会影响整个httpd的性能。

答案 1 :(得分:1)

Apache2::Reload(未经测试)

答案 2 :(得分:1)

您可以将应用程序移出appache进程, e.g。

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

使用

运行您的程序
plackup -s FCGI --listen /path/to/my/socket --nproc 10 /path/to/my/script.psgi

这样您可以在不重新启动apache的情况下重新启动应用程序。

如果保存主fcgi进程的pid(--pid $ pid_file) 您可以轻松地重新启动加载新代码。

还有一个模块可用于管理(启动,停止,重启)所有fcgi池: https://metacpan.org/pod/FCGI::Engine::Manager::Server::Plackup(未经测试)