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.
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.
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.
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.
- Criamos o diretório:
$ mkdir privado
- Mudamos o cursor para o diretório criado e criamos o arquivo
.htaccess
dentro dele:
$ cd privado && touch .htaccess
- Inserimos o seguinte conteúdo no arquivo:
AuthName "secure folder2"
AuthType Basic
AuthUserFile /etc/httpd/htpass-privado
Require valid-user
- 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.
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.
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:
- IP de origem;
- identificação do cliente;
- usuário remoto, se autenticado;
- timestamp (data, hora, fuso) da requisição;
- método HTTP + URI da requisição;
- Resposta do servidor com Código do protocolo HTTP;
- 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 diretivaLogFormat
.
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:
- IP de origem;
- timestamp;
- método HTTP + URI;
- 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.