How do we know whether the configuration made inside <Perl>sections was correct?
First we need to check the validity of the Perl syntax. To do that, we should turn it into a Perl script, by adding #!perl at the top of the section:
<Perl> #!perl # ... code here ... __END__ </Perl>
Notice that #!perl and _ _END_ _ must start from the column zero. Also, the same rules as we saw earlier with validation of the startup file apply: if the <Perl>section includes some modules that can be loaded only when mod_perl is running, this validation is not applicable.
Now we may run:
perl -cx httpd.conf
If the Perl code doesn't compile, the server won't start. If the Perl code is syntactically correct, but the generated Apache configuration is invalid, <Perl>sections will just log a warning and carry on, since there might be globals in the section that are not intended for the configuration at all.
If you have more than one <Perl>section, you will have to repeat this procedure for each section, to make sure they all work.
To check the Apache configuration syntax, you can use the variable $Apache::Server::StrictPerlSections, added in mod_perl Version 1.22. If you set this variable to a true value:
$Apache::Server::StrictPerlSections = 1;
then mod_perl will not tolerate invalid Apache configuration syntax and will croak (die) if it encounters invalid syntax. The default value is 0. If you don't set $Apache::Server::StrictPerlSections to 1, you should localize variables unrelated to configuration with my( ) to avoid errors.
If the syntax is correct, the next thing we need to look at is the parsed configuration as seen by Perl. There are two ways to see it. First, we can dump it at the end of the section:
<Perl> use Apache::PerlSections ( ); # code goes here print STDERR Apache::PerlSections->dump( ); </Perl>
Here, we load the Apache::PerlSections module at the beginning of the section, and at the end we can use its dump( ) method to print out the configuration as seen by Perl. Notice that only the configuration created in the section will be seen in the dump. No plain Apache configuration can be found there.
For example, if we adjust this section (parts of which we have seen before) to dump the parsed contents:
<Perl> use Apache::PerlSections ( ); $User = getpwuid($>) || $>; $Group = getgrgid($)) || $); push @Alias, [qw(/private /home/httpd/docs/private)]; my $doc_root = "/home/httpd/docs"; push @{ $VirtualHost{'10.0.0.10'} }, { ServerName => 'president.intranet', DocumentRoot => "$doc_root/president", ServerAdmin => 'webmaster@president.intranet', Location => { "/private" => { Options => 'Indexes', AllowOverride => 'None', AuthType => 'Basic', AuthName => '"Do Not Enter"', AuthUserFile => 'private/.htpasswd', Require => 'valid-user', }, "/perlrun" => { SetHandler => 'perl-script', PerlHandler => 'Apache::PerlRun', PerlSendHeader => 'On', Options => '+ExecCGI', }, }, }; print STDERR Apache::PerlSections->dump( ); </Perl>
This is what we get as a dump:
package Apache::ReadConfig; #hashes: %VirtualHost = ( '10.0.0.10' => [ { 'Location' => { '/private' => { 'AllowOverride' => 'None', 'AuthType' => 'Basic', 'Options' => 'Indexes', 'AuthUserFile' => 'private/.htpasswd', 'AuthName' => '"Do Not Enter"', 'Require' => 'valid-user' }, '/perlrun' => { 'PerlHandler' => 'Apache::PerlRun', 'Options' => '+ExecCGI', 'PerlSendHeader' => 'On', 'SetHandler' => 'perl-script' } }, 'DocumentRoot' => '/home/httpd/docs/president', 'ServerAdmin' => 'webmaster@president.intranet', 'ServerName' => 'president.intranet' } ] ); #arrays: @Alias = ( [ '/private', '/home/httpd/docs/private' ] ); #scalars: $Group = 'stas'; $User = 'stas'; 1; __END__
You can see that the configuration was created properly. The dump places the output into three groups: arrays, hashes, and scalars. The server was started as user stas, so the $User and $Groupsettings were dynamically assigned to the user stas.
A different approach to seeing the dump at any time (not only during startup) is to use the Apache::Status module (see Chapter 9). First we store the Perl configuration:
<Perl> $Apache::Server::SaveConfig = 1; # the actual configuration code </Perl>
Now the Apache::ReadConfig namespace (in which the configuration data is stored) will not be flushed, making configuration data available to Perl modules at request time. If the Apache::Status module is configured, you can view it by going to the /perl-status URI (or another URI that you have chosen) in your browser and selecting "Perl Section Configuration" from the menu. The configuration data should look something like that shown in Figure 4-1.
Since the Apache::ReadConfig namespace is not flushed when the server is started, you can access the configuration values from your code—the data resides in the Apache::ReadConfig package. So if you had the following Perl configuration:
<Perl> $Apache::Server::SaveConfig = 1; $DocumentRoot = "/home/httpd/docs/mine"; </Perl>
at request time, you could access the value of $DocumentRoot with the fully qualified name $Apache::ReadConfig::DocumentRoot. But usually you don't need to do this, because mod_perl provides you with an API to access to the most interesting and useful server configuration bits.
 
Continue to: