Ads 468x60px

19 de março de 2012

Instalando o Apache parte 1

Hoje iremos falar um pouco sobre servidores web para ser mais exato iremos falar sobre o Apache que é um dos maiores servidores web que existe hoje em dia, sendo um dos mais bem sucedidos no quesito servidor web livre. Foi criado em 1995 por Rob McCool, então funcionário do NCSA (National Center for Supercomputing Applications).Suas funcionalidades são mantidas através de uma estrutura de módulos, permitindo inclusive que o usuário escreva seus próprios módulos, outros servidores HTTP que temos são  IIS da Microsoft, lighttpd, tomcat, nginx, etc.
Tem um Ranking de servidores web utilizados no mundo,  para que podemos dar uma olhada nos mais utilizados até o momento segue o link:
http://news.netcraft.com/archives/web_server_survey.html


Segundo essa pesquisa mais de 50% dos servidores WEB no mundo são Apache, esse número ainda pode ser maior, pois vários administradores de redes configuram seus servidores para não mostrar informações verdadeiras sobre a versão do servidor web a fim de não facilitar ataques de crackers, agora que entendemos um pouco da historia do apache e também o quanto ele é utilizado iremos entender  alguns conceitos.

HTTP
HTTP (acrônimo para Hypertext Transfer Protocol, que significa Protocolo de Transferência de Hipertexto) é um protocolo de comunicação (na camada de aplicação segundo o Modelo OSI) utilizado para transferir dados por intranets e pela World Wide Web (WWW).

Apache MPM Worker e Pre Fork

De acordo com a documentação oficial do projeto Apache, é possível configurar o Apache para trabalhar com aplicações mais novas, aumentando o desempenho ou manter o modo optando por manter a compatibilidade e estabilidade com aplicações que trabalham nativamente com processos, estes modos são o MPM Worker e Pre Fork.

MPM Pre Fork: trabalha utilizando a estrutura clássica de processos Unix, mantendo a compatibilidade com o Apache versão 1.X, neste modo, um processo Apache será responsável  por executar uma série de processos filhos, para atender as conexões que chegarem.

MPM Worker: trabalha com uma implementação mista de processos e threads, possibilitando atender uma quantidade maior de processos sem a necessidade de um aumento de hardware, comparado com a configuração MPM Pre Fork, neste modo, o Apache mantém um processo controlando uma série de threads, o que aperfeiçoa o desempenho para aplicações que suportam threads.

Instalando o Apache

Iremos agora instalar o apache2, a última versão do apache enquanto escrevo esse artigo é a 2.4, para consultar versões e realizar o download dos pacotes você pode usar o próprio site do projeto.


Iremos agora instalar o apache e suas dependências.

# aptitude install apache2-common apache2-mpm-prefork apache2-utils

Se tiver utilizando o red hat ou o suse use o comando abaixo:

# yum install httpd
# service httpd start
Repare que em algumas distribuições o apache se chama apache mesmo na hora da instalação e gerenciar os serviços dele, mas já no red hat / centOS ele se chama httpd.

Após instalado o apache podemos acessa-lo, pela nossa própria maquina ou na maquina de outra pessoa, para acessar via sua maquina use o link abaixo:


Caso não consiga veja se o apache está rodando após a instalação:

# netstat -nptl | grep 80

A porta padrão para um servidor HTTP é a porta 80, caso o serviço do apache não esteja rodando execute o comando abaixo, para iniciar ele:

# /etc/init.d/apache2 restart.

Agora tente acessa-lo novamente, após conseguir iniciar o apache iremos olhar os arquivos de configuração do apache.

# cd /etc/apache2
# ls

Descrição de alguns arquivos que serão achados dentro desse diretório:

apache2.conf : arquivo principal de configuração
httpd.conf : compatibilidade com Apache 1
ports.conf :  portas
sites-available e sites-enabled : guarda os virtual hosts do servidor
mods-available e mods-enabled : armazenam configurações de módulos

Outra curiosidade no red hat, todas essas configurações são encontradas dentro do arquivo /etc/httpd/conf/httpd.conf.

Vamos olhar um pouco o arquivo principal de configuração do servidor apache, mas antes realize um back-up desse arquivo.

#cp apache2.conf apache2.conf.bck

Abra o arquivo com o vim

#vim apache2.conf

Vamos conhecer alguns parâmetros dentro desse arquivo.

**Timeout 300**

Serve para que seu Apache não fique eternamente esperando a resposta de um cliente. Quando alguém acessa o seu site, vocês passam a trocar informações, conforme o seu cliente vai acessando páginas, seu apache vai disponibilizando o site esse tempo é o tempo máximo que o seu server vai esperar a resposta do cliente. Esse cliente nada mais é do que o browser de alguém acessando seu site.
Caso esse alguém fique boiando e não peça mais nada para o server, passou o tempo definido e ele descarta a conexão.
mpm_prefork_module
O MPM é o Multi Processing Modules, ou seja, os módulos de multiprocessamento, que nada mais é do que como irá funcionar o processamento do apache em relação aos acessos no site. Na versão 1 do apache o mesmo só usava um modo de processamento, que era baseado em prefork. Ou seja, o apache assim que iniciava, fazia um fork onde gerava os processos filhos para que esses ficassem responsáveis pelas solicitações ao site. E fork nada mais é do que o processo pai ao iniciar já criar processos filhos, Mas a questão de processos funciona muito bem no Linux.
Ex.
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

StartServers
Indica a quantidade inicial de processos do servidor na hora que inicializa.
MinSpareServers
Define o numero mínimo de processos ociosos que ter dentro do servidor.
MaxSpareServers
Maximo de processos ociosos dentro do servidor, caso o servidor possua uma grande quantidade de memória é bom não abaixar esse numero e sim dar uma aumentada nele.
MaxClients
quantas conexões são aceitas, quando o apache chega nesse limite, ele começa a ficar lento colocando as outras requisições em uma fila de espera.
User www-data / Group www-data
Indicam quem é o usuário e grupo dono dos processos do apache, na versão antiga do apache, o usuário e grupo dono dos processos era o httpd, nessa versão nova é o www-data.

ErrorLog

Define em qual arquivo o apache irá gravar seus logs, que normalmente fica em:

/var/log/apache2/error.log

Agora iremos dar uma olhada no arquivo ports.conf.

#cat ports.conf
Listen 80

Dentro desse arquivo precisamos somente definir em qual porta o apache ficará de escuta,  ou seja irá receber suas requisições.
Agora acesse a pasta sites-available que está dentro de /etc/apache2, dentro dessa pasta iremos criar caso não exista um arquivo chamado default, para indicar ao apache onde ficara o diretório de nossos sites, execute a sequencia de comandos abaixo:
#vim default
Insira essa linha dentro desse arquivo:

DocumentRoot /var/www/

É essa linha que indica ao apache qual pasta que ira ficar nossos sites, coloque algum arquivo dentro dessa pasta, e dente acessa-lo através da url abaixo:


Dentro também desse arquivo existe uma linha interessante que redireciona o usuário para o caminho default do apache é a linha que se segue:

RedirectMatch ^/$ /apache2-default/

Explicando essa linha:

^ = começo de linha
$ = fim de linha
http://127.0.0.1/ <- o “/” vai casar

Caso não queira que isso aconteça comente essa linha

# RedirectMatch ^/$ /apache2-default/

Iremos agora configurar o apache para mostrar, menos informações para o usuário, abra o arquivo /etc/apache2/conf.d/security, execute a sequencia de comandos abaixo:

# vim /etc/apache2/conf.d/security
ServerSignature Off
ServeTokens Prod
TraceEnable Off

Para validar e aplicar essas configurações reinicie o servidor apache.

/etc/init.d/apache2 restart

Tente acessar novamente o link abaixo:

http://127.0.0.1/

Virtual Hosts

O Virtual host permite hospedar vários sites, com domínios diferentes, usando um único servidor e um único endereço IP.

Qual a desvantagem disso?
Não se pode ter um volume muito grande de sites, pois os recursos como hardware e banda são limitados.
São configurados nestes dois diretórios:
/etc/apache2/sites-available: Neste diretório ficam todos os arquivos de configuração dos domínios virtuais.

/etc/apache2/sites-enabled: Neste diretório ficam todos os domínios virtuais ativos, que na verdade são links simbólicos para os arquivos de configuração localizados no diretório citado anteriormente.

Sites available são as configurações disponíveis e sites enables, as ativas.
Criando o virtual Host

Vamos criar um arquivo de teste, execute o comando abaixo:

#vim /etc/apache2/sites-available/teste.com.br

Dentro desse arquivo iremos digitar isso:

NameVirtualHost *
DocumentRoot /var/www/teste
ServerName www.teste.com.br
ErrorLog /var/log/apache2/teste-error.log
CustomLog /var/log/apache2/teste-access.log common

Iremos agora criar o documentroot desse host.

# mkdir /srv/teste-ht
# cd /srv/teste-ht
# echo "Oi mundo" > index.html

Iremos agora ativar esse host/site.

#a2ensite teste.com.br

a2: apache2
en: enable
site: site

Podemos verificar nossa sintax das configurações realizadas antes de reiniciar o apache e aplicar elas, com o comando abaixo.

apache2ctl  –S

Após realizar esse comando e estiver tudo OK, iremos dar um reload no apache para que ele possa ler novamente os arquivos de configuração, caso o reload não funcione corretamente teremos de restarta-lo.

/etc/init.d/apache2 reload
/etc/init.d/apache2 restart

Agora acesse o host, pelo link:


Caso não acesse, tente acrescentar essa linha no arquivo de resolução de nomes, somente para ter certeza que não deu nada errado.

# vim /etc/hosts
O NameVirtualHost diz ao apache que ele deve mapear todos os IPs do servidor para os hosts virtuais abaixo.


Bem vimos muitas coisas até agora mas a função do apache por padrão é fornecer páginas html ou outros arquivos através de download.
Se você quer colocar páginas com script PHP, você deve acionar o módulo para isso.


Instalando o PHP

Para instalar o php dentro de nosso servidor apache iremos primeiro executar os comandos abaixo.

# aptitude install libapache2-mod-php5 php5

Estamos instalando aqui o php5 e seus devidos módulos para o apache2, se estiver usando o red hat use esse comando:

# yum install php

Execute o comando abaixo:

#apache2ctl –M

Verifique se o modulo do php5 agora está ativo dentro do nosso servidor, crie o arquivo abaixo, com o conteúdo que está abaixo do comando:

#vim /var/www/index.php
phpinfo ()
?>

Acesse agora o link abaixo para verificar se está funcionando corretamente o modulo:



O php é uma linguagem de programação bastante robusta, a partir do momento que ativamos o modulo do php dentro do nosso servidor, tornarmos ele um servidor de aplicativos e também a execução de comandos a partir do php, iremos dar uma olhada em como desativar essas opções.

Edite o arquivo abaixo:

# vim /etc/php5/apache2/php.ini

O arquivo php.ini configura todo o comportamento do PHP dentro do apache, por exemplo, no PHP existe a função "exec" ela faz exatamente o que diz: executa qualquer comando na máquina.
Isso é ruim, não pode ser permitido para uma aplicação web em hipótese alguma esse tipo de execução, pois muitas aplicações são bugadas como blogs, forums, etc, e permitem a injeção de comandos por formulários.
Então, temos que desabilitar o exec, essa opção deve ficar aproximadamente na linha 222, colocamos essa opção.

disable_functions = exec

Deixe assim, salve, reinicie o apache.
Agora, edite o index.php, o código PHP fica sempre entre .
No index.php coloque:
exec("ls /etc");
Acesse novamente o índex.php, você deve ter recebido um mensagem mais ou menos assim:
Warning: exec() has been disabled for security reasons in /var/www/index.php on line 2

Algumas opções do PHP.ini

Essas opções abaixo podem ser desabilitadas, para fins de segurança do seu servidor:

show_source
system
shell_exec
passthru
popen
symlink

expose_php = Off -> Essa opção está relacionada mais com privacidade do que com a segurança propriamente dita. Com expose_php habilitada, será possível determinar se o PHP está instalado no servidor. Isso pode ser feito com uma consulta ao servidor web.
Habilitando essa diretriz, a versão do PHP também ficará exposta. Em um caso extremo de haver algum exploit com alguma versão em específico do PHP, essa informação pode ser valiosa para pessoas mal intencionadas.
Exemplo:
$ telnet localhost 80 Trying 127.0.0.1… Connected te localhost. Escape
character is ‘A]’. HEAD / HTTP/1.0
HTTP/1.1 200 OK Date: Sun, 12 Aug 2007 01:33:33 GMT Server:
Apache/2.2.3 (Distro) PHP/5 .2.1 X-Powered-By: PHP/5.2.1 Connection: close
Content-Type: text/html; charset=IS0-8859-1
Connection closed by foreign host.

register_globals = Off -> Essa opção não representa um problema de segurança no PHP, porém pode proporcionar potenciais riscos à segurança do sistema por induzir o desenvolvedor ao erro. Não existe uma boa razão para habilitar essa diretriz e, de modo geral, register_globals deve permanecer sempre com o valor Off.
A partir da versão 4.2 do PHP, essa diretriz foi desabilitada no arquivo PHP.INI padrão e até então essa pequena alteração tem gerado muitas dores de cabeça para desenvolvedores PHP que mantêm scripts antigos, pois é muito comum encontrar códigos que foram escritos sem nenhuma preocupação com relação ao registro de variáveis.

Essas opções abaixo permitem abrir ou processar uma pagina ou arquivo externo dentro do script php. Vários servidores de hospedagem desativam essas opções:
allow_url_fopen = Off
allow_url_include = Off

Bem agora que configuramos nosso servidor e o deixamos um pouco mais seguro iremos então configurar o php para acessar a base de dados.

Habilitando Uso de banco de dados.

Para instalar o modulo do php para conexão ao mysql execute o comando abaixo:

# aptitude install php5-mysql

Se estiver usando o red hat use esse comando:
# yum install php-mysql

Caso queira usar o postgresql, use esse:

# aptitude install php5-pgsql

Bem modulo instalado e usável??? Vamos agora instalar o nosso sgbd.
Instalando o Mysql

Execute o comando abaixo para instalar o mysql:

# aptitude install mysql-server

Em caso esteja usando o red hat use esse:

# yum install mysql mysql-server

Inicie a base de dados com o comando abaixo:

# mysql_install_db

Esse comando irá criar uma base de dados dentro do mysql.

Agora start o serviço.

# /etc/init.d/mysql start

Precisamos definir nossa senha de root dentro da base, utilize esse comando:

# mysqladmin -u root password

Se o caso for trocar a senha do root utilize esse comando:

# mysqladmin -u root –p password

Para acessar a base de dados use do seguinte comando:

# mysql -u root -p

Para sair use o comando abaixo:

mysql > quit

1 comentários: