Atenção: esse artigo tem um vídeo complementar. Clique e assista!

Do que se trata o artigo:

Neste artigo será realizada a instalação do Apache de duas formas distintas. Uma delas é compilando através do código-fonte e a outra é através de pacotes próprios da distribuição. Também serão apresentadas configurações básicas de desempenho e segurança, recomendáveis em qualquer servidor Web Apache.


Para que serve:

As configurações sugeridas são aplicáveis em servidores de pequeno, médio e grande porte, com poucas ou milhares de requisições por minuto.


Em que situação o tema é útil:

Este artigo é ideal para aqueles que estão iniciando na área de infraestrutura e servidores, e até mesmo para os leitores com um pouco mais de experiência, que estão sempre em busca de novos conhecimentos, permitindo uma melhor configuração de servidores.

O Apache é um software multiplataforma e pode ser instalado nos principais sistemas operacionais disponíveis no mercado, como Linux, BSDs, Windows, entre outros menos populares. Por ser um software robusto, logo se pensa que exige um hardware muito poderoso para funcionar adequadamente. É aí que os inexperientes se enganam.

O Apache é um servidor web open source extremamente confiável e que tem suas funcionalidades expansíveis através de módulos que podem ser adicionados na medida em que se tornam necessários. Seu nome na verdade é Apache HTTP Server (veja seção Links), mas é popularmente conhecido como Apache.

O principal objetivo deste artigo é apresentar um conjunto de operações básicas no Apache, especialmente no que diz respeito à instalação, configuração, desempenho e segurança.

Servidor Web Apache

O Apache é hoje um dos mais respeitados softwares Open Source existentes no mercado, sendo um concorrente direto do IIS (veja seção Links), desenvolvido pela Microsoft.

Sua qualidade fica claramente estampada quando analisamos sua utilização a nível global na Internet. Segundo o site Netcraft (veja seção Links), em Janeiro de 2010, 53,84% dos sites existentes na internet rodavam sob o Apache, contra 24,08% do IIS.

Uma vantagem, que é maior que o dobro do segundo colocado, prova a excelência desta aplicação e a qualidade que um software open source pode obter quando possui um desenvolvimento maduro e sério.

O principal fator relacionado à performance é o número de instâncias do servidor httpd. O Apache suporta um grande número de instâncias simultâneas, onde cada uma é relacionada a um cliente acessando o servidor.

Na verdade, o gargalo acaba se localizando na velocidade do link e, dependendo das páginas servidas, no hardware. Códigos PHP mal escritos e scripts CGI podem elevar a carga do processador e, multiplicando pelo número de instâncias simultâneas fazendo essas requisições, tem-se um verdadeiro problema. Por este motivo é possível afirmar que um servidor bem configurado não é sinônimo de desempenho superior.

Como já informado, o Apache oferece suporte a módulos que, quando instalados, adicionam funcionalidades ao servidor. Como exemplos, pode-se citar o mod_php, mod_python, mod_ftp, entre outros. A variedade de módulos é muito grande e pode ser consultada diretamente no site do projeto (veja seção Links).

Serão apresentadas duas formas de instalação do Apache no Linux. A primeira delas é compilando o servidor a partir do código fonte, e a segunda é através de um gerenciador de pacotes. Optou-se por utilizar o Ubuntu (veja seção Links) por ser a distribuição Linux mais popular hoje em dia.

Compilando os fontes

Este artigo parte do princípio que o leitor está familiarizado com a compilação de algum software ou, ao menos detém as noções básicas, além de possuir os pacotes para realizar tal procedimento.

Em caso de dúvidas, no Ubuntu, é necessário instalar o pacote build-essential para que seja possível compilar os arquivos do Apache. Para isto, execute o comando:

  # apt-get install build-essential 

Quando este artigo foi escrito, a versão estável era a 2.2.16. No entanto, as configurações realizadas são válidas para qualquer versão do Apache2.

É possível baixar o arquivo pelo browser ou pelo terminal. Lembre-se, geralmente servidores não possuem interface gráfica instalada. Dessa forma, seguiremos a segunda opção.

Para realizar o download do pacote, execute o comando:

  # wget http://linorg.usp.br/apache/httpd/httpd-2.2.14.tar.gz 

Agora é necessário efetuar a transformação em Super Usuário, através do comando:

# sudo su

Assim será possível executar todos os comandos sem nenhum tipo de problema. Porém, muito cuidado com os comandos que serão utilizados: como root nada impedirá você de fazer alterações indevidas no sistema.

Neste momento é necessário descompactar o arquivo baixado. Para isso, execute o comando abaixo para armazenar os arquivos no diretório /usr/src:

  # tar -zxvf httpd-2.2.14.tar.gz -C /usr/src 

Observe que foi utilizado o parâmetro “-C” para especificar o destino dos arquivos que estão sendo extraídos do pacote.

Feito isso, deve-se acessar esse diretório:

  # cd /usr/src/httpd-2.2.14/ 

Seguindo a proposta do artigo, esta instalação será básica, ou seja, não serão instalados módulos e/ou adicionadas funções extras ao Apache. Entretanto, caso tenha interesse de habilitar ou desabilitar algumas opções já na instalação, pode fazê-lo com o comando:

  # ./configure --help 

Agora, devem ser executados os três comandos básicos necessários para a compilação:

  # ./configure
  # make
  # make install 

Aguarde, dependendo do seu computador, isto pode levar alguns minutos. Concluído este processo, o servidor será instalado no diretório padrão que é /usr/local/apache2.

Para levantar o serviço com as configurações padrão, execute o comando:

  # /usr/local/apache2/bin/apachectl start 

Após estes passos o Apache deve ter sido compilado com sucesso. Agora, ao acessar o endereço 127.0.0.1 com um navegador será exibida uma mensagem de confirmação, mostrando que o servidor está funcionando.

Instalando através do Gerenciador de Pacotes Synaptics

Este artigo foi escrito utilizando como base de testes a distribuição Linux Ubuntu, porém os mesmos passos podem ser aplicados a outras distribuições derivadas do Debian.

Para realizar a instalação é necessário acessar o menu Sistema > Administração > Gerenciador de Pacotes Synaptic, pesquisar por “Apache” e depois selecionar o pacote “Apache2”. Em seguida é só aplicar e esperar o sistema realizar todo o trabalho.

Caso esteja utilizando o terminal, este processo pode ser feito com o comando:

  # apt-get install apache2 

A instalação via gerenciador de pacotes é visivelmente mais simples e torna todo gerenciamento mais fácil, visto que atualizações e patches de segurança são aplicadas e instaladas automaticamente. A compilação (apresentada no tópico anterior) só se faz necessária quando o administrador deseja customizar ao máximo o servidor.

Configurações Básicas

Depois da instalação padrão, o Apache já pode ser utilizado normalmente, eliminando a necessidade de inúmeras configurações adicionais. Para testá-lo, basta abrir o seu browser e acessar o endereço http://localhost. Neste momento você verá uma mensagem de confirmação do Apache.

O próximo passo será realizar algumas alterações no httpd.conf e demonstrar como habilitar o suporte a módulos, que estendem as possibilidades de utilização do servidor. Como exemplo, será instalado o módulo do PHP5, por este ser um dos recursos mais utilizados no Apache e pelo PHP ser uma das principais linguagens de programação voltadas à internet atualmente.

Quando o Apache é compilado, o arquivo de configuração é um só, o httpd.conf. Na instalação via gerenciador de pacotes no Ubuntu, esse arquivo é fragmentado para facilitar sua utilização. Todas as configurações citadas neste artigo podem ser realizadas em qualquer um dos ambientes, porém, a base será na configuração fragmentada que, de certa forma, acaba sendo um pouco mais complexa.

Os arquivos de configuração encontram-se no diretório /etc/apache2.

ServerName

Nossa primeira alteração no httpd.conf será o parâmetro ServerName. Este parâmetro é utilizado quando o servidor Apache irá responder por um endereço do tipo www.meusite.com.br. Na instalação padrão, o ServerName não é especificado, ficando a critério do administrador utilizá-lo ou não. Este parâmetro pode ser inserido no início do arquivo de configuração apache2.conf da seguinte forma:

  ServerName "www.meusite.com" (caso seja uma URL) ou
  ServerName "111.11.111.11" (caso seja um IP) 

Virtual Hosts

Mas o que fazer se o servidor for responder por mais de um site ou possuir subdomínios? Neste caso deve-se editar outro arquivo, responsável pelos Virtual Hosts dentro do Apache, que pode ser encontrado no diretório /etc/apache2/sites-available/default.

Na configuração padrão, existe um Virtual Host configurado que é responsável pelo domínio padrão do seu servidor. Um novo Virtual Host pode ser configurado apenas copiando as configurações de um já existente e alterando o parâmetro Document Root, que indica o diretório onde ficarão armazenados os respectivos arquivos.

Existe também a possibilidade de criar diferentes arquivos ao invés de utilizar o arquivo default. Se isso for feito, para que o Apache reconheça este arquivo, precisa-se adicioná-lo à lista de sites habilitados com o comando:

  # a2ensite nome-do-arquivo 

Depois é necessário fazer com que o Apache recarregue as configurações e reconheça o novo arquivo com os novos Virtual Hosts. Isto pode ser feito através do comando:

  # /etc/init.d/apache reload 

Dentro de cada Virtual Host é possível configurar diversos "subdiretórios" entre os parâmetros <Directory></Directory>. Dessa forma pode-se criar configurações personalizadas para determinados diretórios ou até apontá-los para outros lugares.

Um exemplo de configuração de um Virtual Host no Apache pode ser visto na Listagem 1.

Listagem 1. Exemplo de Configuração de um Virtual Host.

  <VirtualHost *:80>
          ServerAdmin seu-email@meusite.com.br
   
          ServerName www.meusite.com.br
          ServerAlias meusite.com.br www.meusite.com.br
          DocumentRoot /var/www/meusite.com.br
   
          ExpiresActive On
          <FilesMatch "\.(gif|jpg|jpeg|png|css|js|swf|GIF|JPG|JPEG|PNG|txt|TXT)$">
                  ExpiresDefault "access plus 1 year"
          </FilesMatch>
   
          <Directory /var/www/meusite.com.br>
                  Options -FollowSymLinks +SymLinksIfOwnerMatch
                  AllowOverride None
                  Deny from all
         </Directory>
   
          CustomLog /var/log/apache2/meusite.com.br.log combined
  </VirtualHost> 

Na Listagem 1 é possível observar a configuração para o domínio www.meusite.com.br. Nele foram adicionados alguns parâmetros para melhorar o acesso ao site, são eles:

ServerAlias: Parâmetro que permite que o site responda em mais de um endereço. Configura-se esse parâmetro para que o site responda também sem o www na frente do endereço. Muitos administradores se esquecem de fazer isto e quando o usuário tenta acessar o site sem utilizar o www o Apache retorna um erro;

ExpiresActive: Esta funcionalidade do Apache é um recurso muito interessante e pouco utilizado. Com ele, pode-se determinar o tempo que o browser do cliente fará cache de determinados tipos de arquivo, reduzindo assim a quantidade de requisições feitas ao servidor, sem falar na velocidade de carregamento do site, que será visivelmente incrementada. Pode não parecer, mas pequenas configurações como esta muitas vezes não são feitas pelos administradores e acabam gerando um elevado número de requisições repetidas e desnecessárias ao servidor Web.

Hardening

Segundo a Wikipédia, hardening é um processo de mapeamento das ameaças, mitigação dos riscos e execução das atividades corretivas com foco na infraestrutura com o objetivo principal de torná-la preparada para enfrentar tentativas de ataque.

Se o servidor vai estar aberto na Internet, tem-se obrigação de mantê-lo seguro. Sem entrar em detalhes de configuração de firewall e de sistema, que seria assunto para outro artigo, deve-se atentar para alguns pequenos detalhes e configurações que podem fazer a diferença no servidor.

Por padrão, em diretórios que não possuem nenhum arquivo index, o Apache lista todos os arquivos existentes nos mesmos. Isto em alguns casos não é de interesse do administrador, seja porque o diretório contém arquivos privados, ou apenas para não permitir que os arquivos que ali se encontram sejam vistos. Esta configuração pode ser realizada em diretórios específicos mas, em algumas situações, a intenção pode ser a de bloquear a listagem de arquivos em todos os diretórios. Para isso, é necessário editar o arquivo /etc/apache2/sites-available/default e alterar os seguintes parâmetros:

  Options FollowSymLinks
  AllowOverride None 

para:

  Oder Deny,Allow
  Deny from all
  Options None
  AllowOverride None 

Feitas estas alterações, o Apache deve ser reiniciado com o seguinte comando:

  # /etc/init.d/apache2 reload 

Algumas alterações relativas à segurança ainda podem ser feitas no arquivo security, localizado no diretório /etc/apache2/conf.d/security.

Não é interessante que alguma pessoa mal intencionada consiga informações sobre o servidor facilmente. Para evitar que isso aconteça, alguns parâmetros podem ser alterados para restringir o nível de informação que é passado para os clientes. São eles:

ServerTokens OS: Esta diretiva é responsável pelo nível de informação sobre o servidor que será retornado no cabeçalho HTTP. Os parâmetros existentes são: Full, OS, Minimal, Minor, Major e Prod. Onde Full retorna muitas informações como o Sistema Operacional e os módulos instalados e Prod retorna o mínimo de informações;

ServerSignature On: Adiciona em páginas geradas pelo servidor (páginas de erro, listagem de arquivos, etc.) uma linha contendo a versão do servidor e o nome do Virtual Host;

TraceEnable On: Este parâmetro é apenas utilizado para testes e diagnóstico do servidor.

Altere estes três parâmetros para:

  ServerTokens Prod
  ServerSignature Off
  TraceEnable Off 

Como de costume, sempre que alguma configuração é alterada o Apache precisa ser reiniciado para carregar os novos parâmetros.

Utilizando Módulos

Na sua instalação padrão, o Apache traz habilitado muitos módulos que, algumas vezes, não são utilizados. Os módulos disponíveis podem ser vistos em /etc/apache2/mods-available. Já os módulos que estão habilitados ficam em /etc/apache2/mods-enabled.

Como esta questão de módulos a serem utilizados é muito particular e varia em cada caso, será explicado apenas como habilitar e desabilitar os módulos no Apache.

Para habilitar um módulo, deve-se executar o comando:

  # a2enmod modulo 

Por exemplo:

  # a2enmod php5 

Agora, para desabilitar um módulo, pode-se executar:

  # a2dismod modulo 

Para listar todos os módulos do Apache que estão disponíveis nos repositórios do Ubuntu, execute:

  # apt-cache search apache2-mod 

Habilitando o suporte ao PHP

A instalação padrão do Apache não vem com suporte ao PHP ou a qualquer outra linguagem interpretada. Para habilitar o suporte ao PHP, é necessário realizar a instalação do pacote libapache2-mod_php5 para depois configurá-lo no Apache.

O primeiro passo para isso será abrir um console e digitar o comando:

  # sudo su 

Como já informado, o código acima faz com que todos os comandos sejam realizados com os privilégios do usuário root. Com isso é possível chamar o gerenciador de pacotes e instalar o módulo do PHP:

  # apt-get install libapache2-mod-php5 

Para verificar se o módulo foi realmente instalado, é necessário acessar o diretório /etc/apache2/mods-available. Nele, devem ser listados, entre outros, dois arquivos: php5.conf e php5.load.

Agora que o módulo PHP está instalado no sistema, é possível habilitá-lo no servidor Apache. Para isso, o seguinte comando deve ser executado:

  # a2enmod php5 

Depois de habilitado, os dois arquivos anteriormente descritos (php5.conf e php5.load) receberam links simbólicos no diretório /etc/apache2/mods-enabled. Isto significa que o módulo do PHP5 será carregado na próxima inicialização do Apache, que precisa ser reiniciado com o comando:

  # /etc/init.d/apache2 restart 

Dependendo dos serviços que serão disponibilizados no seu servidor, pode ser necessário alterar algum parâmetro de funcionamento do PHP. Estas alterações são feitas no arquivo php.ini que fica localizado no diretório /etc/php5/apache2.

Para exemplificar, vejamos algumas configurações importantes que podem ser realizadas no php.ini.

Desabilitar ou habilitar o safe mode:

  safe_mode = Off 

Safe Mode: Safe Mode, ou Modo Seguro, é uma tentativa de resolver um problema de segurança em servidores compartilhados. Com ele, o PHP faz verificações quando trabalha com manipulação de arquivos, verificando a propriedade do script atual e do arquivo a ser alterado. A partir da versão 5.3.0 do PHP este recurso se tornou obsoleto e seu uso desencorajado no próprio manual, na versão 6.0 será completamente removido.

Para determinar a memória que um script PHP pode alocar, utiliza-se o comando memory_limit, prevenindo que algum script mal escrito ou mal intencionado consuma toda a memória do servidor:

  memory_limit = 16M 

Caso o servidor não seja de testes, mas sim de produção, talvez seja interessante desabilitar a exibição de erros e alertas nas páginas geradas:

  display_errors = Off 

Ao fazer isto, pode-se querer registrar estes erros em algum lugar e, para isso, é importante habilitar o log de erros:

  log_errors = On 

Por medida de segurança, também é interessante desabilitar variáveis globais. Isso evita que alguma pessoa mal intencionada, em alguns casos, consiga alterar valores de variáveis, fazendo com que o sistema se comporte de forma anormal:

  register_globals = Off 

Mais informações sobre o parâmetro register_globals podem ser encontradas no endereço (veja seção Links).

Em sua configuração padrão, o PHP vem com o suporte a upload de arquivos habilitado. Se esta função não for utilizada, pode-se desabilitá-la e evitar um possível problema gerado por alguma pessoa mal intencionada que consiga se aproveitar desse serviço. Para esse ajuste, altere a configuração para:

  file_uploads = Off 

Mas, caso seja necessário receber arquivos, e mais, arquivos grandes, é necessário alterar o tamanho máximo dos arquivos que podem ser recebidos, por exemplo:

  upload_max_filesize = 5M 

Caso a aplicação utilize sessões, pode ser interessante aumentar o tamanho máximo do tempo de vida de uma sessão que, por padrão, é de 24 minutos. Esta opção é recomendada para sistemas que possuem uma utilização frequente e contínua, evitando assim que o usuário tenha que se autenticar a todo o momento:

  session.gc_maxlifetime = 1440 (em segundos) 

Enfim, o php.ini é bastante extenso, sendo recomendada a leitura do arquivo. Os comandos e os comentários que se encontram nele podem ser bastante úteis, além de ser uma excelente forma de estudo das possibilidades que as configurações do PHP oferecem.

Companheiros para o Apache

Claro que o Apache não é único no mundo dos servidores Web. Existem outros softwares que seguem a mesma proposta. Um bom exemplo é o Lighttpd, que pode ser utilizado individualmente ou em conjunto com o Apache.

O Lighttpd (veja seção Links) é um servidor desenvolvido para ambientes de alta performance. Seu consumo de memória é muito baixo, além de possuir um bom gerenciamento de carga. Entretanto, seu desempenho não é muito bom quando se trata de páginas dinâmicas, como páginas em PHP. Já quando utilizado para prover conteúdo estático, como arquivos .html, .css, .js e imagens, seu desempenho é consideravelmente superior ao Apache. Uma boa combinação é utilizar o Apache para prover conteúdo dinâmico e o Lighttpd para conteúdo estático.

Outro que não é exatamente um Web Server, mas que merece ser lembrado, é o novíssimo HipHop (veja seção Links), desenvolvido pelo Facebook. Ele traduz os códigos PHP para C++ e, depois disso, o compila, aumentando assim a velocidade na execução.

Conclusões

Uma boa forma de aprender é através da tentativa e erro, pois assim aprende-se o que pode e o que não pode ser feito. Por isso, não se deve ter medo de arriscar e alterar algum parâmetro de configuração. Caso erre em algum ponto, sempre haverá a possibilidade de voltar atrás e recuperar o estado em que tudo estava funcionando corretamente. No entanto, é importante informar que os testes devem ser realizados em ambientes específicos para tal, nunca em servidores de produção, onde um erro de configuração pode gerar um problema mais sério.

Links

Apache HTTP Server
http://httpd.apache.org

Módulos Apache
modules.apache.org

IIS
www.iis.net

Netcraft
www.netcraft.com

Ubuntu
www.ubuntu.com

Parâmetro register_globals do PHP
www.php.net/manual/pt_BR/security.globals.php

Lighttpd
www.lighttpd.net

HipHop
http://developers.facebook.com/news.php?story=358&blog=1