<chapt id="s-apache">Apache
 <p>
Esta capítulo documenta a configuração, personalização, introdução aos 
mecanismos de autenticação e controle de acesso do <prgn>Apache</prgn>, 
sistema proxy, virtual hosting, e exemplos de configuração do 
servidor <prgn>httpd</prgn>. Ele não tem como objetivo ser uma referência 
completa de configuração, mas sim abordar didaticamente o assunto. 


<sect id="s-apache-intro">Introdução
 <p>
O servidor web é um programa responsável por disponibilizar páginas, fotos, 
ou qualquer outro tipo de objeto ao navegador do cliente. Ele também pode 
operar recebendo dados do cliente, processando e enviando o resultado 
para que o cliente possa tomar a ação desejada (como em aplicações 
CGI's, banco de dados web, preenchimento de formulários, etc). 
 <p>
O <prgn>Apache</prgn> é um servidor Web extremamente configurável, robusto e 
de alta performance desenvolvido por uma equipe de voluntários 
(conhecida como <tt>Apache Group</tt>) buscando criar um servidor web com muitas 
características e com código fonte disponível gratuitamente via Internet. 
Segundo a Netcraft (<url id="&url-netcraft-www;">), o 
<prgn>Apache</prgn> é mais usado que todos os outros servidores web do mundo 
juntos. 
 <p>
Este capítulo não tenta ser um guia completo ao <prgn>Apache</prgn>, mas 
tentará mostrar como sua estrutura é organizada, as diretivas principais de 
configuração, diretivas de segurança, virtual hosting, proxy, o uso de 
utilitários de gerenciamento do servidor, como personalizar algumas partes 
do servidor e programas úteis de terceiros para análise e diagnóstico do 
servidor web. Não deixe também de ver <ref id="s-apache-exemplo"> pois 
contém diretivas básicas de configuração comentadas e explicações 
interessante e faz parte do aprendizado. 
  

<sect1 id="s-apache-versao">Versão
 <p>
É assumido que esteja usando a versão 1.3.22 do <prgn>apache</prgn>. As explicações 
contidas aqui podem funcionar para versões posteriores, mas é recomendável que 
leia a documentação sobre modificações no programa (changelog) em busca de 
mudanças que alterem o sentido das explicações fornecidas aqui. 


<sect1 id="s-apache-historia">Um resumo da História do Apache
 <p>
O <prgn>Apache</prgn> tem como base o servidor web <prgn>NCSA 1.3</prgn> 
(<em>National Center of Supercomputing Applications</em>), que foi 
desenvolvido por Rob McCool. 
Quando Rob deixou o NCSA, o desenvolvimento foi interrompido, assim 
muitos desenvolvedores buscaram personalizar sua própria versão do NCSA ou 
adicionar mais características para atender as suas necessidades. Neste 
momento começa a história do <prgn>Apache</prgn> com <em>Brian Behlendorf</em> 
e <em>Cliff Skolnick</em> abrindo uma lista de discussão para interessados 
no desenvolvimento, conseguindo espaço em um servidor doado pela 
<em>HotWired</em> e trocando patches corrigindo problemas, adicionando 
recursos e discutindo idéias com outros desenvolvedores e hackers 
interessados neste projeto. 
 <p>
A primeira versão oficial do <prgn>Apache</prgn> foi a 0.6.2, lançada em 
Abril de 1995 (neste período a NCSA retomava o desenvolvimento de seu 
servidor web, tendo como desenvolvedores <em>Brandon Long</em> e 
<em>Beth Frank</em> que também se tornaram membros especiais do grupo 
<prgn>Apache</prgn>, compartilhando idéias sobre seus projetos).
 <p>
Nas versões 2.x do Apache, a escalabilidade do servidor foi ampliada suportando
as plataformas <prgn>Win32</prgn> (não obtendo o mesmo desempenho que em 
plataformas UNIX mas sendo melhorado gradativamente). 

  
<sect1 id="s-apache-contribuindo">Enviando Correções/Contribuindo com o projeto
 <p>
Um formulário está disponível na Web para o envio de correções/sugestões
em <tt><url id="&url-apache-bug-report;"></tt>. Uma lista de 
anuncio sobre o <prgn>Apache</prgn> está disponível em 
<email>apache-announce@apache.org</email> que divulgam correções, novas 
versões e realização de eventos. 
 <p>
Mais detalhes sobre o desenvolvimento do Apache podem ser visualizadas na 
URL <tt><url id="&url-apache-dev;"></tt>.


<sect1 id="s-apache-caracteristicas">Características do Apache
 <p>
Abaixo estão algumas características que fazem esse servidor web o preferido entre
os administradores de sistemas:
<list compact>
 <item>
Possui suporte a scripts cgi usando linguagens como <em>Perl, PHP, Shell Script, ASP, etc</em>. 
 <item>
Suporte a autorização de acesso podendo ser especificadas restrições de 
acesso separadamente para cada endereço/arquivo/diretório acessado no servidor.
 <item>
Autenticação requerendo um nome de usuário e senha válidos para acesso a 
alguma página/sub-diretório/arquivo (suportando criptografia via Crypto e MD5). 
 <item>
Negociação de conteúdo, permitindo a exibição da página Web no idioma 
requisitado pelo Cliente Navegador. 
 <item>
Suporte a tipos mime.
 <item>
Personalização de logs.
 <item>
Mensagens de erro.
 <item>
Suporte a virtual hosting (é possível servir 2 ou mais páginas com endereços/
portas diferentes através do mesmo processo ou usar mais de um processo para 
controlar mais de um endereço).
 <item>
Suporte a IP virtual hosting.
 <item>
Suporte a name virtual hosting.
 <item>
Suporte a servidor Proxy ftp e http, com limite de acesso, caching (todas 
flexivelmente configuráveis).
 <item>
Suporte a proxy e redirecionamentos baseados em URLs para endereços Internos.
 <item>
Suporte a criptografia via SSL,Certificados digitais
 <item>
Módulos DSO (Dynamic Shared Objects) permitem adicionar/remover funcionalidades 
e recursos sem necessidade de recompilação do programa.
</list>


<sect1 id="s-apache-ficha">Ficha técnica
 <p>
Pacote: <package>apache</package>
 <p>
Utilitários:
<list compact>
 <item>
<tt>apache</tt> - Servidor Web Principal
 <item>
<tt>apachectl</tt> - Shell script que faz interface com o <prgn>apache</prgn> 
de forma mais amigável
 <item>
<tt>apacheconfig</tt> - Script em Perl para configuração interativa básica 
do <prgn>Apache</prgn>
 <item>
<tt>htpasswd</tt> - Cria/Gerencia senhas criptografadas Crypto/MD5
 <item>
<tt>htdigest</tt> - Cria/Gerencia senhas criptografadas Crypto/MD5
 <item>
<tt>dbmmanage</tt> - Cria/Gerencia senhas em formato DBM (Perl)
 <item>
<tt>logresolve</tt> - Faz um DNS reverso dos arquivos de log do 
<prgn>Apache</prgn> para obter o endereço de hosts com base nos endereços IP's.
 <item>
<tt>ab</tt> - Apache Benchmarcking - Ferramenta de medida de desempenho do 
servidor Web Apache.
</list>

Por padrão, os arquivos de configuração do <prgn>Apache</prgn> residem no diretório 
<file>/etc/apache</file>: 
<taglist compact>
 <tag>httpd.conf</tag>
 <item>
Arquivo de configuração principal do <prgn>Apache</prgn>, possui diretivas 
que controlam a operação do daemon servidor. Um arquivo de configuração
alternativo pode ser especificado através da opção "-f" da linha de 
comando.

 <tag>srm.conf</tag>
 <item>
Contém diretivas que controlam a especificação de documentos que o 
servidor oferece aos clientes. O nome desse arquivo pode ser substituído 
através da diretiva ResourceConfig no arquivo principal de configuração.

 <tag>access.conf</tag>
 <item>
Contém diretivas que controlam o acesso aos documentos. O nome desse 
arquivo pode ser substituído através da diretiva <em>AccessConfig</em> 
no arquivo principal de configuração. 
</taglist>

O servidor Web lê os arquivos acima na ordem que estão especificados 
(<file>httpd.conf</file>, <file>srm.conf</file> e <file>access.conf</file>). 
As configurações também podem ser especificadas diretamente no arquivo 
<file>httpd.conf</file>. Note que não é obrigatório usar os arquivos 
<file>srm.conf</file> e <file>access.conf</file>, mas isto proporciona 
uma melhor organização das diretivas do servidor, principalmente quando 
se tem um grande conjunto de diretivas. Um exemplo comentado destes 
três arquivos de configuração é encontrado em <ref id="s-apache-exemplo">.


<sect1 id="s-apache-hwreq">Requerimentos
 <p>
A máquina mínima para se rodar um servidor <prgn>Apache</prgn> para 
atender a uma rede padrão 10MB/s é um Pentium 90, 24MB de RAM, um HD 
com um bom desempenho e espaço em disco considerável de acordo com o 
tamanho projetado de seu servidor web (considerando seu crescimento). 
 <p>
Uma configuração mais rápida para redes 100MB/s teria como 
processador um Cyrix MX ou Intel Pentium MMX como plataforma 
mínima (Cyrix é o recomendado pelo alto desempenho no 
processamento de strings), barramento de HD SCSI com 
uma boa placa controladora (Adaptec 19160 ou superior) com 
64MB de RAM no mínimo. 


<sect1 id="s-apache-logs">Arquivos de log criados pelo Apache
 <p>
O servidor <prgn>httpd</prgn> grava seus arquivos de log geralmente 
em <file>/var/log/apache</file>, não é possível descrever os arquivos 
de logs usados porque tanto seus nomes como conteúdo podem ser personalizados
no arquivo <file>httpd.conf</file>. Mesmo assim, os arquivos de logs 
encontrados na instalação padrão do <prgn>Apache</prgn> são os seguintes:
<list compact>
 <item>
<file>access.log</file> - Registra detalhes sobre o acesso as páginas do servidor 
<prgn>httpd</prgn>.
 <item>
<file>error.log</file> - Registra detalhes saber erros de acesso as páginas ou 
erros internos do servidor. 
 <item>
<file>agent.log</file> - Registra o nome do navegador do cliente (campo 
<var>UserAgent</var> do cabeçalho http). 
</list>
Mais referências podem ser encontradas em <ref id="s-apache-log">. Um 
bom programa para geração de estatísticas de acesso com gráficos é o 
<ref id="s-apache-log-webalizer">. 


<sect1 id="s-apache-install">Instalação
 <p>
<tt>apt-get install apache apache-doc</tt>
 <p>
(o pacote <package>apache-doc</package> contém a documentação de referencia do 
<prgn>Apache</prgn>, é recomendável instala-lo se estiver curioso e deseja 
entender melhor seu funcionamento ou consultar diretivas). 


<sect1 id="s-apache-rodando">Iniciando o servidor/reiniciando/recarregando a 
configuração
 <p>
O <prgn>Apache</prgn> pode ser executado tanto como um servidor 
<em>Inetd</em> ou como um <em>Daemon</em>. 
A inicialização de programas pelo <em>Inetd</em> é uma boa estratégia quando 
você precisa de um controle de acesso básico (o fornecido pelo <prgn>tcpd</prgn>), 
e o serviço é pouco usado na máquina. 
 <p>
A segurança de um serviço iniciado pelo <prgn>inetd</prgn> pode ser 
substituída e melhorada por um firewall bem configurado, garantindo 
facilidades extras como um relatório de tráfego para a porta do servidor 
web, por exemplo. Mesmo assim se o servidor <prgn>Apache</prgn> estiver 
rodando como daemon e estiver ocioso, ele será movido para swap liberando 
a memória RAM para a execução de outros programas. 
 <p>
Neste capítulo será assumido seu funcionamento do <prgn>Apache</prgn> 
como Daemon, que é o método de funcionamento recomendado para sites de 
grande tráfego onde ele é freqüentemente requisitado e considerado um 
serviço crítico. 
 <p>
O método padrão para iniciar programas como daemons na <prgn>Debian</prgn> 
é através dos diretórios <file>/etc/rc?.d</file>. Cada diretório deste contém 
os programas que serão executados/interrompidos no nível de execução "?" 
(<file>rc1.d/</file>, <file>rc2.d/</file> ...). 

O conteúdo destes diretórios são links para os scripts originais em 
<file>/etc/init.d/programa</file>, o nosso programa alvo é 
<file>/etc/init.d/apache</file>. 
O <file>/etc/init.d/apache</file> aceita os seguintes parâmetros: 
<list compact>
 <item><tt>start</tt> - Inicia o <prgn>Apache</prgn>
 <item><tt>stop</tt> - Finaliza o <prgn>Apache</prgn>
 <item><tt>restart</tt> - Reinicia o <prgn>Apache</prgn>, efetuando uma pausa 
de 5 segundos entre a interrupção do seu funcionamento e reinicio.
 <item><tt>reload</tt> - Recarrega os arquivos de configuração do <tt>Apache</tt>, 
as alterações entram em funcionamento imediatamente.
 <item><tt>reload-modules</tt> - Recarrega os módulos. Basicamente é feito um 
restart no servidor.
 <item><tt>force-reload</tt> - Faz a mesma função que o reload         
</list>

Para reiniciar o <prgn>Apache</prgn> usando o <file>/etc/init.d/apache</file>, 
digite:
 <p>
./etc/init.d/apache restart
 <p>
ou 
 <p>
<tt>cd /etc/init.d;./apache restart</tt>
 <p>
Na realidade, o que o <file>/etc/init.d/apache</file> faz é interagir 
diretamente com o shell script <prgn>apachectl</prgn>.
 <p>
O <prgn>apachectl</prgn> recebe os parâmetros enviados pelo usuário e 
converte para sinais que serão enviados para o binário <prgn>apache</prgn>. Da 
mesma forma ele verifica os códigos de saída do <prgn>apache</prgn> e os 
transforma em mensagens de erro legíveis para o usuário comum.
 

Os seguintes comandos são aceitos pelo <prgn>apachectl</prgn>: 
<list compact>
 <item><tt>httpd-server/start</tt> - Inicia o <prgn>Apache</prgn>
 <item><tt>stop</tt> - Finaliza o <prgn>Apache</prgn> (enviando um sinal TERM)
 <item><tt>restart</tt> - Reinicia o <prgn>Apache</prgn> (enviando um sinal HUP)
 <item><tt>graceful</tt> - Recarrega os arquivos de configuração do 
 <prgn>Apache</prgn> (enviando um sinal USR1)
 <item><tt>fullstatus</tt> - Mostra o status completo do servidor 
<prgn>Apache</prgn> (requer o <prgn>lynx</prgn> e o módulo <em>mod_status</em> 
carregado).
 <item><tt>status</tt> - Mostra o status do processo do servidor 
 <prgn>Apache</prgn> (requer o <prgn>lynx</prgn> e o módulo <em>mod_status</em> 
 carregado).
 <item><tt>configtest</tt> - Verifica se a sintaxe dos arquivos de 
configuração está OK (executa um <tt>apache -t</tt>).
</list>


<sect1 id="s-apache-opcoescmd">Opções de linha de comando
 <p>
<list compact>
 <item>
<tt>-D nome</tt> - define um nome que será usado na diretiva &lt;IfDefine nome&gt;.
 <item>
<tt>-d diretório</tt> - especifica o diretório <em>ServerRoot</em> (substitui o 
do arquivo de configuração).
 <item>
<tt>-f arquivo</tt> - especifica um arquivo <em>ServerConfigFile</em> alternativo.
 <item>
<tt>-C "diretiva"</tt> - processa a diretiva antes de ler os arquivo de configuração.
 <item>
<tt>-c "diretiva"</tt> - processa a diretiva depois de ler os arquivos de 
configuração.
 <item>
<tt>-v</tt> - mostra a versão do programa.
<item>
<tt>-V</tt> - mostra opções usadas na compilação do <prgn>Apache</prgn>.
 <item>
<tt>-h</tt> - Mostra o help on-line do programa
 <item>
<tt>-l</tt> - lista módulos compilados junto com o Apache (embutidos)
 <item>
<tt>-L</tt> - lista diretivas de configurações disponíveis
 <item>
<tt>-S</tt> - Mostra configurações de Virtual Hosting
 <item>
<tt>-t</tt> - executa a checagem de sintaxe nos arquivos de configuração 
do Apache (incluindo a checagem da diretiva <em>DocRoot</em>). 
 <item>
<tt>-T</tt> - executa a checagem de sintaxe nos arquivos de configuração 
do <prgn>Apache</prgn> (menos da diretiva <em>DocRoot</em>).
</list>


<sect id="s-apache-port">Configurando a porta padrão do Apache
 <p>
Use a diretiva <em>Port</em> para configurar a porta padrão que o 
<prgn>Apache</prgn> receberá requisições por padrão. A diretiva 
<em>Listen</em> também é usada para ajustar o endereço/portas 
alternativas (usadas também em <tt>Virtual Hosts</tt>) e substituirá 
as definições de <em>Port</em>(veja <ref id="s-apache-listen"> para 
detalhes).
<![ %OBS [
 <p>
<strong>OBS:</strong>: Somente uma diretiva <em>Port</em> e um argumento
poderão ser especificados. Para mais controle sobre as portas do sistema
use a diretiva <em>Listen</em>. ]]>


<sect id="s-apache-adicpagina">Adicionando uma página no Apache
 <p>
Existem dois tipos de páginas que podem ser 
adicionadas ao <prgn>Apache</prgn>: a página raíz e 
sub-páginas. 
<taglist>
 <tag><em>Página Raíz</em></tag>
 <item>
A página raíz é especificada através da diretiva <em>DocumentRoot</em> e será 
mostrada quando se entrar no domínio principal, como 
<file>&url-manual-www;</file>. Na configuração padrão do 
<prgn>Apache</prgn>, <em>DocumentRoot</em> aponta para o diretório 
<file>/var/www</file>. Este diretório será assumido como 
<strong>raíz</strong> caso os diretórios não sejam iniciados por 
uma <file>/</file>:
<list compact>
 <item><file>home/focalinux</file> - Aponta para <file>/var/www/home/focalinux</file>
 <item><file>/home/focalinux</file> - Aponta para <file>/home/focalinux</file>
</list>
Este diretório deve conter um arquivo de 
índice válido (especificado pela diretiva <em>DocumentIndex</em> no 
<file>srm.conf</file>) e permissões de acesso válidas no arquivo
<file>access.conf</file> para autorizar o acesso as páginas 
em <file>/var/www</file> (veja <ref id="s-apache-acesso-restr"> 
para detalhes). 

 
 <tag>Sub-páginas</tag>
 <item>
Sub páginas são armazenadas abaixo do diretório da <em>Página raíz</em>, 
como <file>&url-manual-www;/download</file>. Elas podem ser 
um subdiretório da página principal em <file>/var/www</file> ou 
serem criadas através da diretiva <em>Alias</em> no arquivo
<file>srm.conf</file>. Caso seja um sub-diretório, as permissões 
de acesso de <file>/var/www</file> serão herdadas para este 
subdiretório, mas também poderão ser modificadas com a especificação
de uma nova diretiva de acesso. 
 <p>
Através da diretiva <em>Alias</em> a página pode estar localizada em 
outro diretório do disco (até mesmo outro sistema de arquivos) e as 
permissões de acesso deverão ser definidas para aquela página. Para 
criar um endereço <file>&url-manual-www;/iniciante</file> que 
aponta para o diretório <file>/home/focalinux/download/iniciante</file>
no disco local, basta usar a seguinte diretiva no <file>srm.conf</file>: 
<example>
Alias /iniciante /home/focalinux/download/iniciante
</example>
Pode ser necessário permitir o acesso a nova página caso o servidor 
tenha uma configuração restritiva por padrão (veja 
<ref id="s-apache-acesso-restr"> para detalhes). 
Após isto, faça o servidor <prgn>httpd</prgn> re-ler os arquivos de configuração 
ou reinicia-lo. Após isto, a página <file>/home/focalinux/download/iniciante
</file> estará acessível via <file>&url-manual-www;/iniciante</file>.
<![ %OBS [
 <p>
<strong>OBS:</strong> Caso inclua uma <file>/</file> no diretório que será 
acessível via URL, o endereço somente estará disponível caso você entre com 
<file>/</file> no final da URL:
<example>
Alias /doc/ /usr/doc/
</example>
O diretório <file>/doc</file> somente poderá ser acessado usando
<file>&url-manual-www;/doc/</file>, o uso de 
<file>&url-manual-www;/doc</file> retornará uma mensagem de 
URL não encontrada. ]]>
</taglist>



