# Guia do Linux/Avançado/Apache/Introdução
## Introdução

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).
O Apache é um servidor Web extremamente configurável, robusto e de alta performance desenvolvido por uma equipe de voluntários (conhecida como Apache Group) buscando criar um servidor web com muitas características e com código fonte disponível gratuitamente via Internet. Segundo a Netcraft (http://www.netcraft.com/), o Apache é mais usado que todos os outros servidores web do mundo juntos.
Este capítulo não tenta ser um guia completo ao Apache, 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 exemplo comentado de um arquivo de configuração do Apache pois contém diretivas básicas de configuração comentadas e explicações interessante e faz parte do aprendizado.

### Versão

É assumido que esteja usando a versão 1.3.22 do apache. 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.

### Um resumo da História do Apache

O Apache tem como base o servidor web NCSA 1.3 (National Center of Supercomputing Applications), 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 Apache com Brian Behlendorf e Cliff Skolnick abrindo uma lista de discussão para interessados no desenvolvimento, conseguindo espaço em um servidor doado pela HotWired e trocando patches corrigindo problemas, adicionando recursos e discutindo idéias com outros desenvolvedores e hackers interessados neste projeto.
A primeira versão oficial do Apache 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 Brandon Long e Beth Frank que também se tornaram membros especiais do grupo Apache, compartilhando idéias sobre seus projetos).
Nas versões 2.x do Apache, a escalabilidade do servidor foi ampliada suportando as plataformas Win32 (não obtendo o mesmo desempenho que em plataformas UNIX mas sendo melhorado gradativamente).

### Enviando Correções/Contribuindo com o projeto

Um formulário está disponível na Web para o envio de correções/sugestões em http://www.apache.org/bug_report.html/. Uma lista de anuncio sobre o Apache está disponível em apache-announce@apache.org que divulgam correções, novas versões e realização de eventos.
Mais detalhes sobre o desenvolvimento do Apache podem ser visualizadas na URL http://dev.apache.org/.

### Características do Apache

Abaixo estão algumas características que fazem esse servidor web o preferido entre os administradores de sistemas:
* Possui suporte a scripts cgi usando linguagens como Perl, PHP, Shell Script, ASP, etc.
* Suporte a autorização de acesso podendo ser especificadas restrições de acesso separadamente para cada endereço/arquivo/diretório acessado no servidor.
* 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).
* Negociação de conteúdo, permitindo a exibição da página Web no idioma requisitado pelo Cliente Navegador.
* Suporte a tipos mime.
* Personalização de logs.
* Mensagens de erro.
* 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).
* Suporte a IP virtual hosting.
* Suporte a name virtual hosting.
* Suporte a servidor Proxy ftp e http, com limite de acesso, caching (todas flexivelmente configuráveis).
* Suporte a proxy e redirecionamentos baseados em URLs para endereços Internos.
* Suporte a criptografia via SSL,Certificados digitais
* Módulos DSO (Dynamic Shared Objects) permitem adicionar/remover funcionalidades e recursos sem necessidade de recompilação do programa.

### Ficha técnica

Pacote: apache
Utilitários:
* apache - Servidor Web Principal
* apachectl - Shell script que faz interface com o apache de forma mais amigável
* apacheconfig - Script em Perl para configuração interativa básica do Apache
* htpasswd - Cria/Gerencia senhas criptografadas Crypto/MD5
* htdigest - Cria/Gerencia senhas criptografadas Crypto/MD5
* dbmmanage - Cria/Gerencia senhas em formato DBM (Perl)
* logresolve - Faz um DNS reverso dos arquivos de log do Apache para obter o endereço de hosts com base nos endereços IP's.
* ab - Apache Benchmarcking - Ferramenta de medida de desempenho do servidor Web Apache.
Por padrão, os arquivos de configuração do Apache residem no diretório /etc/apache:

#### httpd.conf

    Arquivo de configuração principal do Apache, 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.

#### srm.conf

    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.

#### access.conf

    Contém diretivas que controlam o acesso aos documentos. O nome desse arquivo pode ser substituído através da diretiva AccessConfig no arquivo principal de configuração.
O servidor Web lê os arquivos acima na ordem que estão especificados (httpd.conf, srm.conf e access.conf). As configurações também podem ser especificadas diretamente no arquivo httpd.conf. Note que não é obrigatório usar os arquivos srm.conf e access.conf, 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 aqui.

### Requerimentos

A máquina mínima para se rodar um servidor Apache 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).
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.

### Arquivos de log criados pelo Apache

O servidor httpd grava seus arquivos de log geralmente em /var/log/apache, não é possível descrever os arquivos de logs usados porque tanto seus nomes como conteúdo podem ser personalizados no arquivo httpd.conf. Mesmo assim, os arquivos de logs encontrados na instalação padrão do Apache são os seguintes:
* access.log - Registra detalhes sobre o acesso as páginas do servidor httpd.
* error.log - Registra detalhes saber erros de acesso as páginas ou erros internos do servidor.
* agent.log - Registra o nome do navegador do cliente (campo UserAgent do cabeçalho http).
Mais referências podem ser encontradas em [#s-s-apache-log Sistema de Log do Apache, Seção 12.10]. Um bom programa para geração de estatísticas de acesso com gráficos é o [#s-s-apache-log-webalizer Relatório gráfico de acesso ao sistema, Seção 12.10.15].

### Instalação

apt-get install apache apache-doc
(o pacote apache-doc contém a documentação de referencia do Apache, é recomendável instala-lo se estiver curioso e deseja entender melhor seu funcionamento ou consultar diretivas).

### Iniciando o servidor/reiniciando/recarregando a configuração

O Apache pode ser executado tanto como um servidor Inetd ou como um Daemon. A inicialização de programas pelo Inetd é uma boa estratégia quando você precisa de um controle de acesso básico (o fornecido pelo tcpd), e o serviço é pouco usado na máquina.
A segurança de um serviço iniciado pelo inetd 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 Apache estiver rodando como daemon e estiver ocioso, ele será movido para swap liberando a memória RAM para a execução de outros programas.
Neste capítulo será assumido seu funcionamento do Apache como Daemon, que é o método de funcionamento recomendado para sites de grande tráfego onde ele é frequentemente requisitado e considerado um serviço crítico.
O método padrão para iniciar programas como daemons na Debian é através dos diretórios /etc/rc?.d. Cada diretório deste contém os programas que serão executados/interrompidos no nível de execução "?" (rc1.d/, rc2.d/ ...). O conteúdo destes diretórios são links para os scripts originais em /etc/init.d/programa, o nosso programa alvo é /etc/init.d/apache. O /etc/init.d/apache aceita os seguintes parâmetros:
* start - Inicia o Apache
* stop - Finaliza o Apache
* restart - Reinicia o Apache, efetuando uma pausa de 5 segundos entre a interrupção do seu funcionamento e reinicio.
* reload - Recarrega os arquivos de configuração do Apache, as alterações entram em funcionamento imediatamente.
* reload-modules - Recarrega os módulos. Basicamente é feito um restart no servidor.
* force-reload - Faz a mesma função que o reload
Para reiniciar o Apache usando o /etc/init.d/apache, digite:
./etc/init.d/apache restart
ou
cd /etc/init.d;./apache restart
Na realidade, o que o /etc/init.d/apache faz é interagir diretamente com o shell script apachectl.
O apachectl recebe os parâmetros enviados pelo usuário e converte para sinais que serão enviados para o binário apache. Da mesma forma ele verifica os códigos de saída do apache e os transforma em mensagens de erro legíveis para o usuário comum. Os seguintes comandos são aceitos pelo apachectl:
* httpd-server/start - Inicia o Apache
* stop - Finaliza o Apache (enviando um sinal TERM)
* restart - Reinicia o Apache (enviando um sinal HUP)
* graceful - Recarrega os arquivos de configuração do Apache (enviando um sinal USR1)
* fullstatus - Mostra o status completo do servidor Apache (requer o lynx e o módulo mod_status carregado).
* status - Mostra o status do processo do servidor Apache (requer o lynx e o módulo mod_status carregado).
* configtest - Verifica se a sintaxe dos arquivos de configuração está OK (executa um apache -t).

### Opções de linha de comando

* -D nome - define um nome que será usado na diretiva <IfDefine nome>.
* -d diretório - especifica o diretório ServerRoot (substitui o do arquivo de configuração).
* -f arquivo - especifica um arquivo ServerConfigFile alternativo.
* -C "diretiva" - processa a diretiva antes de ler os arquivo de configuração.
* -c "diretiva" - processa a diretiva depois de ler os arquivos de configuração.
* -v - mostra a versão do programa.
* -V - mostra opções usadas na compilação do Apache.
* -h - Mostra o help on-line do programa
* -l - lista módulos compilados junto com o Apache (embutidos)
* -L - lista diretivas de configurações disponíveis
* -S - Mostra configurações de Virtual Hosting
* -t - executa a checagem de sintaxe nos arquivos de configuração do Apache (incluindo a checagem da diretiva DocRoot).
* -T - executa a checagem de sintaxe nos arquivos de configuração do Apache (menos da diretiva DocRoot).