Fastcgi рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░

рд╡рд┐рд╡рд░рдг


FCGI :: ProcManager рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╕реНрддрд╛рд░, рдЬрд┐рд╕рд╕реЗ рдЖрдк fcgi рдкреНрд░реЛрд╕реЗрд╕ рдореИрдиреЗрдЬрд░ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреБрдХрд╕рд╛рди


FCGI :: ProcManager рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрдкреЙрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рд╣реИред рд╢реБрд░реВ рд╕реЗ, рдпрд╣ рд╣реИрдВрдбрд▓рд░ (n_processes pieces) рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдпрд╣ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдореГрддрдХреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдХреЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИред рдереНрд░реЗрдбреНрд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рдмрдВрдзрдХ, рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЛрдб рдХреЛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЧреЛрд╡рдиреЛрдХреЙрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдореИрдиреЗрдЬрд░ рдХреЛ рд╕реЙрдХреЗрдЯ рд╕реБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Pm_wait рдлрд╝рдВрдХреНрд╢рди FCGI рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ :: ProcManager:
sub pm_wait { my ($this) = self_or_default(@_); # wait for the next server to die. next if (my $pid = wait()) < 0; # notify when one of our servers have died. delete $this->{PIDS}->{$pid} and $this->pm_notify("server (pid $pid) exited with status $?"); return $pid; } 


рд╣рдореЗрдВ рд╡реЗрдЯрдкрд┐рдб рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЕрдкрдирд╛ рдХреЛрдб рд╡рд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рджреВрд╕рд░реЗ рдкреЛрд░реНрдЯ рдХреЛ рдЦреЛрд▓рдирд╛ рдФрд░ рд╕реБрдирдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдФрд░ рдкреЛрд░реНрдЯ рдХреЛ рд╕реБрдирдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо pm_wait рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ FCGI :: ProcManager рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдВрджрд░ рдкреИрдЪ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗред рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рднреА рд╡рдВрд╢рдЬ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
 use FCGI; use FCGI::ProcManager; use IO::Select; use IO::Socket; use POSIX ":sys_wait_h"; #use Module::Refresh; use feature ':5.14'; use strict; # For fastcgi app my $socket = FCGI::OpenSocket( ":9019", 5 ); my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket, FCGI::FAIL_ACCEPT_ON_INTR ); # To communicate with the manager my $server = IO::Socket::INET->new(LocalPort => '9034', Type => SOCK_STREAM, Reuse => 1, Listen => 1) or die "Couldn't start messange server $@\n"; my $select = IO::Select->new($server); # Patch my $pm_wait = sub { my ($pm) = @_; my $pid; while (1) { last if ($pid = waitpid(-1, WNOHANG)); foreach my $client ($select->can_read(1)) { if ($client == $server) { $client = $server->accept(); $select->add($client); } else { my $msg = <$client>; chomp $msg; if ($msg eq 'reload') { #my $refresher = Module::Refresh->new(); #my @module_list = qw( MyLib1.pm My/Lib2.pm ); #foreach my $module_name (@module_list){ # $refresher->refresh_module($module_name); #} $pm->sig_manager('HUP'); } print $client "done!\n"; $select->remove($client); close $client; } } } # notify when one of our servers have died. delete $pm->{PIDS}->{$pid} and $pm->pm_notify("server (pid $pid) exited with status $?"); return $pid; }; no strict 'refs'; *{'FCGI::ProcManager::pm_wait'} = $pm_wait; use strict 'refs'; my $pm = FCGI::ProcManager->new( ); $pm->pm_manage( n_processes => 3, pm_title => 'perl-fcgi-pm', die_timeout => 10 ); while ( $request->Accept() >= 0 ) { $pm->pm_pre_dispatch(); print "Content-Type: text/plain\n\n"; print "server works"; $pm->pm_post_dispatch(); } FCGI::CloseSocket($socket); close $server; 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
 use IO::Socket; use feature ':5.14'; use strict; my $socket = new IO::Socket::INET(Proto => "tcp", Type => SOCK_STREAM, PeerPort => 9034, PeerAddr => "127.0.0.1" ) or die "Can't connect: $!"; #my $msg = $ARGV[0]; my $msg = 'reload'; if ($msg) { print $socket "$msg\n"; my $answer = <$socket>; say "Answer: ".$answer; } 


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдлрд╛рд╕реНрдЯреЗрдЧреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд╕рдВрджреЗрд╢ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рд▓реЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ)ред рдЖрдк рд╣реИрдВрдбрд▓рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛ / рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ
 $pm->{n_processes} = 10; $pm->sig_manager('HUP'); 

рдареАрдХ рд╣реИ, рдРрд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдЬреИрд╕реЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ рдЪрд╛рд▓реВ / рдмрдВрдж рдХрд░рдирд╛ред рдмреЗрд╢рдХ, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ

Source: https://habr.com/ru/post/In124691/


All Articles