domingo, 17 de maio de 2015

Configuração do Servidor Web Apache no Linux

Olá Pessoal

Este é mais um daqueles artigos com foco na instalação de serviços em ambientes Linux, já que a temática teve boa aceitação pelos leitores do blog. O objetivo é listar os passos necessários para instalar o Apache, nada menos que o serviço web mais popular do mundo que é responsável pela hospedagem de mais da metade de todas as páginas web publicadas na Internet. Além de suportar requisições HTTP, o Apache também provê segurança e criptografia (via protocolo HTTPS) através do módulo mod_ssl.


Assim como nos artigos anteriores, estou considerando que o servidor está instalado com a distribuição Debian GNU/Linux (ou seus derivados, como o Ubuntu). A primeira etapa consiste na instalação do pacote apache2 para que o Linux possa ser posteriormente configurado como servidor web na LAN (intranet) ou mesmo na Internet. Essa tarefa é simples e rápida através do APT:

root@webserver:/# apt-get install apache2

Uma característica interessante do Apache é que sua estrutura é modular e sua configuração envolve diferentes arquivos que ficam armazenados no diretório "/etc/apache2". Em "/etc/apache2/apache2.conf" são realizadas as configurações básicas do servidor web, inclusive o vínculo com outros arquivos. De maneira geral, o arquivo de configuração está todo comentado e fica fácil entender o que cada linha representa. Na configuração abaixo estão destacados em amarelo os pontos em que fazemos o vínculo com outros arquivos de configuração que estaremos manipulando na sequência. É crucial manter o bloco de diretórios que nega todo acesso ao sistema de arquivos do servidor na sua raíz /.

###--- em /etc/apache2/apache2.conf
(...)
Include ports.conf
(...)
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>
(...)
IncludeOptional sites-enabled/*.conf

Obs.: Particularmente, não tenho o hábito de liberar acesso ao diretório "var/www" no arquivo de configuração global porque prefiro fazer a liberação do(s) diretório(s) específico(s) do(s) site(s) em um arquivo mais específico, conforme veremos adiante. 

No arquivo "/etc/apache2/ports.conf" são configuradas as interfaces (através do IP) e as portas que irão responder requisições HTTP. O Apache, por padrão, responde requisições vindas na porta 80 de todas as interfaces, mas pode ser personalizado para aceitar requisições IPv4 ou IPv6 em outras portas. Nas linhas comentadas e com destaque amarelo há outras opções para permitir a escuta apenas em interfaces específicas. Outro detalhe é que somente haverá escuta na porta 443 (HTTPS) se seus módulos de segurança estiverem ativos.

###--- em /etc/apache2/ports.conf

Listen 80

#Listen 192.168.0.1:80
#Listen 203.0.113.1:80
#Listen [2001:db8:cafe::1]:80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

Depois de realizadas as configurações gerais, as configurações específicas dos sites ficam armazenadas em "etc/apache2/sites-available". Para ambientes que irão hospedar múltiplos sites, é recomendada a criação de um arquivo (.conf) com o nome do domínio pelo qual cada site irá responder. Posteriormente criaremos o diretório "/var/www/nome.com.br", além de outros dois sub-diretórios "/var/www/nome.com.br/public_html" e "/var/www/nome.com.br/logs" para armazenar os arquivos do site e os arquivos de log, respectivamente.

Na configuração abaixo trago alguns dos parâmetros mais importantes, embora haja outros. De maneira breve, as linhas abaixo são repsonsáveis por definir, na sequência: o e-mail do responsável pelo site (ServerAdmin); o nome do domínio do site (ServerName); outros nomes/apelidos para o site (ServerAlias); o diretório raíz que será a base para hospedagem dos arquivos do site (DocumentRoot); definir o caminho onde vão ficar os logs de erro do serviço (ErrorLog); o caminho onde vão ficar os logs de acesso ao site (CustomLog); e o caminho para uma página de erro personalizada (ErrorDocument). Vários desses parâmetros são opcionais...

Na sequência o bloco <Directory> define características do diretório onde estarão armazenados os arquivos que compõem o site hospedado. Em síntese, estamos permitindo que o usuário possa navegar/visualizar os diretórios (options indexes), negando que outras regras mais específicas conflitem com essas configurações (allowoverride none) e permitindo acesso aos arquivos (granted).

###--- em /etc/apache2/sites-available/nome.com.br.conf
<VirtualHost *:80>
    ServerAdmin webmaster@nome.com.br
    ServerName nome.com.br
    ServerAlias www.nome.com.br
    DocumentRoot /var/www/nome.com.br/public_html
    ErrorLog /var/www/nome.com.br/logs/error.log
    CustomLog /var/www/nome.com.br/logs/access.log combined
    ErrorDocument 404 /error.htm

    <Directory /var/www/nome.com.br/public_html>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

Os arquivos dos sites que ficam armazenados em "/etc/apache2/sites-available" não estão publicados, por isso é necessário utilizar a ferramenta a2ensite para ativá-los e publicá-los através da criação de um link simbólico no diretório "/etc/apache2/sites-enabled".

root@webserver:/# a2ensite nome.com.br.config

root@webserver:/# ls -l /etc/apache2/sites-enabled
lrwxrwxrwx 1 root root 38 Mai 14 23:49 nome.com.br.conf -> ../sites-available/nome.com.br.conf

Obs.: Assim como a ferramenta a2ensite é utilizada para ativar e publicar um site, a ferramenta a2dissite pode ser utilizada para remover o link simbólico. 

Respeitando os caminhos informados na configuração anterior, devem ser criados os diretórios para armazenamento da página web. O diretório-raíz da hospedagem deve conter o arquivo padrão index.htm para efetivamente exibir algo aos clientes.

root@webserver:/# mkdir /var/www/nome.com.br
root@webserver:/# mkdir /var/www/nome.com.br/public_html
root@webserver:/# mkdir /var/www/nome.com.br/logs
root@webserver:/# chmod 755 –R /var/www/nome.com.br

Por fim, depois de configurado o servidor, basta iniciar o serviço para validar todas as configurações realizadas anteriormente. A partir de agora o site hospedado no servidor pode ser acessado pelos clientes através de navegadores.

root@webserver:/# service apache2 start
* Starting web server apache2
*

Obs.: Quando um novo serviço é instalado no Debian, ele passa a ser automaticamente inicializado em caso de boot do servidor. A ferramenta update-rc.d pode ser utilizada para remover/adicionar serviços no processo de inicialização automática.

Nesse ponto o servidor web já está devidamente configurado e operando como deveria. Um recurso adicional que pode ser útil é a solicitação de autenticação dos usuários que tentem acessar o conteúdo de um determinado diretório protegido. Vamos imaginar que temos um diretório privado localizado em "/var/www/nome.com.br/public_html/private". Para protegê-lo é necessário editar novamente o arquivo "/etc/apache2/sites-available/nome.com.br.conf" e adicionar as seguintes linhas:

<VirtualHost *:80>
(...) Conteúdo Omitido
<Directory /var/www/nome.com.br/public_html/private>
    AuthName "ACESSO RESTRITO"
    AuthType Basic
    AuthUserFile /etc/apache2/passwd.apache
    require valid-user
</Directory> 

Pronto, agora basta criar o arquivo destacado em amarelo que irá conter a relação de usuários e senhas que podem ter acesso ao diretório protegido. Por fim, iremos recarregar as novas configurações do Apache!

root@webserver:/# mkdir /var/www/nome.com.br/public_html/private
root@webserver:/# touch /etc/apache2/passwd.apache

root@webserver:/# htpasswd /etc/apache2/passwd.apache nome_usuario
<informar senha>

root@webserver:/# service apache2 reload

Samuel.

5 comentários:

  1. Como sempre, excelentes tutoriais!

    ResponderExcluir
  2. Raildson Felipe da Silva1 de agosto de 2016 18:35

    Uma explicação concisa, clara e efetiva. Fiz todos os passos e funcionou perfeitamente.
    Parabéns!!

    ResponderExcluir
  3. Muito bom, porem, ainda falta muita experiencia de minha parte. Pois é a primeira vez que estou tentando fazer. Mas valeu muito. Grato Fernando

    ResponderExcluir
  4. Excelente Tutorial, passei um monte de raiva com outros tutoriais e esse funcionou na hora

    ResponderExcluir