Curso de extensão em Administração de redes com GNU/Linux
Italo Valcy - italo@dcc.ufba.br
Gestores da Rede Acadêmica de Computação Departamento de Ciência da Computação
Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da:
Creative Commons License:
Atribuição - Uso não comercial - Permanência da Licença
http://creativecommons.org/licenses/by-nc-sa/3.0/
Nota: Parte deste conteúdo foi inspirado nos
slides de Humberto Galiza (galiza@dcc.ufba.br) em seu curso de “GNU/Linux básico” datado de Março/2009 ministrado no CEFETBa.
Assuntos abordados
Serviços web
Servidor web – Apache
Linguagem dinâmica – PHP Banco de dados – MySQL
Serviços web
Histórico
Início 1989 – CERN (Centro Europeu de
Pesquisas Nucleares) precisava de um meio de
viabilizar o trabalho cooperativo por cientistas
espalhados por diversos países, através da
troca de documentos.
1991 – primeira versão da Web, baseada em texto. 1993 – NCSA - browser gráfico Mosaic
1994 – Netscape
Serviços web
Histórico
Idéia básica: distribuição de conteúdo estático
(tipicamente páginas escritas em HTML).
Evolução: distribuição de conteúdo gerado
dinamicamente, em resposta a dados fornecidos
pelo usuário (por exemplo através da consulta a
um banco de dados corporativo).
CGI – Common Gateway Interface: a forma
mais antiga de prover conteúdo dinâmico.
Servidor web
Protocolo HTTP
HTTP - HyperText Transmission Protocol – é o
protocolo usado na comunicação entre o
servidor Web e o Browser.
HTTP constitui a base sobre a qual o servidor
Web realiza suas operações.
A idéia inicial era a de que o HTTP deveria ser
um protocolo bem simples.
Mesmo após várias modificações e melhorias, a
idéia básica do HTTP continua sendo a mesma,
simplicidade.
Servidor web
Funcionamento do serviço
Uma conexão HTTP é feita como comandos
telnet, que por sua vez são formados por
mensagens texto trocadas através de uma
conexão TCP.
Um exemplo:
$ telnet app.dcc.ufba.br 80 Trying 200.17.147.9... Connected to app.dcc.ufba.br. Escape character is '^]'. GET /~italo/helloworld.html HTTP/1.0Servidor web
Funcionamento do serviço
A resposta também será em texto-limpo:
HTTP/1.1 200 OK Date: Sun, 03 May 2009 14:14:42 GMT Server: Apache/2.2.9 (Debian) mod_fastcgi/2.4.6 mod_ldap_userdir/1.1.14 PHP/5.2.61+lenny2 with SuhosinPatch mod_python/3.3.1 Python/2.5.2 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0 LastModified: Sun, 03 May 2009 14:14:16 GMT ETag: "33daf3646902a92d1e00" AcceptRanges: bytes ContentLength: 54 Connection: close ContentType: text/html <html> <body> <p>Hello world!</p> </body>
Servidor web
Funcionamento do serviço
Todo site na Web deve manter um processo
servidor que fica aceitando pedidos de conexão
na porta TCP 80.
Uma vez estabelecida a conexão, o cliente
envia um pedido e o servidor envia a resposta
correspondente.
Tendo atendido o pedido, a conexão é
encerrada.
Servidor web
Funcionamento do serviço
Servidor HTTP
Gerencia um sistema virtual de arquivos e diretórios
Mapeia pastas do sistema de arquivos local (ex.: /var/www/htdocs) a diretórios virtuais (ex: /) acessíveis remotamente
Papel do servidor HTTP
Interpretar requisições HTTP do cliente (métodos GET, POST, …)
Devolver resposta HTTP à saída padrão (código de resposta 200, 404, etc., cabeçalho e dados)
Papel do cliente HTTP
Servidor web
Funcionamento do serviço
Métodos
GET: solicita algum recurso como um arquivo ou um
script CGI
HEAD: É o mesmo que GET, porém retorna apenas o
cabeçalho da resposta.
POST: Envia dados para serem processados (ex. forms
html)
PUT: Envia certo recurso. DELETE: Exclui o recurso.
OPTIONS: Recupera os métodos HTTP que o servidor
Servidor web
Funcionamento do serviço
Resposta - Códigos de retorno
1xx: Informational (Informação) – utilizada para enviar
informações para o cliente de que sua requisição foi recebida e está sendo processada;
2xx: Success (Sucesso) – indica que a requisição do
cliente foi bem sucedida;
3xx: Redirection (Redirecionamento) – informa a ação
adicional que deve ser tomada para completar a requisição;
4xx: Client Error (Erro no cliente) – avisa que o cliente
fez uma requisição que não pode ser atendida;
Servidor web
LAMP
Linux -> Estabilidade
Apache -> Solidez
MySQL -> Banco de Dados
PHP -> Linguagem Dinâmica
Servidor web
Servidor web
Apache
Foi criado em 1995 por Rob McCool, então
funcionário do NCSA (National Center for
Supercomputing Applications).
Segundo pesquisas de março de 2009[1], é
utilizado em 45,95% dos servidores web ativos.
Servidor web
Apache - recursos
Suporte a HTTP para criação de hosts virtuais
Suporte SSL
Suporte CGI, Perl e PHP
Suporte a autenticação baseado em HTTP
Suporte a Server Side Includes (SSI)
Suporte a Servlets Java
Logs Customizáveis
Servidor web
Apache - versões
Apache 1
Suporte a DSO (Dynamic Shared Objects), permite a carga e descarga dinâmica de módulos
Suporte a Windows NT e sucessores
Apache 2
Suporte a Ipv6
Suporte a multithreading e multiprocessamento
Melhorias em diversos módulos (mod_ssl, mod_proxy, etc.)
Servidor web
Instalação do apache
No Debian GNU/Linux:
aptitude install apache2Gerenciando o daemon:
Servidor web
Configuração do apache
Diretório global de configuração no Debian:
/etc/apache2 ou /etc/apache
Apache 1.3.x
httpd.conf – arquivo de configuração principal srm.conf – guarda a diretiva DocumentRoot access.conf – controle de acesso a arquivos
Servidor web
Configuração do apache2
ports.conf e apache2.conf
ports.conf – portas cujo daemon httpd irá escutar Modelo simplificado de configuração global:
/etc/apache2/apache2.conf
Diretórios de configuração:
Configurações globais específicas
/etc/apache2/conf.d/
Módulos disponíveis
/etc/apache2/mods-available/
Módulos disponíveis e habilitados no momento:
/etc/apache2/mods-enabled/
“Sites” disponíveis, mas desabilitados
Servidor web
Configuração do apache2
Seção global configuration: Define configurações que irão alterar o comportamento do servidor web
ServerRoot ErrorLog
/etc/apache2/conf.d/:
security – opções padrão de segurança do servidor web charset – codificação padrão para as páginas servidas
Carga e descarga de módulos:
a2enmod <nome_do_modulo> a2dismod <nome_do_modulo>
Servidor web
Módulos do apache2
mod_userdir
Permite que usuarios tenham um diretório acessível pelo servidor web.
Por padrão este diretório é o /home/<usuario>/public_html/ e pode ser acessado via URL: http://site.com.br/~usuario/
mod_status – Informações sobre a saúde do servidor mod_alias – Permite construir aliases entre localizações mod_proxy
Permite transformar o apache2 em um servidor proxy (tanto proxy direto, quanto proxy reverso)
Servidor web
Habilitando e desabilitando sites
Os sites são configurados no /etc/apache2/sites-available. Cada arquivo de configuração ali define os recursos que o site dispõe e políticas de acesso à esses recursos.
Para gerenciar seus sites:
a2ensite <arquivo_de_configuracao> a2dissite <arquivo_de_configuracao>
OBS: Onde <arquivo_de_configuracao> é um arquivo texto existente no diretório /etc/apache2/sites-available/
Servidor web
Virtual hosts
Capacidade de hospedar mais do que um web
site numa única máquina, com um endereço IP
ou mais.
Name-Based Virtual Hosts IP-based Virtual Hosts
Servidor web
Name-based Virtual hosts
Forma mais utilizada, pois é necessário apenas um IP para hospedar múltiplos sites web (vários domínios)
A configuração é feita diretamente em /etc/apache2/sites-available/<nome-do-site>
Para ativar o suporte a Name-based Virtual Hosts, basta adicionar a sub-diretiva de configuração: “NameVirtualHost *:80”
O “*:80” fará com que o apache possa aceitar todas as conexões de entrada na porta 80 (HTTP)
O próximo passo é criar o arquivo do site:
Servidor web
Name-based Virtual hosts
Exemplo: /etc/apache2/sites-available/meusite <VirtualHost *:80> ServerName www.example.com DocumentRoot /var/www/example.com ServerAdmin webmaster@example.com ErrorLog /var/log/apache2/example.comerror_log CustomLog /var/log/apache2/example.comaccess_log common </VirtualHost> <VirtualHost *:80> ServerName www.othercompany.com DocumentRoot /var/www/othercompany.com ServerAdmin webmaster@othercompany.com ErrorLog /var/log/apache2/othercompany.comerror_log CustomLog /var/log/apache2/othercompany.comaccess_log common </VirtualHost>
Servidor web
Name-based Virtual hosts
Na subdiretiva “NameVirtualHost *” autorizamos o apache aceitar todas as conexões
Neste exemplo, temos 2 virtual hosts em um mesmo arquivo de configuração (típico exemplo, onde temos 2 sites hospedados na mesma máquina).
O Apache lê o campo HOST do cabeçalho HTTP para saber para que site (virtualhost) repassar a conexão. O site que irá receber a requisição, é aquele cuja diretiva
ServerName for exatamente igual ao campo HOST do
Servidor web
Name-based Virtual hosts
As diretivas ErrorLog e CustomLog não precisam conter o dominio. Pode ser qualquer outro nome. Se não for especificado um, o apache enviará os logs para o local padrão:
/var/log/apache2/error.log /var/log/apache2/access.log
ServerAdmin: representa o e-mail do responsável por
aquele determinada Virtual Host. Em caso de problemas, este e-mail aparecerá nas mensagens reportadas pelo servidor
DocumentRoot – Raiz do site web – diretório que
Servidor web
IP-based Virtual hosts
Nesta modalidade, uma mesma máquina, terá apenas uma instância do apache, e esta por sua vez, responderá por vários sites web, mas cada um com um endereço IP diferente.
Este cenário requer a configuração de múltiplos endereços IP para a mesma máquina.
O recurso de IP alias (virtual interfaces) do linux pode ser bastante útil neste caso
Servidor web
IP-based Virtual hosts
Exemplo: /etc/apache2/sites-available/meusite2 <VirtualHost 192.168.1.20:80> ServerName www.example2.com DocumentRoot /var/www/example2.com ServerAdmin webmaster@example2.com ErrorLog /var/log/apache2/example2.comerror_log CustomLog /var/log/apache2/example2.comaccess_log common </VirtualHost> <VirtualHost 192.168.1.21:80> ServerName www.anothercompany.com DocumentRoot /var/www/anothercompany.com ServerAdmin webmaster@anothercompany.com ErrorLog /var/log/apache2/anothercompany.comerror_log CustomLog /var/log/apache2/anothercompany.comaccess_log common
Servidor web
Prática
Vamos instalar e configurar o apache para servir dois sites usando o conceito de Name-based virtual host. Veja o roteiro da prática em:
http://intranet.dcc.ufba.br/pastas/extensao/curso-graco/praticas/ apache-pratica.odt
Servidor web
Suporte à PHP
Desenvolvido por Rasmus Lerdforf em 94 Roda em Unix e Win32
Versão mais recente é PHP 5.2.9 - www.php.net Instalação
aptitude install libapache2-mod-php5
Reinicie o apache para carregar o módulo
invoke-rc.d apache2 restart
Testando: Crie um arquivo teste.php com o conteúdo abaixo e coloque na raiz do seu site ativo:
<?php
Servidor web
Conteúdo dinâmico
com CGI
Servidor web
CGI – Common Gateway Interface
Tecnologia que permite gerar páginas dinâmicas, permitindo ao navegador passar parâmetros para um programa (script) hospedado no servidor web.
CGI define uma maneira padrão para o servidor web interagir com programas externos de geração de conteúdo. Exemplos: Perl Python PHP JSP
Servidor web
CGI – Common Gateway Interface
Existem duas formas de executar scripts CGI:
arquivos em diretórios específicos, configurar um
diretório personalizado.
A diretiva ScriptAlias diz ao apache que um
certo diretório é destinado à execução de scripts
CGI (todos os arquivos serão considerados
scripts CGI).
Para configurar um outro diretório é preciso
informar quais serão scripts CGI e também
pertimir execução CGI naquele diretório.
Servidor web
CGI – Common Gateway Interface
Usando ScriptAlias # CGI Directory ScriptAlias /cgibin/ /var/www/example.org/cgibin/ <Location /cgibin> Options +ExecCGI </Location>
Permitindo CGI em diretórios de usuários (sem uso do
ScripAlias):
<Directory /home/*/public_html> Options +ExecCGI
AddHandler cgiscript .cgi .pl </Directory>
Servidor web
Escrevendo scripts CGI
Ao escrever scripts CGI é preciso se atentar à dois detalhes:
Toda a saída do script deve ser precedida por um MIME-type header, parte do cabeçalho do HTTP. Esse cabeçalho irá informar ao cliente como tratar o conteúdo recebido.
A saída deve ser em HTML ou algum outro tipo de dado que o browser possa exibir.
Mime-types também são utilizados no servidor para determinar qual tratamento deve ser dado. Exemplos:
Servidor web
Escrevendo scripts CGI - perl
Suporte a scripts Perl:
aptitude install libapache2-mod-perl2
Exemplo de helloworld.pl:
#!/usr/bin/perl
print "Contenttype: text/html\n\n"; print "Hello, World.";
Acessando variáveis de ambiente (printenv.pl):
#!/usr/bin/perl
print "Contenttype: text/html\n\n"; foreach $key (keys %ENV) {
print "$key > $ENV{$key}<br>"; }
Servidor web
Servidor web
Adicionando suporte à SSL
Neste ponto, temos um servidor web funcional, com suporte a Perl e PHP. Entretanto temos um aspecto importante que não mencionamos: segurança.
Como vimos, as transações via HTTP viajam em texto puro (ASCII) pela rede. Isto é um problema quando estamos tratando de dados sigilosos, como senhas, arquivos pessoais, etc.
É necessário então aumentar a segurança do HTTP, utilizando uma camada a mais na comunicação.
Esta camada é conhecida por SSL – Secure Socket
Servidor web
Adicionando suporte à SSL
É um protocolo criptográfico que provê comunicação segura na rede, através da utilização de algoritmos de criptografia
Tudo ocorre da seguinte forma:
O servidor envia uma chave pública (certificado X.509) ao cliente (navegador web) e este informa se irá aceitar ou não a autenticidade daquela chave
Caso aceite, o navegador envia um número aleatório para o servidor
Os dois lados usam o número aleatório gerado para definir a chave de sessão a ser utilizada, e então a comunicação é estabelecida
Servidor web
Servidor web
Adicionando suporte à SSL
O ideal é que alguma autoridade certificadora, seja ela pública ou privada, assine nossos certificados digitais. Porém isso pode ter um alto custo.
Assim, nos resta a opção de gerarmos certificados padrão X.509 auto-assinados.
No Debian, o pacote openssl provê todos os mecanismos necessários para a geração de um certificado.
aptitude install openssl
Após instalar o openssl é preciso criar um certificado auto-assinado e configurá-lo nos sites.
Servidor web
Adicionando suporte à SSL
Agora que já temos o certificado SSL, vamos fazer o apache entender SSL. Primeira modificação, será fazer o daemon escutar na porta 443 (HTTPS).
Para isso, edite /etc/apache2/ports.conf e adicione:
Listen 443
É importante também lembrar que devemos separar as portas da diretiva NameVirtualHosts para que o webserver saiba quando uma requisição se trata de HTTP ou HTTPS
Servidor web
Adicionando suporte à SSL
O segundo passo, é habilitar o módulo SSL para o apache:
a2enmod ssl
O terceiro passo é criar um VirtualHost com suporte a SSL. Algumas diretivas especiais são necessárias:
SSLEngine On
SSLCertificateFile /path/to/server.crt
Servidor web
Adicionando suporte à SSL
O arquivo de virtual host fica assim:
<VirtualHost *:443> ServerName www.example2.com DocumentRoot /var/www/example2.com ServerAdmin webmaster@example2.com ErrorLog /var/log/apache2/example2.comerror_log CustomLog /var/log/apache2/example2.comaccess_log common SSLEngine on SSLCertificateFile /etc/ssl/certs/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key </VirtualHost>
Servidor web
Servidor web
Bando de dados MySQL
Bando de dados MySQL
MySQL
SGDB – Sistema Gerenciador de Banco de dados
Software livre
Atual versão: 5.0
Compatibilidade com praticamente todas as linguagens de programação comerciais atuais
Suporte multi-plataformas
Suporte a transações, chaves estrangeiras, triggers, storage procedures, etc.
Bando de dados MySQL
Instalação do MySQL
No Debian, o mysql é composto de 2 pacotes:
aptitude install mysql-server mysql-client
O mysql-server traz todos os pacotes
relacionados ao SGDB MySQL.
O mysql-client traz um cliente administrativo
(mysqladmin) mais alguns utilitários como o
mysql (mysql client, mysqldump, etc.)
Bando de dados MySQL
Configuração do MySQL
Todas as informações acerca do funcionamento do
Daemon MySQL estão no arquivo
/etc/mysql/my.cnf.
Devemos ter muito cuidado ao fazer modificações aqui, pois senão podemos prejudicar muito a performance do sistema.
É dividido em seções. A seção [mysqld] é a que trata dos aspectos relativos ao daemon mysql
Principais opções: bind_address User
Bando de dados MySQL
MySQL
A primeira coisa a se fazer após a instalação é
gerar uma senha de superusuário para acesso
ao mysql:
mysqladmin password suasenhaaqui
Uma inovação trazida pelo instalador Debian,
é a possibilidade de informar esta senha logo
durante a instalação do pacote.
Vamos testar nossa instalação:
Bando de dados MySQL
MySQL
Guia de bolso do MySQL para administradores
de redes:
show databases;
use database;
create database nome;
show tables;
describe tabela;
Bando de dados MySQL
Gerenciamento da base de dados
Existem diversas ferramentas no mercardo que são úteis na administração do MySQL.
Podemos destacar duas excelentes ferramentas livres:
MySQL Administrator (pacote mysql-admin) - Desktop
PhpMyAdmin (pacote phpmyadmin) – Web Instalação: