Blog

a great conversation starts with a great topic

This is a public Blog  publicRSS

Entry

    • Simular o ambiente de produção usando Virtual...
      Entry posted 12/13/08 by João Saleiro
      995 Views, 0 Comments
      Title:
      Simular o ambiente de produção usando Virtual Hosts no Apache
      Entry:

      Quando se constroem aplicações web, é normalmente uma boa prática configurar-se o ambiente de desenvolvimento de forma a que seja o mais semelhante possível ao ambiente de produção.
      Uma das configurações que se faz antes de se iniciar o desenvolvimento do projecto, é a criação de um virtual host cuja configuração seja o mais idêntica possível à configuração do servidor onde o projecto estiver alojado.

      Entre outras configurações, a mais importante é a estrutura de directorias, que em desenvolvimento é diferente da estrutura em produção.

      Regra geral, quando se trata de uma aplicação com backend e um backoffice nós costumamos organizar o nosso ambiente de desenvolvimento desta forma:

      \webfuel\projecto

      \webfuel\projecto\frontend
      \webfuel\projecto\frontend\bin-debug (binários da aplicação)
      \webfuel\projecto\frontend\src
      \webfuel\projecto\frontend\[...]

      \webfuel\projecto\backoffice
      \webfuel\projecto\backoffice\bin-debug (binários do backoffice)
      \webfuel\projecto\backoffice\src

      \webfuel\projecto\backend (backend, por exemplo em php)
      \webfuel\projecto\mm (imagens, e outros recursos multimédia)

      Quando corremos a aplicação localmente, sem os virtual hosts, vamos obter algo como http://localhost/projecto/bin-debug/index.swf .

      Para que a aplicação possa comunicar com o backend, o path para o gateway será por exemplo algo como ../../backend/gateway.php .

      Para que a aplicação possa aceder aos recursos multimédia (imagens, etc) o caminho será algo como ../../mm/imagem1.jpg .

      Estes caminhos não batem certo com os caminhos na versão de produção:

      www.projecto.pt (binários da aplicação)
      www.projecto.pt/backoffice (binários do backoffice)
      www.projecto.pt/backend (backend, por exemplo em php)
      www.projecto.pt/mm (imagens e recursos multimédia)

      Vemos que na versão de produção a aplicação para aceder ao backend vai fazer o caminho backend/gateway.php - enquanto que na versão de desenvolvimento, fazia o caminho ../../backend/gateway.php . O mesmo se aplica para as restantes directorias.

      Há muita gente que trabalha com a estrutura de directorias e caminhos do ambiente de desenvolvimento, e quando chega a altura de alojar o projecto, mudam os caminhos no source code (ou num ficheiro de configuração) e recompilam - má prática.

      Solução: criar um virtual host

      O Apache permite que se associe um ambiente com configurações específicas a um determinado domínio. Ou seja, se o Apache receber um pedido de acesso ao dominio www.projecto.dev , e houver um virtual host para esse dominio, podemos configurá-lo para devolver a nossa própria estrutura de directorias (e não só).

      O que gostariamos era de escrever no browser www.projecto.dev , e ser-nos exposto o nosso projecto com a estrutura de directorias igual à estrutura que vamos obter no servidor.

      Vamos começar por configurar o apache editando o ficheiro httpd.conf na directoria conf do apache. No final do ficheiro, basta adicionar as seguintes linhas:

      NameVirtualHost 127.0.0.1
      Include conf/vhosts/*.conf

      A primeira linha permite que o apache possa associar os nomes dos domínios pedidos aos virtual hosts que vamos configurar (mais info aqui).

      A segunda linha indica ao Apache para carregar e executar todos os ficheiros de configuração com a extensão .conf na directoria vhosts. Isto fará com que criar um novo virtual host seja algo como criar um novo ficheiro .conf na directoria vhosts.

      Vamos agora à directoria vhosts, e vamos criar um ficheiro chamado projecto.conf .

      Nesse ficheiro, vamos colocar o seguinte:

      <VirtualHost 127.0.0.1:80>
      DocumentRoot "D:\OsMeusProjectos\projecto\frontend\bin-debug"
      ServerName www.projecto.dev
      <Directory "D:\OsMeusProjectos\projecto\frontend\bin-debug">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      </Directory>

      Alias /backend "D:\OsMeusProjectos\projecto\backend"
      Alias /backoffice "D:\OsMeusProjectos\projecto\backoffice\bin-debug"
      Alias /mm "D:\OsMeusProjectos\projecto\mm"
      </VirtualHost>

      Isto vai indicar ao Apache que os pedidos recebidos na porta 80, máquina 127.0.0.1 relativos ao domínio www.projecto.dev irão ter a directoria bin-debug do frontend como a directoria de raíz do projecto. Os Aliases permitem que o Apache exponha o backend, backoffice e mm em directorias específicas, resultando assim num ambiente igual ao de produção.
      Depois de feita a alteração acima, é preciso reiniciar o Apache.

      Falta conseguirmos fazer com que pedidos para www.projecto.dev vão parar ao Apache. Para isso, vamos mexer no ficheiro "hosts" do Windows para forçarmos o redireccionamento de pedidos para www.projecto.dev para a nossa máquina local.
      Basta para isso editar o ficheiro hosts (mais info no wikipedia), na directoria c:\windows\system32\drivers\etc . Recordo que no Windows Vista, será preciso abrir um editor de texto com permissões de administrador, e depois fazer o File > Open e procurar o ficheiro no disco - caso contrário não será possível editá-lo.

      Neste ficheiro, bastará colocar o seguinte:

      127.0.0.1 www.projecto.dev

      A linha acima vai indicar o sistema operativo que todos os pedidos feitos para o domínio www.projecto.dev vão ser reencaminhados para 127.0.0.1 - a nossa máquina local. Como estamos a fazer os pedidos dentro de um web-browser, a porta por defeito será a 80. O resto é fácil de adivinhar: pedidos para a nossa máquina local na porta 80 vão ser entregues a quem? Ao nosso amigo Apache! Que ao receber um pedido destinado ao domínio www.projecto.dev, vai procurar o Virtual Host respectivo e expô-lo com a estrutura que definimos.

      Obviamente, isto abre-nos as portas para fazer configurações mais radicais (i.e. configurar o Apache para que o Virtual Host seja igualzinho ao do servidor final).