=head1 NAME Configuring mod_perl 2.0 for Win32 =head1 Description This document discusses how to configure mod_perl 2.0. =head1 Configuration Add this line to F<C:/Apache2/conf/httpd.conf>: LoadModule perl_module modules/mod_perl.so Be sure that the path to your Perl binary (eg, F<C:/Perl/bin>) is in your C<PATH> environment variable. This can be done either by editing F<C:\AutoExec.bat>, if present, or through the I<Environment Variables> option of the I<Advanced> tab of the I<System> area of the Control Panel. Especially when running Apache as a service, you may also want to add the directive LoadFile "/Path/to/your/Perl/bin/perl5x.dll" to F<httpd.conf>, before loading F<mod_perl.so>, to load your Perl dll. You may also want to use a start-up script to load commonly used modules; this can be done with a directive as, eg, PerlRequire "C:/Apache2/conf/extra.pl" where a sample start-up script F<C:/Apache2/conf/extra.pl> is use ModPerl::Util (); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Connection (); use Apache2::Log (); use Apache2::Const -compile => ':common'; use APR::Const -compile => ':common'; use APR::Table (); use Apache2::compat (); use ModPerl::Registry (); use CGI (); 1; C<Apache2::compat> is used to provide backwards compatibility with mod_perl 1.0. C<ModPerl::Registry>, named so as not to conflict with C<Apache::Registry> of mod_perl 1.0, is used for registry scripts. =head1 Registry scripts Using C<ModPerl::Registry> to speed up cgi scripts may be done as follows. Create a directory, for example, F<C:/Apache2/perl/>, which will hold your scripts, such as ## printenv -- demo CGI program which just prints its environment ## use strict; print "Content-type: text/html\n\n"; print "<HTML><BODY><H3>Environment variables</H3><UL>"; foreach (sort keys %ENV) { my $val = $ENV{$_}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "<LI>$_ = \"${val}\"</LI>\n"; } #sleep(10); print "</UL></BODY></HTML>"; Note that Apache takes care of using the proper line endings when sending the I<Content-type> header. Next, insert in F<C:/Apache2/conf/httpd.conf> the following directives: Alias /perl/ "/Apache2/perl/" <Location /perl> SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI PerlOptions +ParseHeaders </Location> whereby the script would be called as http://localhost/perl/name_of_script The C<PerlOptions +ParseHeaders> directive is needed when the script sends the header (in mod_perl 1.0, this was given as C<PerlSendHeader ON)>. As an illustration of how mod_perl 2.0 addresses the issues raised in the discussion of issues in L<multithread win32|docs::1.0::os::win32::multithread> concerning the threading limitations of mod_perl 1.0 on Win32, consider the C<printenv> script above with the C<sleep(10)> line uncommented. Using the Apache benchmarking tool C<ab> of the Apache 2.0 Win32 distribution: C:\Apache2\bin> ab -n 5 -c 5 http://localhost/perl/printenv to make 5 concurrent requests, we find the following results. For mod_perl 1.0/Apache 1.3: Server Software: Apache/1.3.23 Concurrency Level: 5 Time taken for tests: 50.51972 seconds while for mod_perl 2.0/Apache 2.0: Server Software: Apache/2.0.45 Concurrency Level: 5 Time taken for tests: 13.729743 seconds The dramatic difference is due to the fact that in Apache 1.3/mod_perl 1.0 a given request has to finish (taking essentially 10 seconds, due to the C<sleep(10)> call) before the next request is processed, whereas on Apache 2.0/mod_perl 2.0 the requests are processed as they arrive. =head1 Hello World As you will discover, there is much to mod_perl beyond simple speed-up of cgi scripts. Here is a simple I<Hello, World> example that illustrates the use of mod_perl as a content handler. Create a file F<Hello.pm> as follows: package Apache2::Hello; use strict; use Apache2::RequestRec (); # for $r->content_type use Apache2::RequestIO (); # for $r->puts use Apache2::Const -compile => ':common'; sub handler { my $r = shift; my $time = scalar localtime(); my $package = __PACKAGE__; $r->content_type('text/html'); $r->puts(<<"END"); <HTML><BODY> <H3>Hello</H3> Hello from <B>$package</B>! The time is $time. </BODY></HTML> END return Apache2::Const::OK; } 1; and save it in, for example, the F<C:/Perl/site/lib/Apache2/> directory. Next put the following directives in F<C:/Apache2/conf/httpd.conf>: PerlModule Apache2::Hello <Location /hello> SetHandler modperl PerlResponseHandler Apache2::Hello </Location> With this, calls to http://localhost/hello will use C<Apache2::Hello> to deliver the content. =head1 See Also The directions for L<installing mod_perl 2.0 on Win32|docs::2.0::os::win32::install>, the L<mod_perl documentation|docs::index>, L<http://perl.apache.org/>, L<http://httpd.apache.org/>, L<http://www.activestate.com/>, and the L<FAQs for mod_perl on Win32|docs::general::os::win32::faq>. Help is also available through the archives of and subscribing to the L<mod_perl mailing list|maillist::modperl>. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Randy Kobes E<lt>randy@theoryx5.uwinnipeg.caE<gt> =back =head1 Authors =over =item * Randy Kobes E<lt>randy@theoryx5.uwinnipeg.caE<gt> =back Only the major authors are listed above. For contributors see the Changes file. =cut