Tendo em vista que os scripts CGI são lentos e ocupam mais
recursos sob carga pesada, em um mundo ideal você não executará
scripts CGI quando mod_perl estiver funcionando em seu
sistema.
Porém a realidade é que os administradores são pessoas ocupadas
e portar algo que já está funcionando é com freqüência uma tarefa
ignorada porque outro trabalho mais sério está esperando em algum
lugar.
Felizmente mod_perl lhe permite executar seus scripts CGI usando
um módulo mod_perl default denominado Apache::Registry.pm.
Desse modo você pode executar seus scripts CGI sob mod_perl
imediatamente. Aqui está como fazê-lo.
1. No arquivo httpd.conf, crie um nome alternativo
/apps/ para indicar o diretório do seu script CGI, adicionando a
linha a seguir:
Alias /apps/ "/www/meusite/cgi-bin"
Certifique-se de trocar /www.meusite/cgi-bin pelo diretório de
scripts CGI que for apropriado ao seu sistema.
2. Informe ao Apache para carregar o módulo
Apache:Registry durante a inicialização, adicionando a
linha a seguir em httpd.conf:
PerlModule Apache::Registry
3. Informe ao Apache para executar todos os scripts via
Apache::Registry para o diretório /apps/, acrescentando este
segmento de configuração em httpd.conf:
<Location /apps>
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
</Location>
4. Reinicie o servidor Apache usando o comando:
# /usr/local/apache/bin/apachectl restart
5. Acesse um servidor CGI que utilize um navegador web,
empregando:
http://nome_do_seu_servidor/apps/nome_de_script
Se tiver uma diretiva ScriptAlias configurada de modo
a apontar /cgi-bin/ para /www/meusite/cgi-bin (ou qualquer que
seja o diretório de scripts CGI no seu sistema), você poderá
acessar os scripts CGI como o script "CGI" usando o mesmo script
com mod_perl:
http://nome_do_seu_servidor/apps/nome_de_script
Esse último código tem a vantagem de não gerar um novo processo
de CGI a cada solicitação, permitindo que ela funcione mais rápido.
Observe que a variável de ambiente mod_perl pode distinguir o
modo como um script está sendo executado (CGI ou mod_perl).
Considere, por exemplo, o segmento de código a seguir:
if ($ENV(MOD_PERL) ne '') {
# Funciona como um script mod_perl, como um módulo mod_perl
# nativo ou um script de execução de Apache::Registry
}else {
# Script CGI sendo executado via mod_cgi como um
# processo separado
}
A instrução condicional anterior detecta como um script está
sendo executado. Os scripts no diretório "apps" serão executados
por meio do módulo Apache::Registry. Isso significa que você
pode remover completamente o módulo mod_cgi de seu sistema
recompilando o Apache com a opção --disable-module=cgi.
Vale lembrar que o mod_perl habilitado também onera carga extra ao Apache, pois os childs do servidor são executados com interpretadores Perl embutidos, porém no comparativo entre CGI e mod_perl, a segunda opção ganha com folga é claro :)