Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
Os servidores web so a espinha dorsal da Internet, so eles que hospedam todas as pginas, incluindo os mecanismos de busca e
servem como base para todo tipo de aplicativo via web, incluindo os webmails. No futuro, esta tendncia deve se acentuar, com
pginas web dinmicas e aplicativos via web substituindo cada vez mais os aplicativos desktop.
Nos primrdios da internet, eram utilizadas apenas pginas html estticas e scripts CGI. O Apache em si continua oferecendo suporte
apenas a esses recursos bsicos, mas ele pode ser expandido atravs de mdulos, passando a suportar scripts em PHP, acessar bancos
de dados MySQL, entre inmeros outros recursos. Sempre que solicitada uma pgina em PHP ou outra linguagem, entra em ao o
mdulo apropriado, que faz o processamento necessrio e devolve ao Apache a pgina html que ser exibida. Entram em ao, ento,
os gestores de contedo e fruns, que combinam os recursos do PHP com um banco de dados como o MySQL, acessado atravs dele.
A combinao de tudo isso forma a soluo que popularmente chamada de "LAMP" (Linux + Apache + MySQL + PHP).
O Apache e o MySQL, juntamente com o suporte a PHP podem ser tambm instalados sobre o Windows (formando o "WAMP"), uma
soluo relativamente popular entre administradores Microsoft que no se sentem vontade em usar o IIS.
Segundo a Netcraft, pouco mais de 50% dos servidores web do mundo rodam o Apache
(http://news.netcraft.com/archives/web_server_survey.html), a maior parte deles sobre o Linux. O percentual real na verdade um
pouco maior, pois um grande nmero de administradores configuram seus servidores para divulgarem informaes falsas sobre o
servidor web usado, de forma a no fornecer qualquer informao que possa facilitar ataques. Estes servidores no-identificados
aparecem na pesquisa como "other".
Alm de ser um dos servidores web mais antigos e um dos mais seguros, o Apache possui inmeros mdulos, que adicionam suporte
aos mais exticos recursos. A maioria das pginas atuais utiliza uma estrutura em PHP, freqentemente com um banco de
dados MySQL ou PostgreSQL. Existem, inclusive, muitos sistemas prontos, como o phpBB (frum) e o WordPress (para
gerenciamento de contedo), que podem ser instalados sem muita dificuldade depois que o servidor web j estiver rodando.
Alm do servidor web em si, voc quase sempre vai precisar configurar tambm um servidor DNS, que responder pelo domnio do
seu site ou empresa. Aprender a configurar o DNS corretamente importante, caso contrrio voc pode ter problemas ao enviar emails (pela falta do DNS reverso), ou mesmo ter problemas mais graves com o registro do domnio.
A Apache permite hospedar vrios sites no mesmo servidor, recurso chamado de virtual hosts. Apenas os sites mais acessados so
capazes de saturar os recursos de um servidor dedicado de configurao razovel, por isso hospedar vrios sites no mesmo servidor
uma forma de economizar recursos e trabalho.
Instalando o Apache
O Apache pode ser dividido em duas grandes famlias: o Apache 2.x e o Apache 1.3 que, apesar de muito antigo, ainda usado em
muitos servidores. O Apache 2 trouxe muitas vantagens, sobretudo do ponto de vista do desempenho, alm de oferecer novos mdulos
e mais opes de segurana, mas sua adoo foi retardada nos primeiros anos por um detalhe muito simples: o fato de ele ser
incompatvel com os mdulos compilados para o Apache 1.3. Como os mdulos so a alma do servidor web, muitos administradores
ficavam amarrados ao Apache 1.3 devido falta de disponibilidade de alguns mdulos especficos para o Apache 2.
Conforme o tempo foi passando, mais e mais mdulos foram portados, sem falar de novos mdulos desenvolvidos diretamente para
uso em conjunto com o Apache 2. Hoje em dia, o Apache 1.3 ainda sobrevive em muitas instalaes devido inrcia natural que
temos dentro do ramo de servidores, mas no existe nenhum bom motivo para us-lo em uma nova instalao. O Apache 2
simplesmente melhor em todos os quesitos.
Ao instalar o Apache 2, o suporte a SSL instalado automaticamente junto com o pacote principal. Instale tambm o pacote apache2utils, que contm diversos utilitrios de gerenciamento que usaremos a seguir:
# apt-get install apache2 apache2-utils
Se desejar ativar o suporte a pginas seguras, voc vai precisar tambm do pacote "ssl-cert", necessrio para ativar o suporte a SSL e
gerar os certificados. Ele no instalado por padro ao fazer uma instalao enxuta do Debian ou do Ubuntu:
# apt-get install ssl-cert
Se voc estiver utilizando o CentOS ou o Fedora, instale o pacote "httpd", que contm o Apache 2 e os utilitrios:
# yum install httpd
Diferente do Debian, o servio no ser configurado para ser ativado no boot por padro e nem mesmo inicializado automaticamente
aps a instalao. Para ativ-lo, necessrio ativar o servio e, em seguida, criar os links para incio automtico usando o chkconfig
#service httpd start
# chkconfig httpd on
Seguindo os nomes dos pacotes, no Debian o servio se chama "apache2", enquanto no Fedora e no CentOS ele se chama "httpd".
Para reiniciar o servidor voc usa, respectivamente, os comandos "/etc/init.d/apache2 restart" e "service httpd restart".
Acessando o endereo "http://127.0.0.1", voc ver uma pgina de boas-vindas, que indica que o servidor est funcionando. Se no
houver nenhum firewall no caminho, ele j estar acessvel a partir de outros micros da rede local ou da internet:
Por enquanto, temos apenas uma verso bsica do Apache, que simplesmente exibe arquivos html e executa scripts CGI. Por padro, o
diretrio raiz do servidor Web "/var/www" (no Debian) ou "/var/www/html" (no Fedora). Com isso, a pgina
"http://seu.servidor/index.html" , na verdade, o arquivo "/var/www/index.html" ou "/var/www/html/index.html".
Como de praxe, o diretrio raiz definido atravs de uma opo dentro do arquivo principal de configurao (a opo
"DocumentRoot") e pode ser alterado caso desejado. Ao hospedar diversos sites no mesmo servidor, voc define uma pasta raiz
diferente para cada um. Como pode ver, a instalao do Apache propriamente dita bastante simples, o grande desafio configurar e
otimizar o servidor.
Quase sempre, os sistemas desenvolvidos em PHP utilizam tambm um banco de dados MySQL ou Postgre SQL. Naturalmente,
perfeitamente possvel que os scripts simplesmente salvem as informaes em arquivos de texto dentro do diretrio do site, mas isso
resultaria em um desempenho muito ruim, sem falar em eventuais brechas de segurana. Utilizar um banco de dados permite
armazenar um volume muito maior de informaes, acessveis de forma mais segura.
Para que o interpretador PHP seja capaz de acessar o banco de dados, necessrio ter instalado (alm do servidor MySQL
propriamente dito) o mdulo "php5-mysql" (ou "php4-mysql"), que faz a juno entre os dois componentes:
# apt-get install php5-mysql
No caso do PostgreSQL, utilizado o mdulo "php5-pgsql", que tem a mesma funo:
# apt-get install php5-pgsql
No se esquea de reiniciar o Apache, para que as alteraes entrem em vigor:
# /etc/init.d/apache force-reload
No caso do Fedora e do CentOS, muda apenas o nome do pacote, que passa a se chamar simplesmente "php-mysql":
# yum install php-mysql
Para verificar se o suporte a PHP est realmente ativo, crie um arquivo de texto chamado "info.php" (ou outro nome qualquer, seguido
da extenso .php) dentro da pasta do servidor web, contendo apenas a linha abaixo:
<?php phpinfo( ); ?>
Salve o arquivo e abra a pgina atravs do navegador. A funo "phpinfo", que usamos no arquivo, faz com que o servidor exiba uma
pgina com detalhes da configurao do PHP e dos mdulos ativos:
Depois de verificar, remova o arquivo, pois no interessante que essas informaes fiquem disponveis ao pblico.
Instalando o MySQL
O MySQL um banco de dados extremamente verstil, usado para os mais diversos fins. Voc pode acessar o banco de dados a partir
de um script em PHP, atravs de um aplicativo desenvolvido em C ou C++, ou praticamente qualquer outra linguagem (at mesmo
atravs de um shell script! :).
Existem vrios livros publicados sobre ele, por isso vou me limitar a falar sobre a instalao e a configurao necessria para utilizlo em um servidor LAMP, em conjunto com o Apache e o PHP.
O primeiro passo instalar o servidor MySQL propriamente dito. Nas distribuies derivadas do Debian precisamos instalar apenas o
pacote "mysql-server" usando o apt-get:
# apt-get install mysql-server
No CentOS ou Fedora, instalamos os pacotes "mysql" e "mysql-server", usando o yum:
# yum install mysql mysql-server
Voc pode instalar tambm os pacotes "mysql-client" (o cliente que permite acessar os dados e fazer modificaes no banco de dados)
e o "mysql-navigator" (uma interface grfica para ele).
Para que o servio seja configurado para ser carregado durante o boot, ative-o usando o chkconfig:
# chkconfig mysqld on
Antes de iniciar o servio, rode o comando "mysql_install_db". Ele prepara o terreno, criando a base de dados "mysql" (usada para
armazenar a configurao do servidor MySQL, incluindo informaes sobre os usurios e sobre as demais bases de dados) e tambm
uma base de dados chamada "test", que pode ser usada para testar o servidor:
# mysql_install_db
O passo seguinte ativar o servidor MySQL:
# /etc/init.d/mysql start
No caso do Fedora e do CentOS, o servio se chama "mysqld", ao invs de simplesmente "mysql", como no caso do Debian:
# service mysqld start
O MySQL possui um usurio padro chamado "root", que, assim como o root do sistema, tem acesso completo a todas as bases de
dados e usado para fazer a configurao inicial do sistema, assim como tarefas de manuteno. Esta conta inicialmente no tem
senha, por isso voc deve definir uma logo depois de iniciar o servio, usando o comando "mysqladmin -u root password senha",
incluindo a senha desejada diretamente no comando, como em:
# mysqladmin -u root password psUT7wq01
Se voc precisar trocar a senha posteriormente, necessrio acrescentar o parmetro "-p" antes do "password" e, em seguida,
especificar a nova senha, como em:
# mysqladmin -u root -p password psUT7wq01
Enter password: ********
Veja que nesse caso necessrio incluir a senha antiga ao executar o comando, antes de continuar, j que do contrrio teramos uma
brecha bvia de segurana.
Continuando, depois de definir a senha, o prximo passo criar uma base de dados. Voc pode instalar vrios scripts diferentes (um
frum, um chat e um gestor de contedo, por exemplo) no mesmo servidor e, inclusive, vrias cpias de cada um. Isso cada vez
mais utilizado, tanto dentro de sites que oferecem diversos servios, quanto em servidores compartilhados, onde os responsveis por
cada site tm a liberdade de instalar os sistemas de sua preferncia.
Instalando o phpMyAdmin
Depois dessa configurao inicial, voc pode experimentar instalar um gerenciador grfico para facilitar a manuteno do seu servidor
MySQL. Uma boa opo neste caso o phpMyAdmin.
Para instal-lo, basta instalar o pacote "phpmyadmin", como em:
# apt-get install phpmyadmin
ou:
# yum install phpmyadmin
O pacote para instalao em outras distribuies, que no incluam o pacote por padro, pode ser encontrado
no: http://www.phpmyadmin.net/.
O phpMyAdmin um gestor de configurao escrito em PHP que trabalha em conjunto com o Apache. Ele permite que voc crie
bases de dados, ajuste as permisses de acesso dos usurios, faa backup, e diversas outras atividades administrativas de uma forma
mais simples que atravs do prompt de comando.
Uma vez instalado, ele pode ser acessado atravs do endereo "http://servidor/phpmyadmin/" ou "https://servidor/phpmyadmin/". Na
tela inicial, voc pode se logar usando qualquer uma das contas registradas no MySQL. Use o root para tarefas administrativas,
quando for necessrio ter acesso a todas as bases ou fazer backup de tudo, e uma das contas restritas para acessar uma base especfica:
O acesso via HTTPS prefervel para acessos feitos via web, j que evita que as senhas de acesso e outras informaes fiquem
circulando em texto puro por a. O pacote do Debian se encarrega de ativar o suporte a SSL no phpMyAdmin automaticamente, mas
para us-lo necessrio tambm ativar o suporte a SSL na configurao do Apache.
Caso, mesmo depois de gerar o certificado e ativar o SSL no Apache, voc continue recebendo um erro ao tentar acessar a interface do
phpMyAdmin via SSL, experimente reconfigurar o pacote usando o dpkg-reconfigure, como em:
# dpkg-reconfigure phpmyadmin
Selecione a opo "apache2" quando o script perguntar sobre o servidor web usado e responda "sim" quando ele perguntar se voc
deseja reiniciar o servio:
No CentOS e em diversas outras distribuies o phpMyAdmin vem configurado por padro para permitir conexes apenas a partir da
mquina local, uma precauo de segurana. Com isso, ao tentar acessar a interface remotamente, voc recebe um "Forbidden. You
don't have permission to access /phpmyadmin/ on this server". Para solucionar o problema, edite o arquivo
"/etc/httpd/conf.d/phpmyadmin.conf" e comente a linha "Deny from All", dentro da seo "<Directory "/usr/share/phpmyadmin">",
como em:
<Directory "/usr/share/phpmyadmin">
Order Deny,Allow
# Deny from all
Allow from 127.0.0.1
</Directory>
Uma observao importante que ao ser usado em conjunto com o Apache, instalado no mesmo servidor que ele, o MySQL
acessado apenas localmente, atravs da interface de loopback. O Apache envia a requisio ao mdulo PHP que faz o acesso ao banco
de dados, tudo localmente. Nessa configurao, o servidor MySQL no deve ficar disponvel para a Internet. Configure o firewall
para bloquear a porta 3306 usada pelo servidor MySQL, alm de todas as outras portas que no forem explicitamente necessrias.
Caso o servidor MySQL precise ficar acessvel para outros servidores (voc pode configurar o phpBB e outros scripts para utilizarem
um servidor MySQL externo), configure o firewall para deixar a porta aberta apenas para os endereos IP dos servidores que forem ter
acesso. Como os servidores dedicados sempre utilizam endereos fixos (ao contrrio dos servidores domsticos), esta configurao
fica mais simples.
Para administrar seu servidor MySQL remotamente, o ideal que se conecte ao servidor via SSH e faa todo o trabalho atravs dele.
Se precisar acessar diretamente alguma ferramenta de configurao, como o Webmin ou o phpMyAdmin, voc pode criar um tnel
(novamente usando o SSH) ligando a porta correspondente do servidor a uma porta da sua mquina e fazer o acesso atravs dela.
- /etc/apache2/sites-available/joao:
<VirtualHost *:80>
ServerAdmin joao@joao.com.br
ServerName www.joao.com.br
ServerAlias joao.com.br www.joao.com.br
DocumentRoot /var/www/joao
</VirtualHost>
- /etc/apache2/sites-available/maria:
<VirtualHost *:80>
ServerAdmin maria@gmail.com
ServerName www.maria.com.br
ServerAlias maria.com.br www.maria.com.br
DocumentRoot /var/www/maria
</VirtualHost>
Note que adicionei uma nova diretiva, a "ServerAlias", que permite que o site seja acessado tanto com, quanto sem o "www". A linha
"ServerAdmin" , na verdade, opcional, contm apenas o e-mail de contato do administrador do site.
A mesma configurao usada se voc quiser hospedar os sites usando subdomnios, como em "joao.gdhn.com.br" e
"maria.gdhn.com.br". Nesse caso, no usamos o "www" e, por isso, no precisamos da linha "ServerAlias":
<VirtualHost *:80>
ServerAdmin hostmaster@gdhn.com.br
ServerName maria.gdhn.com.br
DocumentRoot /var/www/maria
</VirtualHost>
Depois de feita a configurao, ative ambos os sites usando o comando a2ensite, o que criar links para eles na pasta
"/etc/apache2/sites-enabled":
# a2ensite joao
# a2ensite maria
Para que a configurao funcione, necessrio editar tambm o arquivo "/etc/apache2/sites-available/default", substituindo as
linhas:
NameVirtualHost *
<VirtualHost *>
Por:
NameVirtualHost *:80
<VirtualHost *:80>
Essa configurao necessria para que voc possa ativar o suporte a SSL para os virtual hosts. Sem ela, alm do SSL no funcionar,
voc precisaria modificar a configurao de cada um, usando sempre "<VirtualHost *>" ao invs de "<VirtualHost
*:80>".
Voc pode adicionar quantos sites quiser usando esses mesmos passos. Sempre que alterar a configurao, necessrio atualizar a
configurao do Apache. Nesse caso, o parmetro "reload" suficiente (o "force-reload" necessrio apenas ao ativar ou desativar
mdulos):
# /etc/init.d/apache2 reload
Alm de configurar o servidor web, preciso configurar tambm um servidor FTP ou SFTP, para que os usurios possam acessar os
arquivos de suas respectivas pastas, a fim de atualizarem seus sites. A forma mais simples de fazer isso criar um usurio para cada
um e dar acesso a eles via FTP. Outra opo utilizar o SFTP, que permite acesso seguro.
Veja que as trs coisas acabam se integrando: o Bind resolve os nomes de domnio, o Apache fornece as pginas e o FTP ou SFTP
mostrar alguma publicidade da empresa responsvel pelo servidor, ou uma lista dos sites hospedados, por exemplo.
No exemplo, podemos ver que est sendo usado o pacote "apache2-mpm-prefork", que justamente a verso usada por padro.
O mpm-prefork a verso tradicional do Apache, onde cada instncia inicia um nico thread e atende a uma nica requisio por vez,
isolando o processamento de cada pgina servida. Isso torna a operao do servidor mais estvel e menos vulnervel a mdulos ou
pginas mal escritas, mas, em compensao, consome um pouco mais de memria RAM que o mpm-worker, onde cada instncia do
Apache pode abrir vrios threads, de acordo com a necessidade.
Para pequenos servidores, onde voc no precise necessariamente extrair cada gota de desempenho do servidor, o mpm-prefork a
escolha mais segura, mas em casos em que o servidor precise operar no limite, voc pode realizar testes com o mpm-worker de forma
a avaliar se a reduo no consumo de memria significativa.
Voltando configurao, o nmero de instncias abertas (ao usar o mpm-prefork) determinada pela seo abaixo dentro do arquivo
"/etc/apache2/apache2.conf":
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
A opo "StartServers" determina o nmero padro de instncias do Apache que ficaro carregadas na memria, respondendo a
requisies. Cada instncia ocupa cerca de 7 MB de memria (variando de acordo com as opes de compilao usadas ao gerar o
pacote e os mdulos carregados), de forma que 5 instncias consomem cerca de 35 MB de memria do servidor.
Alm das instncias principais, temos instncias "reservas" (spares), que ficam disponveis para absorver rapidamente picos de acesso,
sem que o Apache tenha que perder tempo carregando mais instncias para s depois comear a responder s requisies. As opes
"MinSpareServers" e "MaxSpareServers" determinam o nmero mnimo e mximo de "reservas", sendo que o nmero real flutua
entre os dois parmetros, de acordo com a demanda.
A opo "MaxClients" a parede de concreto, o nmero mximo de conexes simultneas que o Apache aceita manter abertas,
independentemente da demanda. Quando esse nmero atingido, o acesso ao site fica cada vez mais lento, pois cada novo visitante
"entra na fila" e precisa esperar que uma das instncias do Apache fique livre, antes de conseguir carregar cada pgina.
Essa configurao default do Apache adequada a um site de baixa demanda, onde o servidor passa a maior parte do tempo
atendendo a um pequeno volume de requisies simultneas, mas recebe picos de trfego esporadicamente. Por padro, o servidor
carregar apenas 5 processos, manter mais 5 a 10 spares ativos e poder carregar mais instncias conforme necessrio, at o limite
mximo de 150 instncias permitidas.
Para um servidor dedicado, que hospede um site com muitas visitas, interessante ajustar estes valores de acordo com a demanda.
Uma forma fcil de verificar o status do servidor ativar a diretiva "server-status" dentro do arquivo "/etc/apache2/apache2.conf".
Adicione as linhas abaixo no final do arquivo:
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 200.234.23.233
# (onde o 200.234.23.233 o IP de onde o relatrio ser acessado)
</Location>
Ative a configurao usando o comando "/etc/init.d/apache2 reload". A partir da, voc pode ver um instantneo do status do servidor
acessando a pasta "server-status", como em "http://www.gdhn.com.br/server-status", a partir do navegador.
A oitava linha indica o nmero de instncias abertas, como em:
8 requests currently being processed, 5 idle workers
Nesse exemplo temos 8 conexes abertas e 5 instncias reservas do Apache abertas, prontas para receber novas conexes. A
velocidade do acesso ao site est normal. Mas, o que acontece no caso de um pico de acesso, com mais do que 150 acessos
simultneos? Na configurao padro voc teria:
150 requests currently being processed, 0 idle workers
Ou seja, o Apache responde s primeiras 150 conexes e coloca as demais na fila, fazendo com que os visitantes precisem esperar at
que algum dos processos abertos termine de atender o visitante anterior antes de servirem a requisio. Nesse ponto o acesso ao site
comea a ficar lento, com as pginas demorando mais e mais para comearem a ser carregadas. Em casos mais extremos, o tempo de
espera poderia ser tamanho que o site ficaria virtualmente fora do ar. o que muitas vezes acontece com links publicados em sites
muito acessados, como o slashdot.org.
Isso pode ser minimizado de duas formas. A primeira aumentando o nmero de instncias ativas do Apache (de forma que o servidor
tenha instncias suficientes para atender a todas as requisies sem precisar abrir novos processos) e aumentando o valor configurado
na opo "MaxClients", de forma que o servidor possa atender a um volume maior de requisies nos horrios de pico.
Os valores ideais variam de acordo com o volume de memria disponvel no servidor e a quantidade de memria usada por cada
processo do Apache. Comece usando o comando "ps -ylC apache2 --sort:rss" (no Debian/Ubuntu) ou "ps -ylC httpd --sort:rss" (no
Fedora/CentOS) para verificar o volume de memria usado por cada instncia do Apache:
# ps -ylC apache2 --sort:rss
O comando exibe uma linha para cada processo do Apache ativo, de forma que a lista pode ser longa. O volume de memria gasto por
cada um (em kbytes) mostrado na oitava coluna. Descartando as primeiras e as ltimas linhas, voc tem uma boa aproximao dos
valores mdios, como em:
S
S
S
S
S
33
33
33
33
33
17530
17491
17529
17472
17438
16102
16102
16102
16102
16102
0
0
0
0
0
78
75
75
75
75
0
0
0
0
0
6008
6036
6036
6044
6056
5038
5036
5038
5038
5036
341548
354540
357283
359161
351130
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
apache2
apache2
apache2
apache2
apache2
Veja que no exemplo cada processo consome aproximadamente 6 MB de memria RAM. Estes valores no devem ser levados ao p
da letra, pois o ps no leva em conta as reas de memria compartilhadas entre os processos, de forma que na prtica o consumo total
sempre um pouco mais baixo. De qualquer forma, estes so os melhores nmeros que temos.
O prximo passo verificar quanto os demais servios ativos no servidor (MySQL, servidor de e-mails, etc.) consomem, de forma a
ter uma estimativa de quanta memria est disponvel para uso do Apache. Uma forma simples de fazer isso desativar
temporariamente o Apache (/etc/init.d/apache2 stop) e usar o comando "free" para ver a memria disponvel, como em:
# free
total used free shared buffers cached
Mem: 127132 124640 2492 0 40732 45236
-/+ buffers/cache: 35804 91328
Swap: 409616 48 409568
A linha "Mem" mostra o total de memria usada, incluindo o cache de disco. Ela sempre mostra que quase toda a memria est
ocupada, pois normal que o sistema utilize a memria disponvel para fazer cache de disco. O que realmente nos interessa a
segunda linha (-/+ buffers/cache), que no exemplo mostra que o servidor possui cerca de 90 MB de memria disponvel (nesse
exemplo estou usando um VPS com apenas 128 MB de memria, que serve como exemplo de servidor com poucos recursos).
Se cada processo do Apache ocupa cerca de 6 MB de memria, significa que o servidor poderia manter de 15 a 18 instncias
carregadas na memria (levando em conta que o consumo real sempre um pouco inferior ao mostrado pelo ps) antes de comear a
usar um volume significativo de memria swap. Uma boa configurao nesse caso seria:
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 18
MaxRequestsPerChild 0
</IfModule>
Permitir que o Apache abra mais instncias acabaria sendo contra produtivo, pois o uso de muita memria swap derrubaria o
desempenho do servidor, fazendo com que cada instncia demorasse mais para processar cada pgina. Com isso, o nmero total de
pginas servidas acabaria sendo menor do que usando apenas 18 processos.
No caso de um servidor com 1 GB de memria RAM, por outro lado, provavelmente teramos 900 MB ou mais de memria
disponvel para o Apache, de forma que uma configurao mais adequada seria:
# prefork MPM
<IfModule mpm_prefork_module>
StartServers 25
MinSpareServers 25
MaxSpareServers 50
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
Com isso, teramos 25 processos "fixos" do Apache, complementados por mais 25 a 50 spares, nmero que pode crescer at um
mximo de 200 processos simultneos nos horrios de pico. A partir da, voc poderia monitorar o volume de memria livre no
servidor (atravs do comando "free") e o volume de acessos atravs da pgina de estatsticas e ajustar as opes "StartServers" e
"MinSpareServers" de acordo com o nmero mdio de acessos simultneos, de forma que o nmero de processos do Apache e de
spares disponveis seja sempre um pouco maior do que o nmero mdio de conexes ao servidor:
Outras opes
A opo "MaxRequestsPerChild", includa logo depois no arquivo, limita o nmero de requisies que cada processo do Apache pode
responder antes de ser encerrado e substitudo por outro. Ela no tem um efeito direto sobre o desempenho, servindo apenas como
uma proteo contra eventuais vazamentos de memria, que pudessem fazer o processo crescer at ocupar toda a memria do
servidor. Uma boa configurao o valor "1000", que evita que os processos sejam fechados muito freqentemente (o que
prejudicaria o desempenho), mas ao mesmo tempo faz com que a opo atenda a seu propsito:
MaxRequestsPerChild 1000
Como de praxe, a soluo definitiva para melhorar o desempenho do servidor, permitindo que ele atenda a mais requisies
simultneas, instalar mais memria RAM, de forma que ele possa manter mais instncias do Apache carregadas na memria e possa
fazer mais cache de disco (reduzindo o volume de operaes de leitura no HD). importante monitorar constantemente o uso de
memria do servidor e atualizar o servidor conforme necessrio.
Outra opo que afeta negativamente o desempenho a "HostNameLookups", que faz com que o Apache verifique a origem de cada
acesso, fazendo uma busca de domnio. Ativar essa opo permite criar estatsticas de acesso mais detalhadas, incluindo os pases e
provedores de acesso usados pelos visitantes, mas tem um impacto negativo muito grande na performance de um servidor
congestionado. No Apache 2 ela j vem desativada por padro, mas em verses antigas era necessrio desativ-la manualmente:
HostNameLookups Off
Se voc faz questo de gerar estatsticas de acesso detalhadas, pode obter o mesmo resultado usando o "logresolve", um aplicativo que
realiza as operaes de resoluo de nomes diretamente nos arquivos de log. Voc pode criar um script para fazer com que ele seja
executado uma vez por dia, por exemplo. A sintaxe do comando a seguinte:
# logresolve -s access.stats -c < access.log > access_log.new
No exemplo, o "access.log" o arquivo original de log, o "access_log.new" o arquivo modificado que ser gerado e o "access.stats"
o arquivo onde sero salvas as estatsticas.
Continuando, se o seu servidor j est operando no limite, recebendo mais requisies do que consegue atender nos horrios de pico,
uma foma simples de reduzir o carregamento do servidor ajustar a opo "KeepAliveTimeout", que determina o tempo que os
processos do Apache devem aguardar por novas requisies do mesmo cliente antes de serem finalizadas.
A idia por trs dessa opo permitir que a mesma conexo TCP seja usada para enviar diversos arquivos, se possvel toda a pgina
que est sendo carregada, incluindo as imagens. Com isso, o tempo de carregamento reduzido (j que no mais necessrio abrir
uma nova conexo para cada elemento da pgina a ser carregado) e os processos do Apache ficam logo livres para responder a outras
requisies.
O default so 15 segundos, o que um valor seguro, j que mesmo as conexes mais lentas no chegam a ter um tempo de latncia
to alto. O problema que o tempo de espera faz com que os processos fiquem ativos na memria por at 15 segundos a mais do que
realmente precisariam, consumindo memria e reduzindo o nmero de clientes simultneos que o servidor pode atender.
Voc pode aumentar de forma considervel o volume de requisies atendidas pelo servidor reduzindo o valor de 15 para 3 segundos.
Um exemplo de configurao completa :
KeepAlive On
MaxKeepAliveRequests 180
KeepAliveTimeout 3
A opo "KeepAlive On" deve estar presente, j que ela a responsvel por ativar o recurso. A opo "MaxKeepAliveRequests"
determina o nmero mximo de conexes que devem ser mantidas ativas. Ela deve ser setada com um valor um pouco mais baixo que
o da opo "MaxClients", que vimos anteriormente.
Concluindo, voc pode simular trfego no seu servidor, verificando como ele se comporta com nveis variados de trfego usando o
comando "ab", que faz parte do pacote "apache2-utils". Chame-o indicando o nmero de requisies simultneas e a pgina que ser
carregada, como em:
$ ab -n 1000 -c 20 http://www.meusite.com/teste.php
Nesse exemplo, estamos fazendo 1000 acessos pgina, mantendo 20 requisies simultneas. Se possvel, lance o teste a partir de
outro servidor com link rpido, ou pea para vrios amigos rodarem o comando simultaneamente, cada um usando sua prpria
conexo. Isso transformar o teste em algo mais parecido com uma situao normal, onde o servidor receba um pico de acessos.
Uma opo que no tem a ver com o desempenho, mas que ajuda a reduzir o volume de ataques casuais contra o seu servidor a
opo "ServerTokens". Na maioria das distribuies, ela vem configurada com o valor "Full", que faz com que seu servidor
disponibilize informaes detalhadas sobre a verso do apache e os mdulos utilizados, como "Apache/2.2.3 Debian PHP/5.2.08etch11", o que facilita bastante o trabalho dos atacantes. Voc pode evitar isso configurando a opo com o valor "Prod", que faz
com que o servidor responda apenas "Apache", sem nenhum detalhe adicional (caso a linha no esteja presente, basta adicion-la no
final do arquivo):
ServerTokens Prod
Outra configurao importante bloquear o acesso a includes e arquivos de configurao em geral colocados dentro dos diretrios de
dados do site. Isso evitar que arquivos .inc, .tpl, .sql e de outras extenses tipicamente usadas em arquivos de configurao e em
includes usados na montagem das pginas possam ser acessados diretamente pelos visitantes. Para isso, inclua na configurao uma
seo "filesmatch", especificando as extenses cuja exibio deve ser bloqueada, como em:
<filesmatch ".(inc|tpl|h|ihtml|sql|ini|conf|bin|spd|sh|theme|module)$">
Deny from all
</filesmatch>
Depois de terminar a edio do arquivo "/etc/apache2/apache2.conf", no se esquea de aplicar as alteraes usando o comando:
# /etc/init.d/apache2 reload
ou:
# service httpd reload