You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs-cvs@perl.apache.org by st...@apache.org on 2002/04/20 08:36:02 UTC

cvs commit: modperl-docs/src/docs/1.0/guide getwet.pod Changes.pod config.cfg

stas        02/04/19 23:36:02

  Modified:    src/docs/1.0/guide Changes.pod config.cfg
  Added:       src/docs/1.0/guide getwet.pod
  Log:
  a new chapter to get you started fast
  
  Revision  Changes    Path
  1.13      +4 -0      modperl-docs/src/docs/1.0/guide/Changes.pod
  
  Index: Changes.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/Changes.pod,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Changes.pod	18 Apr 2002 18:13:05 -0000	1.12
  +++ Changes.pod	20 Apr 2002 06:36:02 -0000	1.13
  @@ -11,6 +11,10 @@
   
   =head1 ??? ver 1.32
   
  +* guide::getwet
  +
  +   o a new chapter to get you started fast
  +
   * guide::porting
   
     o add a new section presenting a hackish solution for libraries
  
  
  
  1.4       +1 -0      modperl-docs/src/docs/1.0/guide/config.cfg
  
  Index: config.cfg
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/config.cfg,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- config.cfg	20 Mar 2002 18:15:36 -0000	1.3
  +++ config.cfg	20 Apr 2002 06:36:02 -0000	1.4
  @@ -10,6 +10,7 @@
   
       group    => 'Getting Started',
       chapters => [qw(
  +        getwet.pod
           intro.pod
           start.pod
           install.pod
  
  
  
  1.1                  modperl-docs/src/docs/1.0/guide/getwet.pod
  
  Index: getwet.pod
  ===================================================================
  =head1 NAME
  
  Getting your feet wet
  
  =head1 Description
  
  This chapter gives you step-by-step instructions to get a basic
  statically-compiled mod_perl-enabled Apache server up and
  running. Having a running server allows you to experiment with
  mod_perl as you learn more about it.
  
  (Of course, you'll be experimenting on a private machine, not on a
  production server, right?)  The remainder of the guide, along with the
  documentation supplied with mod_perl, gives the detailed information
  required for fine-tuning your mod_perl-enabled server to deliver the
  best possible performance.
  
  Although there are binary distributions of mod_perl-enabled Apache
  servers available for various platforms, we recommend that you always
  build mod_perl from source.  It's simple to do (provided you have all
  the proper tools on your machine), and building from source
  circumvents possible problems with the binary distributions (such as
  the reported bugs with the RPM packages built for RedHat Linux).
  
  The mod_perl installation that follows has been tested on many
  mainstream Unix and Linux platforms.  Unless you're using a very
  non-standard system, you should have no problems when building the
  basic mod_perl server.
  
  For Windows users, the simplest solution is to use the binary package
  available from I<http://perl.apache.org/distributions.html>.  Windows
  users may skip to the sidebar C<Installing mod_perl for Windows>.
  
  =head1 Installing mod_perl in Three Steps
  
  You can install mod_perl in three easy steps: Obtaining the source
  files required to build mod_perl, building mod_perl, and installing
  it.
  
  Building mod_perl from source requires a machine with basic
  development tools.  In particular, you will need an ANSI-compliant C
  compiler (such as I<gcc>) and the I<make> utility. All standard
  Unix-like distributions include these tools. If a required tool is not
  already installed, then use the package manager that is provided with
  the system (I<rpm>, I<apt>, I<yast>, etc.)  to install them.
  
  A recent version of Perl is also required, at least version 5.004.
  Perl is available as an installable package, although most Unix-like
  distributions will have installed Perl by default. To check that the
  tools are available and learn about their version numbers, try:
  
    panic% make -v
    panic% gcc -v
    panic% perl -v
  
  If any of these responds with C<Command not found>, it will need to be
  installed.
  
  Once all the tools are in place the installation process can begin.
  Experienced Unix users will need no explanation of the commands that
  follow and can simply copy and paste them into a terminal window to
  get the server installed.
  
  Acquire the source code distrubutions of Apache and mod_perl from the
  Internet, using your favorite web browser or one of the command line
  clients like I<wget>, I<lwp-download>, etc. These two distributions
  are available from I<http://www.apache.org/dist/httpd/> and
  I<http://perl.apache.org/dist/>.
  
  The two packages are named I<apache_x.x.x.tar.gz> and
  I<mod_perl-x.xx.tar.gz>, where I<x.x.x> should be replaced with the
  real version numbers of mod_perl and Apache.
  
  Move the downloaded packages into a directory of your choice, I<e.g.>,
  I</home/stas/src/>, proceed with the described steps and you will have
  mod_perl installed:
  
    panic% cd /home/stas/src
    panic% tar -zvxf apache_x.x.x.tar.gz
    panic% tar -zvxf mod_perl-x.xx.tar.gz
    panic% cd mod_perl-x.xx
    panic% perl Makefile.PL APACHE_SRC=../apache_x.x.x/src \
        APACHE_PREFIX=/home/httpd DO_HTTPD=1 USE_APACI=1 EVERYTHING=1
    panic% make && make test
    panic% su
    panic# make install
  
  That's all!
  
  All that remains is to add a few configuration lines to the Apache
  configuration file, (I</usr/local/apache/conf/httpd.conf>), start the
  server, and enjoy mod_perl.
  
  The following detailed explanation of each step should help you solve
  any problems that may have arisen when executing the commands above.
  
  
  
  
  =head1 Installing mod_perl for Unix Platforms
  
  Here is a more detailed explanation of the installation process, with
  each step explained in detail and with some troubleshooting advice. If
  the build worked and you are in a hurry to boot your new I<httpd>, you
  may skip to the next section, talking about configuration of the
  server.
  
  Before installing Apache and mod_perl, you usually have to become
  I<root> so that the files can be installed in a protected area. A user
  who does not have I<root> access, however, can still install all files
  under their home directory.  The proper approach is to build Apache in
  an unprivileged location and then only use I<root> access to install
  it. We will talk about the nuances of this approach in the L<dedicated
  installation process chapter|guide::install>.
  
  =head2 Obtaining and Unpacking the Source Code
  
  The first step is to obtain the source code distributions of Apache,
  available from http://www.apache.org/dist/httpd/ and mod_perl,
  available from http://perl.apache.org/dist/. Of course you can use
  your favorite mirror sites to get these distributions.
  
  Even if you have the Apache server running on your machine, usually
  you need to download its source distribution, because you need to
  re-build it from scratch with mod_perl.
  
  The source distributions of Apache and mod_perl should be downloaded
  into directory of your choice. For the sake of consistency, we assume
  throughout the guide that all builds are being done in the
  I</home/stas/src> directory. However, using a different location is
  perfectly possible and merely requires changing this part of the path
  in the examples to the actual path being used.
  
  The next step is to move to the directory with the source files:
  
    panic% cd /home/stas/src
  
  Uncompress and untar both sources.  GNU I<tar> allows this using a
  single command per file:
  
    panic% tar -zvxf apache_x.x.x.tar.gz
    panic% tar -zvxf mod_perl-x.xx.tar.gz
  
  For non-GNU I<tar>'s, you may need to do this with two steps (which
  you can combine via a pipe):
  
    panic% gzip -dc apache_x.x.x.tar.gz | tar -xvf -
    panic% gzip -dc mod_perl-x.xx.tar.gz | tar -xvf -
  
  Linux distributions supply C<tar> and C<gzip> and install them by
  default; for other systems these utilities should be obtained from
  I<http://www.gnu.org/> or other sources, and installed--the GNU
  versions are available for every platform that Apache supports.
  
  
  =head2 Building mod_perl
  
  Move into the I</home/stas/src/mod_perl-x.xx/> source distribution
  directory:
  
    panic% cd mod_perl-x.xx
  
  The next step is to create the I<Makefile>. This step is no different
  in principle from the creation of the I<Makefile> for any other Perl
  module.
  
    panic% perl Makefile.PL APACHE_SRC=../apache_x.x.x/src \
      DO_HTTPD=1 USE_APACI=1 EVERYTHING=1
  
  (Replace I<x.x.x> with the Apache distribution version number.)
  
  mod_perl accepts a variety of parameters. The options specified above
  will enable almost everything that mod_perl offers. There are many
  other options for fine-tuning mod_perl to suit particular
  circumstances; these are explained in detail in the L<dedicated
  installation process chapter|guide::install>.
  
  Running I<Makefile.PL> will cause Perl to check for prerequisites and
  identify any required software packages which are missing. If it
  reports missing Perl packages, these will have to be installed before
  proceeding. They are all available from CPAN (I<http://cpan.org/>) and
  can be easily downloaded and installed.
  
  An advantage to installing mod_perl with the help of the C<CPAN.pm>
  module is that all the missing modules will be installed with the
  C<Bundle::Apache> bundle:
  
    panic% perl -MCPAN -e 'install("Bundle::Apache")'
  
  We will talk about using C<CPAN.pm> in-depth in the L<installation
  process chapter|guide::install>.
  
  Running I<Makefile.PL> also transparently executes the I<./configure>
  script from Apache's source distribution directory, which prepares the
  Apache build configuration files. If parameters must be passed to
  Apache's C<./configure> script, they can be passed as options to
  I<Makefile.PL>.
  
  The I<httpd> executable can now be built by using the C<make>
  utility. (Note that the current working directory is still
  I</home/stas/src/mod_perl-x.xx/>):
  
    panic% make
  
  This command prepares the mod_perl extension files, installs them in
  the Apache source tree and builds the I<httpd> executable (the web
  server itself) by compiling all the required files. Upon completion of
  the I<make> process, the working directory is restored to
  I</home/stas/src/mod_perl-x.xx/>.
  
  Running C<make test> will execute various mod_perl tests on the
  freshly built I<httpd> executable.
  
    panic% make test
  
  This command starts the server on a non-standard port (8529) and tests
  whether all parts of the built server function correctly. The process
  will report anything that does not work properly.
  
  =head2 Installing mod_perl
  
  Running C<make install> completes the installation process of mod_perl
  by installing all the Perl files required for mod_perl to run--and, of
  course, the server documentation (man pages). Typically, you need to
  be I<root> to have permission to do this, but another user account can
  be used if the appropriate options were set on the C<perl Makefile.PL>
  command line.  To become I<root>, use the I<su> command.
  
    panic% su
    panic# make install
  
  If you have the proper permission, you might also chain all three
  I<make> commands into a single command line:
  
    panic# make && make test && make install
  
  C<&&> in shell program is similar to Perl's C<&&>. Each section of
  the statement will be executed left to right, untill all sections will
  be executed and return true (success) or one of them will return false
  (failure).
  
  The single-line version simplifies the installation, since there is no
  need to wait for each command to complete before starting the next
  one. Of course, if you need to become I<root> in order to run I<make
  install>, you'll either need to run it as a separate command or become
  I<root> before running the single-line version.
  
  If the all-in-one approach is chosen and any of the C<make> commands
  fail, execution will stop at that point. For example if C<make> alone
  fails then C<make test> and C<make install> will not be attempted;
  similarly if C<make test> fails then C<make install> will not be
  attempted.
  
  Finally, change to the Apache source distribution directory and run
  S<make install> to create the Apache directory tree and install
  Apache's header files (I<*.h>), default configuration files
  (I<*.conf>), the I<httpd> executable, and a few other programs.
  
    panic# cd ../apache_x.x.x
    panic# make install
  
  Note that, as with a plain Apache installation, any configuration
  files left from a previous installation will not be overwritten by
  this process.  So there is no need to backup the previously working
  configuration files before the installation, although backing up is
  never unwise.
  
  At the end of the I<make install> process, it will list the path to
  the C<apachectl> utility that you can use to start and stop the
  server, and the path to the installed configuration files. It is
  important to write down these paths since they will frequently be
  needed when maintaining and configuring Apache. On our machines these
  two important paths are:
  
    /usr/local/apache/bin/apachectl
    /usr/local/apache/conf/httpd.conf
  
  The mod_perl Apache server is now built and installed.  All that needs
  to be done before it can be run is to edit the configuration file
  I<httpd.conf> and write a little test script.
  
  
  
  
  =head2 Configuring and Starting the mod_perl Server
  
  The first thing to do is ensure that Apache was built correctly and
  that it can serve plain HTML files. This helps to minimize the number
  of possible problem areas: once you have confirmed that Apache can
  serve plain HTML files, you know that any problems with mod_perl are
  with mod_perl itself.
  
  Apache should be configured just the same as when it did not have
  mod_perl.  Set the C<Port>, C<User>, C<Group>, C<ErrorLog> and other
  directives in the I<httpd.conf> file.  Use the defaults as suggested,
  customizing only when necessary. Values that will probably need to be
  customized are C<ServerName>, C<Port>, C<User>, C<Group>,
  C<ServerAdmin>, C<DocumentRoot> and a few others.  There are helpful
  hints preceding each directive in the configuration files themselves,
  with further information in Apache's documentation. Follow the advice
  in the files and documentation if in doubt.
  
  When the configuration file has been edited, it is time to start the
  server.  One of the ways to start and stop the server is to use the
  C<apachectl> utility. This can be used to start the server with:
  
    panic# /usr/local/apache/bin/apachectl start
  
  And stop it with:
  
    panic# /usr/local/apache/bin/apachectl stop
  
  Note that if the server is going to listen on port C<80> or another
  privileged port (Any port with a number less than 1024 can be accessed
  only by the programs running as I<root>.), the user executing
  C<apachectl> must be I<root>.
  
  After the server has started, check in the I<error_log> file
  (I</usr/local/apache/logs/error_log> by default) to see if the server
  has indeed started. Do not rely on the status C<apachectl>
  reports. The I<error_log> should contain something like the following:
  
    [Thu Jun 22 17:14:07 2000] [notice] Apache/1.3.12 (Unix) 
    mod_perl/1.24 configured -- resuming normal operations
  
  Now point the browser to I<http://localhost/> or
  I<http://your.server.name/> as configured with the C<ServerName>
  directive. If the C<Port> directive has been set with a value
  different from C<80>, add this port number at the end of the server
  name. For example, if the port is 8080, test the server with
  I<http://localhost:8080/> or I<http://your.server.name:8080/>. The
  infamous I<"It worked"> page should appear in the browser, which is an
  C<index.html> file that C<make install> in the Apache source tree
  installs automatically. If this page does not appear, something went
  wrong and the contents of the I<error_log> file should be checked.
  The path of the error log file is specified in the C<ErrorLog>
  directive section in I<httpd.conf>.
  
  If everything works as expected, shut the server down, open
  I<httpd.conf> with a plain text editor, and scroll to the end of the
  file.  The mod_perl configuration directives are added to the end of
  I<httpd.conf> by convention.  It is possible to place mod_perl's
  configuration directives anywhere in I<httpd.conf>, but adding them at
  the end seems to work best in practice.
  
  Assuming that all the scripts that should be executed by the mod_perl
  enabled server are located in the I</home/stas/modperl> directory, add
  the following configuration directives:
  
    Alias /perl/ /home/stas/modperl/
    
    PerlModule Apache::Registry
    <Location /perl/>
        SetHandler perl-script
        PerlHandler Apache::Registry
        Options +ExecCGI
        PerlSendHeader On
        allow from all
    </Location>
  
  Save the modified file.
  
  This configuration causes every URI starting with I</perl> to be
  handled by the Apache mod_perl module with the handler from the Perl
  module C<Apache::Registry>.
  
  
  =head1 Installing mod_perl for Windows
  
  Apache runs on many flavors of Unix and Unix-like operating systems.
  Version 1.3 introduced a port to the Windows familiy of operating
  systems, often named C<Win32> after the name of the common API.
  Because of many deep differences between Unix and Windows, the Win32
  port of Apache is still branded as beta quality, because it hasn't yet
  reached the stability and performance of the native Unix counterpart.
  
  Another hindrance to using mod_perl on Windows is that current
  versions of Perl are not thread-safe on Win32. As a consequence,
  mod_perl calls to the embedded Perl interpreter must be serialized,
  i.e. executed one at a time. For these reasons, we recommend that
  mod_perl on Windows be used only for testing purposes, not in
  production.
  
  Building mod_perl from source on Windows is a bit of a challenge.
  Development tools such as a C compiler are not bundled with the
  operating system, and most users expect a point-and-click installation
  as with most Windows software.  Additionally, all software packages
  need to be built with the same compiler and compile options. This
  means building Perl, Apache, and mod_perl from source, quite a
  daunting task.
  
  Fortunately, Randy Kobes maintains a Windows distribution of mod_perl
  which includes all the necessary tools, including Perl, Apache, and a
  host of useful CPAN modules. Using this distribution provides an
  out-of-the-box Apache+mod_perl combo in minutes.
  
  The distribution comes with extensive documentation. Take the time to
  read it, particularly if you wish to install the software in a
  location different from the default. In the following installation
  we'll use the default locations and options.
  
  =head2 Download the Windows distribution
  
  Download C<perl-win32-bin-x.x.exe> from
  http://perl.apache.org/distributions.html. This is a self-extracting
  archive, yielding four directories:
  
    Apache
    Perl
    openssl
    readmes
  
  
  =head2 Install the software
  
  Move the C<Apache> and C<Perl> directories to C<C:\>.  Edit
  C<C:\AUTOEXEC.BAT> to install the Perl executable directories in your
  system's search path:
  
    SET PATH=C:\Perl\5.6.1\bin;C:\Perl\5.6.1\bin\MSWin32-x86;"%PATH%"
  
  Then restart Windows for this change to take effect.
  
  
  =head2 Test the Perl installation
  
  Open a DOS prompt window and verify that Perl is installed correctly
  and learn the version number:
  
    C:\> perl -v
    
    This is perl, v5.6.1 built for MSWin32-x86
    
    Copyright 1987-2000, Larry Wall
  
  
  =head2 Start Apache
  
  The distribution comes with a ready-made configuration file for
  mod_perl which we'll use to start Apache. From the C<C:\Apache>
  directory, start Apache:
  
    C:\Apache> apache.exe -f conf\httpd.conf-perl
  
  Now issuing a request for I<http://localhost/> displays the usual
  Apache C<It Worked> page.
  
  =head2 Test mod_perl
  
  The distribution comes with a pre-configured mod_perl handler and
  C<Apache::Registry> directory. We can test our mod_perl enabled server
  by issuing the following requests:
  
    http://localhost/hello
    http://localhost/mod_perl/printenv
  
  We now have a fully-functional mod_perl server. The example scripts
  described in the rest of this chapter can be used with minor
  modifications to file paths and URIs. In particular, change all
  instances of I</home/stas> with C<C:\Apache\>, and change all
  instances of I<http://localhost/perl> with
  I<http://localhost/mod_perl>.
  
  
  =head1 Preparing the Scripts Directory
  
  Now you have to select a directory where all the mod_perl scripts and
  modules will be placed to. We usually use create a directory
  I<modperl> under our home directory, e.g., I</home/stas/modperl>, for
  this purpose. Your mileage may vary.
  
  First create this directory if it doesn't yet exist.
  
    panic% mkdir /home/stas/modperl
  
  What about file permissions?  Remember that when scripts are executed
  from a shell, they are being executed with permissions of the user's
  account. Usually you want to have a read, write and execute access for
  yourself, but only read and execute permissions for the server. When
  the scripts are run by Apache, however, the server needs to be able to
  read and execute them. Apache runs under an account specified by the
  C<User> directive, typically I<nobody>.  If you modify the C<User>
  directive to run the server under your username, e.g.,
  
    User stas
  
  the permissions on all files and directories should usually be
  C<rwx------>, so we can set the directory permissions to:
  
    panic% chmod 0700 /home/stas/modperl
  
  Now, no-one, but you and the server can access the files in this
  directory. You should set the same permissions for all the files you
  place under this directory. (You don't need to set the I<x> bit for
  files that aren't going to be executed, for those mode C<0600> would
  be sufficient.)
  
  If the server is running under account I<nobody>, you have to set the
  permissions to C<rwxr-xr-x> or C<0755> for your files and directories,
  which is insecure since other users on the same machine can read your
  files.
  
    panic# chmod 0755  /home/stas/modperl
  
  If you aren't running the server with your username, you have to set
  these permissions for all the files created under this directory, so
  Apache can read and execute these.
  
  If you need to have an Apache write files you have to set the file
  permissions to C<rwxrwxrwx> or C<0777> which is very undesirable,
  since any user on the same machine can read and write your files. If
  this is the case, you should run the server under your username, and
  then only you and the server have a write access to your files.
  (Assuming of course that other users have no access to your server,
  since if they do, they can access your files through this server.)
  
  In the following examples we assume that you run the server under your
  username, and hence we set the scripts permissions to C<0700>.
  
  =head1 A Sample Apache::Registry Script
  
  One of mod_perl's benefits is that it can run existing CGI scripts
  written in Perl which were previously used under mod_cgi (the standard
  Apache CGI handler). Indeed mod_perl can be used for running CGI
  scripts without taking advantage of any of mod_perl's special
  features, while getting the benefit of the potentially huge
  performance boost.  Here is an example of a very simple CGI-style
  mod_perl script:
  
    mod_perl_rules1.pl
    ------------------
    print "Content-type: text/plain\n\n";
    print "mod_perl rules!\n";
  
  Save this script in the I</home/stas/modperl/mod_perl_rules1.pl> file.
  Notice that the C<#!> line (colloquially known as the I<shebang> line)
  is not needed with mod_perl, although having one causes no problems,
  as can be seen here:
  
    mod_perl_rules1.pl
    ------------------
    #!/usr/bin/perl
    print "Content-type: text/plain\n\n";
    print "mod_perl rules!\n";
  
  Now make the script executable and readable by the server, as
  explained in the previous section.
  
    panic# chmod 0700   /home/stas/modperl/mod_perl_rules1.pl
  
  The I<mod_perl_rules1.pl> script can be tested from the command line,
  since it is essentially a regular Perl script.
  
    panic% perl /home/stas/modperl/mod_perl_rules1.pl
  
  This should produce the following output:
  
    Content-type: text/plain
    
    mod_perl rules!
  
  Make sure the server is running and issue these requests using a
  browser:
  
    http://localhost/perl/mod_perl_rules1.pl
  
  If you see it--B<congratulations>! You have a working mod_perl server.
  
  If something went wrong, go through the installation process again,
  making sure that none of the steps are missed and that each is
  completed successfully. If this does not solve the problem, the
  L<installation chapter|guide::install> will attempt to salvage the
  situation.
  
  If the port being used is not 80, for example 8080, then the port
  number should be included in the URL:
  
    http://localhost:8080/perl/mod_perl_rules1.pl
  
  The C<localhost> approach will work only if the browser is running on
  the same machine as the server. If not, use the real server name for
  this test. For example:
  
    http://your.server.name/perl/mod_perl_rules1.pl
  
  If there is any problem please refer to the I<error_log> file for the
  error messages.
  
  Jumping a little bit ahead, we would like to show the same CGI script
  written using mod_perl API:
  
    mod_perl_rules2.pl
    ------------------
    my $r = shift;
    $r->send_http_header('text/plain');
    $r->print("mod_perl rules!\n");
  
  mod_perl API needs a request object C<$r> to communicate with
  Apache. The script gets this object first thing, after that it uses
  the object to send the HTTP header and print the irrefutable fact
  about mod_perl's coolness.
  
  This script generates the same output as the previous one.
  
  As you can see it's not much harder to write your code in mod_perl
  API, all you need to know is the API, but the concepts are the
  same. As we will show in the later chapters, usually you will want to
  use mod_perl API for a better performance or when you need a
  functionality that plain Perl API doesn't provide.
  
  =head2 Porting Existing CGI Scripts to run under mod_perl
  
  Now it is time to move any existing CGI scripts from the
  I</somewhere/cgi-bin> directory to I</home/stas/modperl>. Once moved
  they should run much faster when requested from the newly configured
  base URL (I</perl/>). For example, a CGI script called I<test.pl> that
  was previously accessed as I</cgi-bin/test.pl> can now be accessed
  under mod_perl as I</perl/test.pl>.
  
  Some of the scripts might not work immediately and may require some
  minor tweaking or even a partial rewrite to work properly with
  mod_perl. We will talk in-depth about these things in the L<Coding
  chapter|guide::porting>. Most scripts that have been written with care
  and especially developed with enabled warnings and the C<strict>
  pragma will probably work without any modifications at all.
  
  A quick solution that avoids most rewriting or editing of existing
  scripts that do not run properly under C<Apache::Registry> is to run
  them under C<Apache::PerlRun>. This can be achieved by simply
  replacing C<Apache::Registry> with C<Apache::PerlRun> in
  I<httpd.conf>.  Put the following configuration directives instead in
  I<httpd.conf> and restart the server:
  
    Alias /perl/ /home/stas/modperl/
    PerlModule Apache::PerlRun
    <Location /perl/>
        SetHandler perl-script
        PerlHandler Apache::PerlRun
        Options ExecCGI
        PerlSendHeader On
        allow from all
    </Location>
  
  Almost every script should now run without problems; the few
  exceptions will almost certainly be due to the few minor limitations
  that mod_perl or its handlers have, but these are all solvable and
  covered in L<Coding chapter|guide::porting>.
  
  C<Apache::PerlRun> is usually useful in the transition period, while
  the scripts are being cleaned up to run properly under
  C<Apache::Registry>. Though it gives you a significant speedup over
  mod_cgi, it's still not as fast as C<Apache::Registry> and mod_perl
  handlers.
  
  =head1 A Simple Apache Perl Content Handler
  
  As we mentioned in the beginning of this chapter, mod_perl lets you
  run both scripts and handlers. The previous example showed a script,
  since that is probably the most familiar approach to web programming,
  but the more advanced use of mod_perl involves writing handlers. Have
  no fear: writing handlers is almost as easy as writing scripts and
  offers a level of access to Apache's internals that is simply not
  possible with conventional CGI scripts.
  
  To create a mod_perl handler module, all that is necessary is to wrap
  the code that would have been the body of a script into a C<handler>
  subroutine, add a statement to return the status to the server when
  the subroutine has successfully completed, and add a package
  declaration at the top of the code.
  
  Just as with scripts, the familiar CGI API may be used:
  
    ModPerl/Rules1.pm
    -----------------
    package ModPerl::Rules1;
    use Apache::Constants qw(:common);
    
    sub handler {
        print "Content-type: text/plain\n\n";
        print "mod_perl rules!\n";
        return OK; # We must return a status to mod_perl
    }
    1; # This is a perl module so we must return true to perl
  
  Alternatively, the mod_perl API can be used. This API provides almost
  complete access to the Apache core.  In the simple example shown,
  using either approach is fine, but when lower level access to Apache
  is required the mod_perl API must be used.
  
    ModPerl/Rules2.pm
    ----------------
    package ModPerl::Rules2;
    use Apache::Constants qw(:common);
    
    sub handler {
        my $r = shift;
        $r->send_http_header('text/plain');
        $r->print("mod_perl rules!\n");
        return OK; # We must return a status to mod_perl
    }
    1; # This is a perl module so we must return true to perl
  
  Create a directory called I<ModPerl> under one of the directories in
  C<@INC> (e.g. under I</usr/lib/perl5/site_perl/5.005/>), and put
  I<Rules1.pm> and I<Rules2.pm> into it (Note that you will need a
  I<root> access in order to do that.). The files should include the
  code from the above examples.  To find out what the C<@INC>
  directories are, execute:
  
    panic% perl -le 'print join "\n", @INC'
  
  On our machine it reports:
  
    /usr/lib/perl5/5.00503/i386-linux
    /usr/lib/perl5/5.00503
    /usr/lib/perl5/site_perl/5.005/i386-linux
    /usr/lib/perl5/site_perl/5.005
    .
  
  So on our machine, we might place the files in the directory
  I</usr/lib/perl5/site_perl/5.005/ModPerl>. By default when you work as
  I<root>  the files are created with permissions allowing everybody to
  read them, so here we don't have to adjust the file permissions, since
  the server only needs to be able to read those.
  
  Now add the following snippet to I</usr/local/apache/conf/httpd.conf>
  to configure mod_perl to execute the C<ModPerl::Rules::handler>
  subroutine whenever a request to I<mod_perl_rules1> is made:
  
    PerlModule ModPerl::Rules1
    <Location /mod_perl_rules1>
       SetHandler perl-script
       PerlHandler ModPerl::Rules1
       PerlSendHeader On
    </Location>
  
  Now issue a request to:
  
    http://localhost/mod_perl_rules1
  
  and just as with the I<mod_perl_rules.pl> scripts,
  
    mod_perl rules!
  
  should be rendered as the response. (Don't forget to include the port
  number if not using port 80; from now on we will assume this is done,
  e.g.  http://localhost:8080/mod_perl_rules1.)
  
  To test the second module C<ModPerl::Rules2> add a similar
  configuration, while replacing all 1's with 2's:
  
    PerlModule ModPerl::Rules2
    <Location /mod_perl_rules2>
       SetHandler perl-script
       PerlHandler ModPerl::Rules2
       PerlSendHeader On
    </Location>
  
  As we will see later in L<Configuration chapter|guide::config> you can
  remove the C<PerlSendHeader> directive for this particular module.
  
  And to test use the URI:
  
    http://localhost/mod_perl_rules2
  
  You should see the same response from the server as we have seen when
  issuing a request for the former mod_perl handler.
  
  
  =head1 Is This All we Need to Know About mod_perl?
  
  Obviously the next question is: I<"Is this all I need to know about
  mod_perl?">.
  
  The answer is: "Yes and No".
  
  The I<Yes> part:
  
  =over
  
  =item *
  
  Just like with Perl, really cool stuff can be written even with very
  little mod_perl knowledge. With the basic unoptimized setup presented
  in this chapter, visitor counters and guest books and any other CGI
  scripts will run much faster and amaze friends and colleagues, usually
  without changing a single line of code.
  
  =back
  
  The I<No> part:
  
  =over
  
  =item *
  
  A 50 times improvement in guest book response times is great--but when
  deploying a very heavy service with thousands of concurrent users, a
  delay of even a few milliseconds might lose a customer, and probably
  many of them.
  
  =back
  
  Of course when testing a single script with the developer as the only
  user, squeezing yet another millisecond from the response time seems
  unimportant.  But it becomes a real issue when these milliseconds add
  up at the production site, with hundreds or thousands of users
  concurrently generating requests to various scripts on the site. Users
  are not merciful nowadays. If there is another site that provides the
  same kind but a significantly faster service, chances are that users
  will switch to the competing site.
  
  Testing scripts on an unloaded machine can be very misleading,
  Everything might seem so perfect. But when they are moved into a
  production machine, things do not behave as well as they did on the
  development box. For example, the production machine may run out of
  memory on very busy services. In the L<performance tuning
  chapter|guide::performance> it will be explained how to optimize code
  to use less memory and how to make as much memory as possible shared.
  
  Debugging is something that some developers prefer not to think about,
  since the process can be very tedious at times. Learning how to make
  the debugging process simpler and efficient is essential for web
  programmers. This task can be difficult enough when debugging CGI
  scripts, but it can be even more complicated with mod_perl. The
  L<Debugging Chapter|guide::debug> explains how to approach debugging
  in the mod_perl environment.
  
  mod_perl has many features unavailable under mod_cgi when working with
  databases. Amongst others the most important are persistent database
  connections.  Persistent database connections require a slightly
  different approach and this is explained in the L<Databases
  chapter|guide::databases>.
  
  Most web services, especially those which are aimed at an
  international audience, must run non-stop 24x7. But at the same time
  new scripts may need to be added, old ones removed, and the server
  software will need upgrades and security fixes. And if the server goes
  down, fast recovery is essential. These issues are considered in
  the L<Controlling your server chapter|guide::control>.
  
  Finally, the most important aspect of mod_perl is the Apache Perl API,
  which allows intervention at any or every stage of request
  processing. This provides incredible flexibility, allowing the
  creation of scripts and processes which would simply be impossible
  with mod_cgi.
  
  There are many more things to learn about mod_perl and web programming
  in general. The rest of this guide will attempt to provide as much
  information as possible about these and other related matters.
  
  
  
  
  =head1 References
  
  =over
  
  =item *
  
  CPAN is the Comprehensive Perl Archive Network. Comprehensive: its aim
  is to contain all the Perl material you will need. Archive: close to a
  gigabyte in size at the time of this writing. Network: CPAN is
  mirrored at more than one hundred sites around the world.
  
  The CPAN home page: http://cpan.org/
  
  =item *
  
  The libwww-perl distribution is a collection of Perl modules and
  programs which provide a simple and consistent programming interface
  (API) to the World Wide Web. The main focus of the library is to
  provide classes and functions that facilitate writing WWW clients,
  thus libwww-perl is said to be a WWW client library. The library also
  contains modules that are of more general use, as well as some useful
  programs.
  
  The libwww-perl home page:  http://www.linpro.no/lwp/
  
  =back
  
  
  
  =cut
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: docs-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: docs-cvs-help@perl.apache.org