Perl Net::Server 热部署
Perl Net::Server hot deployment
我正在使用 Net::Server::Prefork 启动 TCP 服务器。启动例程如下所示:
use 5.10.1;
use strict;
use warnings;
use parent 'Net::Server::Fork';
Dispatcher->run(
'host' => $host || '*',
'port' => $port || 7000,
'ipv' => '*',
'log_level' => $main::config{'backend.loglevel'} || 0,
'log_file' => $main::config{'backend.logfile'} || undef,
'pid_file' => $main::config{'backend.pidfile'} || undef,
'user' => $main::config{'backend.user'} || 'nobody',
'group' => $main::config{'backend.group'} || 'nogroup',
'max_servers' => $main::config{'backend.maxconnections'} || 3,
'background' => !$main::config{'backend.foreground'} || undef,
'allow' => $main::config{'ip'} || '.*',
'reverse_lookups' => 1,
);
Dispatcher 使用此函数处理请求:
sub process_request {
eval {
local $SIG{'ALRM'} = sub { die "Timed Out!\n" };
my $previous_alarm = alarm($timeout);
my @args;
{
my $command = <STDIN>;
@args = split /\s+/, $command;
alarm($timeout);
}
alarm(($main::config{'timeout'} + 5) || 185);
{
Dispatcher::main(@args);
}
alarm($previous_alarm);
};
};
现在一切都很好。但是,在更新服务器时,我目前遇到的问题是,为了不终止正在处理的请求,我必须检查活动进程并等到它们完成,而在等待新客户端时会出现其他问题可以连接。
那么 - 是否有机会 'phase out' 运行 子进程,即终止空闲的预分叉进程,用新版本替换它们,并用新版本替换每个 运行 (旧)进程一旦旧流程完成?
或者,我可以阻止传入连接,直到所有旧的子进程完成,然后重新启动整个服务器吗?我正在考虑使用临时防火墙规则来执行此操作,但我真的更希望让 perl 处理它。
欢迎任何想法!
您是否尝试过使用 leave_children_open_on_hup
配置选项并使用 HUP
信号重新启动服务器? [linux/unix 的食谱]
它应该根据文档工作。
我正在使用 Net::Server::Prefork 启动 TCP 服务器。启动例程如下所示:
use 5.10.1;
use strict;
use warnings;
use parent 'Net::Server::Fork';
Dispatcher->run(
'host' => $host || '*',
'port' => $port || 7000,
'ipv' => '*',
'log_level' => $main::config{'backend.loglevel'} || 0,
'log_file' => $main::config{'backend.logfile'} || undef,
'pid_file' => $main::config{'backend.pidfile'} || undef,
'user' => $main::config{'backend.user'} || 'nobody',
'group' => $main::config{'backend.group'} || 'nogroup',
'max_servers' => $main::config{'backend.maxconnections'} || 3,
'background' => !$main::config{'backend.foreground'} || undef,
'allow' => $main::config{'ip'} || '.*',
'reverse_lookups' => 1,
);
Dispatcher 使用此函数处理请求:
sub process_request {
eval {
local $SIG{'ALRM'} = sub { die "Timed Out!\n" };
my $previous_alarm = alarm($timeout);
my @args;
{
my $command = <STDIN>;
@args = split /\s+/, $command;
alarm($timeout);
}
alarm(($main::config{'timeout'} + 5) || 185);
{
Dispatcher::main(@args);
}
alarm($previous_alarm);
};
};
现在一切都很好。但是,在更新服务器时,我目前遇到的问题是,为了不终止正在处理的请求,我必须检查活动进程并等到它们完成,而在等待新客户端时会出现其他问题可以连接。 那么 - 是否有机会 'phase out' 运行 子进程,即终止空闲的预分叉进程,用新版本替换它们,并用新版本替换每个 运行 (旧)进程一旦旧流程完成?
或者,我可以阻止传入连接,直到所有旧的子进程完成,然后重新启动整个服务器吗?我正在考虑使用临时防火墙规则来执行此操作,但我真的更希望让 perl 处理它。
欢迎任何想法!
您是否尝试过使用 leave_children_open_on_hup
配置选项并使用 HUP
信号重新启动服务器? [linux/unix 的食谱]
它应该根据文档工作。