NAME
Slides: The Next Generation: mod_perl 2.0
About
* Why rewrite?
* What's new in Apache 2.0
* What's new in Perl 5.6.0 - 5.8.0
* What's new in mod_perl 2.0
* Installing mod_perl 2.0
* Configuring mod_perl 2.0
* Migrating from 1.0 to 2.0
* New Phases
* Protocol Handlers
* Filter Handlers
Thank you!
* TicketMaster rules!!!
Versioning Convention
* To make things simple here and in the new docs:
* mod_perl:
* * mod_perl 1.0 (not mod_perl 1.xx)
* * mod_perl 2.0 (not mod_perl 2.0.xx)
* Apache:
* * Apache 1.3
* * Apache 2.0
Why the 2.0 Rewrite?
* Too patchy (6 years!), backward compatibility with:
* * Apache 1.3.0 - 1.3.27
* * Perl 5.003 - 5.8.0
* mod_perl 2.0 starts afresh with:
* * Apache 2.0 (incompatible with Apache 1.3)
* * Perl 5.6.0 (has semi-thread-safe Perl Interpreters)
* * Threaded mpms: 5.8.0 (really thread-safe)
* A new build system autogenerates the code used to
* * autogenerates the code that is used to ...
* * ...
* * which generates the final code ...
* * ... and it all works
* Automatically supports new Apache APIs
The Apache::Test Framework
* The core:
All tests successful.
Files=75, Tests=504, 65 wallclock secs ...
* Any Perl module needing mod_perl 1.0 or 2.0
* Any Apache module (both 1.3 and 2.0), PHP, Python, C...
* Already used by httpd-test to test Apache!!!
New in Apache 2.0
* Apache Portable Runtime
* Multi Processing Model modules (MPMs).
* * processes: prefork
* * threads: worker, leader, perchild...
* * os: mpmt_os2, netware, winnt, beos...
* Protocol Modules (HTTP, POP3, SMTP...)
* I/O Filtering
* Bucket Brigades
* Parsed Configuration Tree
* New Hook Scheme (Flexible, Order-able)
* Optional Functions
New in Perl m/5\.(6|8)\.\d/
* Thread-safe Interpreter (5.8.0) via perl_clone()
* Subroutine attributes:
sub handler : FilterRequestHandler { ... }
* CORE::GLOBAL::
subs overriding CORE::
* PerlIO layers => APR::PerlIO
:
open my $fh, "<:APR", $file, $r;
* I18n: Unicode, UTF...
New in mod_perl 2.0
* All the new Apache 2.0 and Perl 5.6.0+ features
* Plus its own new features
Threads Support
* Thread Interpreters Pool
* scalar @perl_interpreters != scalar @apache_threads
* * no need for front-end/back-end separation
* Two classes of interpreters: parent and clone
* parent: preload modules and perl_clone() clones
* clones: do the real work
* * mutable data is copied by the clone
* * read-only data such as the syntax tree is shared
* * clone pools are FIFO => memory re-use
Thread-safety
* Manipulating Perl data is thread-safe (5.8.0)
push(), map(), chomp(), ...
* The rest, depends on the underlying implementation
localtime(), readdir(), srand(), ...
* Thread-safe but Process-scoped
chdir(), umask(), chroot(), ...
* See perlthrtut(3)
Accessing the Modules
* mod_perl 2.0 Perl libs go to Apache2/
* Adjust @INC
:
use Apache2 ();
# @INC before:
/usr/lib/perl5/site_perl/5.8.0/i686-linux-thread-multi
# @INC after:
/usr/lib/perl5/site_perl/5.8.0/i686-linux-thread-multi/Apache2
PerlRequire'd Startup File
use Apache2 ();
# use Apache::compat (); # 1.0 compat
use lib qw(/home/httpd/perl);
use ModPerl::Util (); #for CORE::GLOBAL::exit
use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::RequestUtil ();
use Apache::Server ();
use Apache::ServerUtil ();
use Apache::Connection ();
use Apache::Log ();
use APR::Table ();
use ModPerl::Registry ();
use Apache::Const -compile => ':common';
use APR::Const -compile => ':common';
1;
PerlOptions
Directive
* Disable mod_perl for a given VirtualHost
:
<VirtualHost ...>
PerlOptions -Enable
</VirtualHost>
* Give the VirtualHost
its own interpreter pool.
<VirtualHost ...>
PerlOptions +Clone
PerlInterpStart 2
PerlInterpMax 2
</VirtualHost>
* Run different versions of the same module:
<VirtualHost ...>
ServerName dev1
PerlOptions +Parent
PerlSwitches -Mblib=/home/dev1/lib/perl
</VirtualHost>
<VirtualHost ...>
ServerName dev2
PerlOptions +Parent
PerlSwitches -Mblib=/home/dev2/lib/perl
</VirtualHost>
* disallow certain handlers/options
<VirtualHost ...>
PerlOptions -Authen -Authz -Access -Sections
</VirtualHost>
* Or maybe everything but the response handler:
<VirtualHost ...>
PerlOptions None +Response
</VirtualHost>
* Resolve Perl*Handlers
at startup time:
PerlOptions +Autoload
PerlResponseHandler Apache::Magick
* Disable the global request_rec
(Apache->request
)
<Location ...>
SetHandler perl-script
PerlOptions -GlobalRequest
...
</Location>
References
* All the information can be found at:
http://perl.apache.org/docs/
* Further Questions?
* * Grab me at the corridor and demand answers
* * Ask at modperl@perl.apache.org