UP | HOME

LPI-2 202-450 Topico 208.1
Configuração básica do Apache

Índice

208.1 Configuração Básica do Apache - Objetivos

Peso 3

O candidato deve ser capaz de instalar e configurar um servidor web. Este objetivo inclui monitorar a carga e performance do servidor, restringindo o acesso, suporte aos módulos de linguagens de script e configuração de restrição de acesso por cliente. Inclui saber como configurar o servidor para restringir o uso de recursos. O candidato deve ser capaz de configurar o webserver a usar virtual hosts e customizar o acesso a arquivos.

Conhecimentos-chave:

  • Arquivos de configuração, termos e ferramentas do Apache 2.x;
  • Conteúdo e configuração dos arquivos de log do Apache;
  • Arquivos e métodos de restrição de acesso;
  • Configuração do PHP e mod_perl;
  • Arquivos e ferramentas para autenticação por usuário;
  • Configuração de requisições máximas, mínimo e máximo de servidores e clientes;
  • Implementação de host virtual no Apache 2.x (com ou sem um endereço IP dedicado);
  • Utilização de instruções de redirecionamento nos arquivos de configuração para modificar o acesso a arquivos.

Lista parcial dos arquivos, termos e ferramentas utilizados:

  • logs de erro e logs de acesso;
  • .htaccess;
  • httpd.conf;
  • mod_auth;
  • htpasswd;
  • AuthUserFile, AuthGroupFile;
  • apache2ctl;
  • httpd, apache2.

208.1 Configuração Básica do Apache - Conteúdo

O Apache HTTP Server Project é um esforço para desenvolver e manter um servidor HTTP de código aberto para sistemas operacionais modernos, incluindo UNIX e Windows. O objetivo deste projeto é fornecer um servidor seguro, eficiente e extensível que forneça serviços HTTP em sincronia com os padrões HTTP atuais.

Na versão 1.x do Apache, o funcionamento padrão estava atrelado a um processo de requisição, o que provocava mal uso dos recursos. O programa servidor replicava várias cópias de si mesmo quando iniciado. Isso significa que o programa servidor iniciado, chamado processo "pai", cria várias cópias de si mesmo, chamadas processos "filhos". Cada um dos processos filhos atua como um servidor independente. Dessa forma, se um dos processos se tornar instável, pode ser terminado sem prejudicar os demais, e o servidor continuará operando. No entanto, a estratégia de utilizar vários processos filhos como servidores afeta a performance do serviço. Processos independentes não podem compartilhar funções e dados diretamente, o que aumenta o consumo de recursos do sistema.

Na versão 2.x do Apache, a arquitetura de processamento das requisições foi abstraída para módulos servidores especiais, chamados Multi Processing Modules (MPMs). Com esse formato o Apache pode ser configurado para operar como servidor baseado em processos, com chamadas internas (threads) ou uma mistura dos dois. Chamadas internas que acontecem dentro de um único processo trabalham mais eficientemente que processos isolados. Diferente dos processos isolados as chamadas internas podem compartilhar funções e dados consumindo menos recursos. Porém se houver uma falha em uma chamada interna, todo processo pode ficar comprometido.

Configuração do Apache

Os arquivos de configuração do Apache são armazenados de forma diferente em distribuições diferentes, mas são basicamente a mesma coisa. Existe um arquivo de configuração padrão que pode ser dividido em várias partes.

Apache Redhat/CentOS Debian/Ubuntu
Nome do pacote httpd apache2
Localização da config /etc/httpd /etc/apache2

Dentro dos diretórios de configuração também há diferença na disposição dos arquivos de configuração.

Segue disposição dos diretórios de configuração o Apache em servidores Debian/Ubuntu:

/etc/apache2
├── apache2.conf
├── conf-available
│   ├── charset.conf
│   ├── security.conf
│   └── serve-cgi-bin.conf
├── conf-enabled
│   ├── security.conf -> ../conf-available/security.conf
│   └── serve-cgi-bin.conf -> ../conf-available/serve-cgi-bin.conf
├── mods-available
│   ├── access_compat.load
│   └── actions.conf
├── mods-enabled
├── sites-available
│   └── www.site.com.br.conf
└── sites-enabled
    └── www.site.com.br.conf -> ../sites-available/www.site.com.br.conf

Agora a disposição dos diretórios de configuração no httpd do Redhat/Centos:

/etc/httpd/
├── conf
│   ├── httpd.conf
│   ├── httpd.conf.rpmsave
│   └── magic
├── conf.d
│   ├── autoindex.conf
│   ├── blklst.conf
│   ├── pass.conf
│   ├── pass-le-ssl.conf
│   ├── php.conf
│   ├── README
│   ├── server-status.conf
│   ├── ssl.conf
│   ├── ssl.conf.save
│   ├── userdir.conf
│   ├── welcome.conf
│   ├── wiki.conf
│   ├── wiki-le-ssl.conf
│   ├── zabbix.conf
│   └── zabbix-le-ssl.conf
├── conf.modules.d
│   ├── 00-base.conf
│   ├── 00-dav.conf
│   ├── 00-lua.conf
│   ├── 00-mpm.conf
│   ├── 00-proxy.conf
│   ├── 00-ssl.conf
│   ├── 00-systemd.conf
│   ├── 01-cgi.conf
│   ├── 15-php.conf
│   └── 15-php.conf.rpmnew
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
└── run -> /run/httpd

Note que no RedHat/CentOS não há a estrutura de diretórios com conteúdos linkados que existe no Debian/Ubuntu "xxx-enabled".

No caso no RedHat/CentOS basta que o arquivo de configurações com nome finalizado em .conf esteja criado em /etc/httpd/conf.d, já no Debian/Ubuntu o arquivo deve ser criado no diretório /etc/apache2/sites-available e linkado no /etc/apache2/sites-enabled. Tendo até um comando para isso no caso o a2ensite para habilitar um site e a2dissite para desabilitar.

Outro ponto de diferença entre RedHat/Centos e Debian/Ubuntu é que após a instalação nas distribuições Debian-like o apache2 já estará ativo e rodando como Daemon, porém nas distros RedHat-like não.

Por fim é importante salientar também que as distribuições Debian-like armazenam os logs em /var/log/apache2 já as distribuições RedHat-like armazenam em /var/log/httpd.

Conteúdo do arquivo de configuração principal do apache

Segue algumas diretivas importantes do arquivo de configuração do apache:

  • ServerType: Define se o httpd deve rodar separado ou invocado pelo inetd.
  • ServerRoot /caminho/: Define o diretório onde estão os arquivos de configuração do Apache;
  • PidFile /caminho/: Define o arquivo que armazenará o valor do PID para o processo httpd pai. O padrão é /var/run/httpd.pid;
  • ServerAdmin email@dominio.com.br: Endereço de e-mail do administrador do servidor;
  • DocumentRoot /caminho/: Caminho do diretório que armazena os documentos disponibilizados no site;
  • Servername www.site.com: Nome do site, o domínio registrado por onde o site poderá ser acessado, essa diretiva pode conter mais de um nome desde que estejam separados por uma vírgula;
  • LoadModule NOME /caminho/: Carrega um módulo DSO (Dynamic Shared Object). Adicionando novas funcionalidades ao Apache;
  • AddModule modulo.c: Ativação dos módulos estáticos e externos. Essa entrada é usada para definir a ordem correta de carregamento dos módulos;
  • Port XX: Define a porta onde o Apache escutará, substitua "XX" pelo número da porta;
  • User usuário: Usuário dono do processo do apache;
  • Group grupo: Grupo dono do processo do apache.

Essas são opções comuns que podem estar no arquivo de configuração principal do Apache como também podem estar presentes em arquivos separados.

Além das opções comuns citadas acima, também devemos falar de outras ações principais mas que comumente não são alteradas:

  • Timeout: Tempo limite de espera para receber uma requisição GET, dados via POST ou PUT, também atua sobre o intervalo entre ACKs em transmissões de pacotes TCP em respostas;
  • KeepAlive: Permite que mais de uma requisição seja realizada em uma única conexão;
  • MaxKeepAliveRequests: Número máximo de requisições numa mesma conexão. 0, não estabelece limite;
  • KeepAliveTimeout: Intervalo, em segundos, da última requisição até o fechamento da conexão. Um valor alto manterá o processo servidor ocupado e poderá causar pouca responsividade num servidor muito acessado;
  • MinSpareServers: Número mínimo de processos servidores inativos;
  • MaxSpareServers: Número máximo de processos servidores inativos. Se este número for ultrapassado. processos inativos excedentes serão finalizados;
  • MinSpareThreads: Número mínimo de threads servidores inativos aguardando conexão;
  • MaxSpareThreads: Número máximo de threads servidores inativos;
  • StartServers: Número de processos filhos disparados inicialmente mais o servidor principal;
  • MaxClients: Total máximo de processos servidores;
  • MaxRequestsPerChild: Número máximo de requisições que um processo servidor filho poderá receber. 0 significa ilimitado.

Na versão 2.x, o Apache pode operar baseado tanto em processos quanto baseado em threads. Portanto, é possível definir diversos processos servidores e cada um deles operando com diversos threads servidores.

Módulos do Apache

O que tornou o servidor web apache tão poderoso e popular são seus módulos. O Apache é projetado de forma modular e podemos adicionar ou remover módulos com base em nossas necessidades.

No caso apache lida com arquivos html, então se tivermos usado outras linguagens como "php", teremos que instalar o módulo necessário.

apache-modules.png

Figura 1: Diagrama dos módulos do apache

De modo análogo às outras seções do apache, a configuração dos módulos é feita em arquivos separados. Lógico que esse comportamento é opcional, somente é feito tradicionalmente assim pois se fosse tudo em um arquivo só este ficaria muito grande e assim, de difícil manutenção.

Instalação e configuração dos módulos

Geralmente a instalação de módulos é feita utilizando os gerenciadores de pacotes da distribuição, e apenas eventualmente instalados a partir dos fontes.

O grande ponto de atenção fica por conta dos locais de configuração dos módulos que diferem entre distribuições Debian-like e Redhat-like.

Assim, no Debian, serão criados arquivos de configuração em /etc/apache2/mods-available/ aí para habilitar esses módulos cria-se links simbólicos deles em /etc/apache2/mods-enabled/. Operação que pode ser executada através do comando a2enmod. Bem como para desabilitar o módulo, apaga-se o link simbólico, coisa que pode ser feita manualmente ou utilizando o comando a2dismod.

Já num sistema RedHat like para habilitar um módulo cria-se um arquivo com nome finalizado em .conf dentro do diretório conf.modules.d/. E os arquivos do módulo em si ficam dentro de /etc/httpd/modules/.

Lembrando que quando usado o gerenciador de pacotes, a criação dos arquivos de configurações e devidos links são feitos pelo próprio gerenciador.

Multi Processing Modules MPM ou Módulos Multi Processados

Funcionalmente falando na verdade o Apache segue alguns mecanismos para aceitar e concluir solicitações de servidor web. Na prática, os MPMs estendem a funcionalidade modular do Apache, permitindo-nos decidir como configurar o servidor da web para se vincular às portas de rede na máquina, aceitar solicitações de clientes e usar processos filhos (e threads, alternativamente) para lidar com essas solicitações.

Existem 3 tipos de MPM e são usados conforme a necessidade (a partir da versão 2.4):

  • prefork;
  • worker;
  • event.

MPM prefork

O formato prefork utiliza múltiplos processos filhos sem threading. Logo cada processo lida com uma conexão por vez. É usado com aplicações que precisam de módulos que não são seguros para thread como o mod_php. Também comum o uso em situações de depuração.

apache-prefork-diagram.png

Figura 2: Diagrama MPM prefork

MPM worker

O MPM worker usa vários threads por processo filho, onde cada thread lida com uma conexão por vez. Logo é uma boa escolha para servidores de alto tráfego, pois permite que mais conexões simultâneas sejam tratadas com menos RAM do que o MPM prefork.

apache-mpm-workers.png

Figura 3: Diagrama MPM worker

MPM event

Por fim, o MPM event ele é o padrão na maioria das instalações do Apache para as versões 2.4 e superiores. Muito semelhante ao MPM worker pois ele também cria vários threads por processo filho. A diferença é que ele faz com que os KeepAlive ou conexões em idle sejam tratadas por um único thread, liberando RAM que pode ser alocada para outros threads.

Este MPM não é adequado para uso com módulos não seguros para thread, tal como o mod_php. Nesses casos utiliza-se o PHP-FPM.

Descobrindo qual MPM está rodando no servidor

Para descobrir qual é o MPM ativo no seu Apache utiliza-se os seguintes comandos:

RedHat like: httpd -V | grep -i mpm

Debian like: apache2ctl -V | grep -i mpm

Configuração dos módulos

É interessante mencionar que em distribuições Debian-like já temos explícito na instalação padrão a configuração dos módulos MPM dentro dos arquivos .conf que ficam no diretório /etc/apache2/mods-available/.

$ cat /etc/apache2/mods-available/mpm_event.conf 
# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of requests a server process serves
<IfModule mpm_event_module>
        StartServers             2
        MinSpareThreads          25
        MaxSpareThreads          75
        ThreadLimit              64
        ThreadsPerChild          25
        MaxRequestWorkers        150
        MaxConnectionsPerChild   0
</IfModule>

Implementando Autenticação

Eventualmente existe a necessidade de implementar uma limitação de acesso em algum site ou web diretório específico.

Uma das estratégias mais comuns de limitação de acesso é a implementação de autenticação. No caso implementa-se um sistema de usuário/senha para que apenas usuários previamente cadastrados possam ter acesso ao site ou ao web diretório em questão.

Para tornar uma pasta protegida por senha, precisamos de uma ferramenta para gerar nome de usuário e senhas e que seja separada da autenticação do sistema. O htpasswd é uma ferramenta e faz parte do pacote apache2-utils que geralmente é instalado. Mas antes disso, temos que dizer ao Apache que um diretório é protegido por senha e então criar credenciais.

Levemos em consideração um arquivo de configuração de site simplificado.

<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

Agora imaginemos que criamos o diretório privado dentro do diretório /usr/share/httpd/ e queremos protegê-lo.

<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

<Directory /usr/share/httpd/privado>
    AuthType Basic
    AuthName "Conteúdo restrito"
    AuthUserFile /etc/httpd/htpass-privado
    Require valid-user
</Directory>

Agora precisamos criar o arquivo de senhas o qual mencionamos no arquivo de configuração.

$ htpasswd -c /etc/httpd/htpass-privado usuario1
New password:
Re-type new password:
Adding password for user usuario1

$ cat /etc/httpd/htpass-privado
usuario1:$apr1$6xfJPmFr$HeZkEX2N1rrjqvQTJdP92

Detalhe importante: Para adicionar novos usuários segue-se a mesma sintaxe do comando acima porém sem a opção "-c".

$ htpasswd /etc/httpd/htpass-privado usuario2
New password:
Re-type new password:
Adding password for user usuario2

$ cat /etc/httpd/htpass-privado
usuario1:$apr1$6xfJPmFr$HeZkEX2N1rrjqvQTJdP92
usuario2:$apr1$pq/.Fs45$IO6d41303ssz4ZG5jrqah/

Por fim o servidor apache deve ser reiniciado. Para isso sempre é possível utilizar o comando apache2ctl que controla diretamente o daemon do apache.

.htaccess

Para evitar editar os arquivos de configuração principais uma boa alternativa é o método de criar um arquivo chamado .htaccess dentro do diretório que precisa ser protegido. Dentro desse arquivo colocamos as configurações de segurança que iríamos colocar em um dos arquivos de configuração principais.

Imaginemos o mesmo caso que citamos anteriormente, no caso queremos criar um diretório chamado privado dentro do diretório publicado por nosso web server.

  1. Criamos o diretório:

$ mkdir privado

  1. Mudamos o cursor para o diretório criado e criamos o arquivo .htaccess dentro dele:

$ cd privado && touch .htaccess

  1. Inserimos o seguinte conteúdo no arquivo:
AuthName "secure folder2"
AuthType Basic
AuthUserFile /etc/httpd/htpass-privado
Require valid-user
  1. Precisamos verificar se a configuração padrão da distribuição permite a utilização do .htaccess, para tanto procure a seguinte seção no arquivo de configuração padrão do Apache no servidor:
### secured with ".htaccess"
       <Directory /var/www/html/protected2>
               AllowOverride AuthConfig
       </Directory>

Por fim é só aplicar um reload no apache para que a seção esteja protegida por usuário/senha.

Redirecionamento

Os redirecionamentos são usados sempre que um site precisa de pessoas que solicitam que um endereço seja direcionado para outro endereço. Existem muitas situações em que podemos precisar disso:

  • Mover para um domínio diferente;
  • Criar uma experiência persistente mesmo quando uma página muda de nome;
  • Forçar o SSL.

Métodos de redirecionamento:

  • Redirecionamentos Temporários: Redirecionamentos temporários são úteis se nosso conteúdo da web para um determinado URL precisa temporariamente ser servido de um local diferente. Por exemplo, se estivermos realizando manutenção no site. Os redirecionamentos temporários informam ao navegador que o conteúdo está temporariamente localizado em um local diferente, mas que eles devem continuar tentando acessar o URL original.
  • Redirecionamentos Permanentes: Os redirecionamentos permanentes são úteis quando nosso conteúdo foi movido para um novo local para sempre. Isso é útil quando precisamos mudar de domínio ou quando o URL precisa mudar por outros motivos e o local antigo não será mais usado. Este redirecionamento informa o navegador que não deve mais solicitar o URL antigo e deve atualizar suas informações para apontar para o novo URL.

É importante destacar que redirecionamentos são executados no lado do client, no caso o servidor Apache informa ao browser que a informação que ele procura agora deve ser acessada a partir de outro endereço, logo o browser carregará esse novo URL na barra de endereço e refará a solicitação.

Criando redirecionamentos

O Apache pode redirecionar usando algumas ferramentas diferentes. As maneiras mais simples são realizadas com ferramentas do módulo mod_alias, mas redirecionamentos mais extensos podem ser criados com mod_rewrite.

Usando a diretiva Redirect

No Apache, podemos realizar redirecionamentos simples de "páginas simples" usando a diretiva Redirect, que está incluída no módulo mod_alias. Esta diretiva leva pelo menos dois argumentos: o URL antigo e o novo URL.

Em sua forma mais simples, seria assim:

<VirtualHost *:80>

 #Redirecting form one directory to another directory
 Redirect /pagina_antiga /pagina_nova
</VirtualHost>

Esse método instrui ao navegador a redirecionar todas as requisições com destino http://endereco.de.exemplo/pagina_antiga para http://endereco.de.exemplo/pagina_nova. Note que esse método é apenas para uma página, não para o site todo.

Se precisarmos criar um redirecionamento permanente, podemos executar de duas formas:

Redirect permanent /pagina_antiga http://www.exemplo.com.br/pagina_nova
Redirect 301 /pagina_antiga http://www.exemplo.com.br/pagina_nova

Tal como acontece com a diretiva Redirect, você pode especificar o tipo de redirecionamento adicionando o código de redirecionamento antes das regras de localização de URL.

Usando a diretiva RedirectMatch

Para redirecionar mais de uma página, podemos usar a diretiva "RedirectMatch", que nos permite especificar padrões de correspondência de texto usando expressões regulares. Isso nos permite redirecionar diretórios inteiros em vez de apenas arquivos individuais.

Por exemplo, se quiséssemos corresponder todas as solicitações de algo dentro do diretório /imagens a um subdomínio denominado imagens.exemplo.com.br, poderíamos usar o seguinte:

RedirectMatch ^/imagens/(.*)$ http://imagens.exemplo.com.br/$1

RedirectMatch corresponde aos padrões entre parênteses e, em seguida, faz referência ao texto correspondente no redirecionamento usando "$1", onde 1 é o primeiro grupo de texto. Os grupos subsequentes recebem números sequencialmente.

O módulo mod_rewrite

A maneira mais flexível, mas complicada de criar regras de redirecionamento, é com o módulo chamado mod_rewrite. Isso está fora do nosso escopo, mas você pode aprender aqui.

Usando a diretiva Alias

Os aliases são como apelidos para diretórios dentro de uma estrutura servida pelo Apache. Ele é muito usado em programas/serviços WEB instados em servidores Linux.

Como por exemplo o sistema de monitoramento Zabbix, quando instalado via gerenciador de pacotes em um servidor Redhat-like os arquivos relacionados a interface web residem em /usr/chare/zabbix. Porém ao final da instalação nos é sugerido que coloquemos o endereço "http://ip.do.host/zabbix/" no navegador.

Isso é possível pois no arquivo de configuração da publicação desse serviço está sendo usada a diretiva Alias da seguinte forma:

Alias /zabbix /usr/share/zabbix

Importante a diretiva Alias é processada do lado do servidor, sendo 100% transparente para o client (diferente da diretiva Redirect).

Virtual Hosting no Apache

Apache é um WEB server muito poderoso, altamente flexível e configurável. Mais um dos recursos mais populares do Apache é a hospedagem Virtual, que nos permite hospedar mais de um site em uma única máquina Linux. Implementar hospedagem virtual com o servidor web Apache pode nos ajudar a economizar nos custos que você está investindo na manutenção e administração do servidor.

Tipos de virtual Host

Existem dois tipos de virtual hosts disponíveis no Apache:

  • Virtual host baseado em nome;
  • Virtual host baseado em IP.
Virtual host baseado em nome

Com a hospedagem virtual baseada em nome, podemos hospedar vários domínios/sites em uma única máquina com um único IP. Todos os domínios nesse servidor estarão compartilhando um único IP. É mais fácil de configurar do que a hospedagem virtual baseada em IP, só precisamos configurar o DNS do domínio para mapeá-lo com seu endereço IP correto e, em seguida, configurar o Apache para reconhecê-lo com os nomes de domínio.

apache-vhost-name-based.png

Figura 4: Diagrama Apache vhost name based

Virtual host baseado em IP

Com a hospedagem virtual baseada em IP, podemos atribuir um IP separado para cada domínio em um único servidor, esses IPs podem ser anexados ao servidor com placas NIC únicas e também com várias NICs.

apache-vhost-ip-based.png

Figura 5: Diagrama Apache vhost name based

Implementando Virtual Host

Vamos tomar por exemplo a configuração de Virtual Host default em um servidor Ubuntu:

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html    

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
  • * indica que esse servidor virtual está ouvindo qualquer endereço de IP na porta 80.
  • ServerName Está comentada mas especifica qual cabeçalho deve ser considerado para esse "vhost". No caso como esse é o arquivo padrão do servidor ele está comentado pois deverá responder para qualquer endereço.
  • DocumentRoot é o diretório default para o site.

Diante desse exemplo de configuração padrão podemos desenvolver os seguintes arquivos de "vhosts".

### exemplo1.conf
<VirtualHost 10.10.12.13:80>
    ServerAdmin webmaster@exemplo1.com.br
    DocumentRoot /var/www/html/exemplo1
    ServerName www.exemplo1.com.br
    ErrorLog ${APACHE_LOG_DIR}/error-exemplo1.log
    CustomLog ${APACHE_LOG_DIR}/access-exemplo1.log combined

</VirtualHost>
### exemplo2.conf
<VirtualHost *:80>
    ServerAdmin webmaster@exemplo2.com.br
    DocumentRoot /var/www/html/exemplo2
    ServerName www.exemplo2.com.br
    ErrorLog ${APACHE_LOG_DIR}/error-exemplo2.log
    CustomLog ${APACHE_LOG_DIR}/access-exemplo2.log combined

</VirtualHost>

Arquivos de Log

O sistema de logs do Apache é bastante flexível ele nos permite criar filtros diferentes, criar arquivos diferentes, apontar para programas, daemons e afins.

Na instalação padrão o Apache registra cada requisição no arquivo /var/log/httpd/access_log quando em um RedHat-like e quando for um Debian-like estará no arquivo /var/log/apache2/access.log. E seu conteúdo seria algo semelhante ao seguinte:

194.132.230.20 - - [14/Nov/2005:22:28:57 +0000] "GET / HTTP/1.0" 200 16440
87.116.23.91 - - [15/Nov/2005:22:45:56 +0000] "GET / HTTP/1.1" 200 36821
87.116.23.91 - - [15/Nov/2005:22:45:56 +0000] "GET /index.php?=PHPE9532F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2146
87.116.23.91 - - [15/Nov/2005:22:45:56 +0000] "GET /index.php?=PHPE9532F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 4644

Sendo cada linha a representação de uma solicitação HTTP registrada no formato Common Log Format (CLF) ou Formato Comum de Log.

Obs.: o formato CLF é bastante comum e a maioria das ferramentas de análise de log conseguem trabalhar com ele.

Da esquerda para a direita cada campo (separado por espaço) do log significa:

  1. IP de origem;
  2. identificação do cliente;
  3. usuário remoto, se autenticado;
  4. timestamp (data, hora, fuso) da requisição;
  5. método HTTP + URI da requisição;
  6. Resposta do servidor com Código do protocolo HTTP;
  7. Tamanho do bloco de dados de resposta em bytes;

A saída de log padrão no ato da instalação do apache utiliza-se das diretivas a seguir:

ErrorLog
Especifica o arquivo que registrará as mensagens de erro do Apache (relacionado ao core do apache);
CustomLog
especifica um arquivo de log personalizado conforme o empacotamento do Apache (relacionado ao modlogconfig);
TransferLog
especifica o arquivo que armazenará as transferências entre o servidor HTTP e o cliente, só permite 1 tipo de formatação de log (a padrão sem definição de nome). Dê preferência ao uso do CustomLog devido sua flexibilidade que veremos a seguir (relacionado ao modlogconfig).

É possível alterar o formato de log padrão para armazenar mais informações sobre cada pedido editando a diretiva LogFormat que pode ser encontrada no arquivo de configuração principal do apache.

A diretiva LogFormat segue o seguinte padrão de configuração:

LogFormat "[formato]" [nome]

Formato
É preenchido com valores conhecidos como "modificadores" sendo que cada um representa uma determinada peça de dados sobre a solicitação de entrada, se formato não for especificado ele seguirá a cadeia de modificadores padrão que é "%h %l %u %t \"%r\" %s %b" Existe uma boa quantidade de modificadores e eles podem ser encontrados na documentação oficial.
Nome
A especificação de um nome permite que você utilize o formato especificado em uma opção de CustomLog ou outra diretiva LogFormat.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %v" full
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %P %T" debug
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Assim com as informações relativas aos modificadores e a sintaxe de uso da diretiva LogFormat podemos começar a personalizar o arquivo de log.

A primeira coisa a fazer é definir o formato que vai atender as suas necessidades. Imaginemos que precisamos de:

  1. IP de origem;
  2. timestamp;
  3. método HTTP + URI;
  4. Resposta do servidor

Portanto:

LogFormat "%h %t %r %s

Por fim coloca-se um rótulo

LogFormat "%h %t %r %s simple

Agora é só utilizar a diretiva CustomLog para atribuir o formato que criamos:

CustomLog logs/access.log simple

Se quisermos também podemos jogar esse LOG em outro arquivo de log para manter o arquivo original no formato padrão:

CustomLog logs/access_simple.log simple

Agora é só recarregar o Apache.

Se algo não der certo verifique as permissões no diretório/arquivos de log que foram configurados.

Data: 2021-03-22 seg 00:00

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-19 dom 18:56

Valid XHTML 1.0 Strict