Curso de extensão em - italo@dcc.ufba.br Gestores da Rede Acadêmica de Computação Departamento de Ciência da Computação Universidade Federal da Bahia
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 CEFET Ba. 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/
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 1994 CERN e M.I.T fundam o W3C (www.w3.org)
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.
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.
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.0 A porta 80 é a padrão para conexões http
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.6 1+lenny2 with Suhosin Patch 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 Last Modified: Sun, 03 May 2009 14:14:16 GMT ETag: "33daf 36 46902a92d1e00" Accept Ranges: bytes Content Length: 54 Connection: close Content Type: text/html <html> <body> <p>hello world!</p> </body> </html>
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. O protocolo HTTP define o conjunto de pedidos possíveis e as respostas correspondentes.
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 Enviar requisições HTTP (GET, POST,...) a um servidor. Processar respostas HTTP recebidas (interpretar cabeçalhos, identificar tipo de dados, interpretar dados)
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 aceita. CONNECT: Serve para uso com um proxy que possa se tornar um túnel SSL.
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; 5xx: Server Error (Erro no servidor) ocorreu um erro no servidor ao cumprir uma requisição válida.
LAMP Linux -> Estabilidade Apache -> Solidez MySQL -> Banco de Dados PHP -> Linguagem Dinâmica
Apache
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.
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 Configuração rápida e simples
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.)
Instalação do apache No Debian GNU/Linux: aptitude install apache2 Gerenciando o daemon: invoke-rc.d apache2 start stop reload restart
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
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 /etc/apache2/sites-available/ Sites disponíveis e habilitados no momento /etc/apache2/sites-enabled/
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> OBS: O arquivo <nome_do_modulo> é um módulo disponível em /etc/apache2/mods-available
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)
Habilitando e desabilitando sites Os sites são configurados no /etc/apache2/sitesavailable. 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/
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 Múltiplas instâncias do Apache na mesma máquina
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: /etc/apache2/sites-available/<nome-do-site>
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.com error_log CustomLog /var/log/apache2/example.com access_log common </VirtualHost> <VirtualHost *:80> ServerName www.othercompany.com DocumentRoot /var/www/othercompany.com ServerAdmin webmaster@othercompany.com ErrorLog /var/log/apache2/othercompany.com error_log CustomLog /var/log/apache2/othercompany.com access_log common </VirtualHost>
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 cabeçalho lido.
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 contém o conteúdo a ser exibido.
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
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.com error_log CustomLog /var/log/apache2/example2.com access_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.com error_log CustomLog /var/log/apache2/anothercompany.com access_log common </VirtualHost>
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
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 phpinfo();?>
Conteúdo dinâmico com CGI
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 etc
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.
CGI Common Gateway Interface Usando ScriptAlias # CGI Directory ScriptAlias /cgi bin/ /var/www/example.org/cgi bin/ <Location /cgi bin> Options +ExecCGI </Location> Permitindo CGI em diretórios de usuários (sem uso do ScripAlias): <Directory /home/*/public_html> Options +ExecCGI AddHandler cgi script.cgi.pl </Directory>
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: AddType application/pdf.pdf AddType application/x-tar.tar
Escrevendo scripts CGI - perl Suporte a scripts Perl: aptitude install libapache2-mod-perl2 Exemplo de helloworld.pl: #!/usr/bin/perl print "Content type: text/html\n\n"; print "Hello, World."; Acessando variáveis de ambiente (printenv.pl): #!/usr/bin/perl print "Content type: text/html\n\n"; foreach $key (keys %ENV) { print "$key > $ENV{$key}<br>"; } Permissão para execução: chmod +x helloworld.pl printenv.pl
Adicionando suporte à SSL
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 Layer
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 A chave de sessão é utilizada para criptografar o pacote SSL Criptografia simétrica é utilizada por ser mais rápida
Adicionando suporte à SSL
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 autoassinado e configurá-lo nos sites. Podemos gerar um certificado com: openssl req -new -x509 -days 300 \ -keyout server.key -out server.crt
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
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 SSLCertificateKeyFile /path/to/server.key
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.com error_log CustomLog /var/log/apache2/example2.com access_log common SSLEngine on SSLCertificateFile /etc/ssl/certs/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key </VirtualHost>
Adicionando suporte à SSL
Adicionando suporte à SSL
Bando de dados MySQL 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 Port Datadir
MySQL Bando de dados 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: mysql -u root -p Ao teclar Enter, lhe será pedida a senha do superusuário do banco de dados
MySQL Bando de dados MySQL Guia de bolso do MySQL para administradores de redes: show databases; use database; create database nome; show tables; describe tabela; select * from 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: aptitude install mysql-admin aptitude install phpmyadmin
Bando de dados MySQL Gerenciamento da base de dados
Bando de dados MySQL Gerenciamento da base de dados
Dúvidas?
Referências http://app.dcc.ufba.br/~galiza/aulas-cefet2009/aula05.ppt http://pt.wikipedia.org/wiki/http [1] - http://news.netcraft.com/archives/web_server_survey.html http://httpd.apache.org/docs/2.0/howto/cgi.html http://www.securityfocus.com/infocus/1818