Criando uma maquina virtual com linux (Debian) para Desenvolvedores Web (LDAMPS)

LDAMPS (Linux / DNS / Apache / MySQL / PHP / SFTP)

A ideia deste tutorial é criar um cenário mais legal que um simples “xampp/easyphp”, e sim criar nosso próprio “servidor de hospedagem” onde vamos criar domínios virtuais quais poderemos acessá-los para fazer simulações em cima de ambientes mais reais.

Para crianção da maquina virtual no VirtualBox e a Instalação do Debian siga os tutoriais abaixo.

Criando uma máquina virtual no Virtual Box

Na instalação, na parte da configuração não é necessário fixar um IP, pode recebe-lo automaticamente via DHCP, assim se você sair da sua rede pode levar a experiência para outras redes, porém será necessário alterar o endereço IP nas configurações do bind cada vez que seu servidor receber um novo IP, falarei disso nas configurações do BIND (é apenas um arquivo nada d+).

Instalação do Debian 8 Jessie Limpa passo-a-passo

Após instalação do Debina, instalaremos o SSH para acessamos remotamente via Terminal ou com Putty (Windows). Vou ainda instalar o editor vim, que é meu preferido, mas você pode usar nano, pico entre outros.

# apt install ssh vim


Lembre-se que no processo da criação da maquina virtual nossa placa de rede ficou em modo bridge, ou seja isso faz com que a comunicação existente em sua rede seja de ponto-a-ponto entre todos que nela estão conectados.

Sempre que iniciar sua máquina virtual será necessário verificar qual IP recebeu.

# ifconfig 


No meu caso minha maquina está com o IP 10.0.0.109. Agora vamos acessar nosso servidor por SSH, se você já utiliza linux abra em seu terminal e digite $ ssh seuusuario@ip-do-seu-servidor ou abra o Putty e informe o IP do seu servidor.
Entre com sua senha, e após vire administrador (root) com o comando #su

Tem duas coisar que sempre faço após instalar um debian, faça se desejar.
A primeira é colorir o bash.

# vim /root/.bashrc

Descomente

export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lha'

Insira ao final:

PS1='${debian_chroot:+($debian_chroot)}\[3[01;31m\]\u\[3[00m\]@\[3[01;36m\]\h\[3[00m\]:\[3[01;37m\]\w\[3[01;32m\]$\[3[00m\] '

Deslogue do root (# exit), e logue novamente (# su)
Pronto nosso bash está com “mais vida” 🙂

Você encontra mais detalhes em: Colorindo seu Bash

A segunda é melhorar o autocomplete:
Bash com autocomplete “turbinado” no Debian

Precisamos instalar nosso servidor web, para isso siga o tutorial abaixo.

Passo-a-passo como criar um servidor web Apache2, PHP5, MySQL, PHPMyAdmin “LAMP” no Debian 8

Agora vem a parte legal!! Configurar nosso servidor para resolver nomes (Sevidor DNS) e nele configurar alguns domínios “fake” quais poderemos acessar.

Vale lembrar que você não deve fazer isso em uma máquina com IP válido, caso fizer isso vai estar deixando consultas recursivas aberta para o mundo “escravizar-lo”, não vou entrar em detalhes das configurações avançadas do bind, o intuito aqui é ensinar pessoas a ter um cenário para programação web, em um ambiente local. Se deseja saber como configurar um servidor DNS acesse:
Servidor DNS Recursivo, Autoritativo e Reverso com Bind9 (IPv4+IPv6).

No exemplo vou inventar dois domínios fake:
dominio1.com.br
dominio2.com.br

Instalaremos o BIND

# apt install bind9

Altere o DNS do seus servidor para ele mesmo

# echo 'nameserver 127.0.0.1' > /etc/resolv.conf

Para prevenir que o DHCP não mude novamente seu DNS vamos alterar um configuração no arquivo de configuração do DHCP Cliente. Assim sempre vamos receber o 127.0.0.1

# sed -i "s/#prepend domain-name-servers/prepend domain-name-servers/g" /etc/dhcp/dhclient.conf

Se quiser garantia que irá receber o 127.0.0.1 de um reboot em sua VM, e após reiniciar de um cat /etc/resolv.conf e veja se nameserver 127.0.0.1 se encontra no arquivo.

# reboot

Vamos criar nossa zona fake, que fará com que todos os domínios que adicionaremos nela o servidor faça responder que o domínios é o seu próprio servidor.

# echo 'include "/etc/bind/fakes.zone";' >> /etc/bind/named.conf.local

# echo 'zone "web.local" IN { type master; file "/etc/bind/db.web.local"; };' >> /etc/bind/named.conf.local
# vim /etc/bind/db.web.local 

Lembrando que 10.0.0.109 é o IP que estou recebendo via DHCP, SEMPRE que sua interface receber um novo IP será necessário altera-lo, e restartar o serviço bind9.

$ORIGIN .
$TTL 86400
web.local         IN SOA  ns1.web.local. ns2.web.local. (
                        2017021901 ; serial
                        28800      ; refresh (8 hours)
                        1800       ; retry (30 minutes)
                        2419200    ; expire (4 weeks)
                        10800      ; minimum (3 hours)
                        )
                        NS web.local
                        A 10.0.0.109

Vou ensinar como fazer script (shell script) que fará com que sempre fique o IP recebido via DHCP.
Insira no final do arquivo /etc/rc.local as linhas abaixo, o rc.local é carregado na inicialização.

# vim /etc/rc.local

Insira antes de exit 0

pegaip=$(ifconfig eth0 | grep "inet end" | awk '{print $3}')
sed -i "s/ A .*/ A $pegaip/g" /etc/bind/db.web.local
/etc/init.d/bind9  restart

Criaremos nosso arquivo fakes.zone quais adicionaremos os domínios fake.

# vim /etc/bind/fakes.zone

zone "fakes.zone" {
        type master;
        file "/etc/bind/db.fakes.zone";
        allow-query {none;};
};
# vim /etc/bind/db.fakes.zone
$TTL 1H
@       IN      SOA LOCALHOST. NS.LOCALHOST (
                        2017021900      ; Serial  
                        1h              ; Refresh
                        15m             ; Retry
                        30d             ; Expire 
                        2h              ; Negative Cache TTL
                )
                NS  LOCALHOST.

*.dominio1.com.br       IN CNAME .
dominio1.com.br         IN CNAME .

*.dominio2.com.br       IN CNAME .
dominio2.com.br         IN CNAME .

# vim /etc/bind/named.conf.options

Insira no arquivo antes de fechar a chave options.

response-policy {
	zone "fakes.zone" policy CNAME web.local;
};

Ficando assim:

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0 s placeholder.

        // forwarders {
        //      0.0.0.0;
        // };


        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };

        response-policy {
                zone "fakes.zone" policy CNAME web.local;
        };
};

Restarte o bind toda vez que fizer alguma alteração (ex adicionar um novo domínio)

# /etc/init.d/bind9  restart

Ping para seus domínios e veja se responde o IP do seu servidor.

Altere os DNS de seu computador para o IP do seu servidor “no meu caso 10.0.0.109”. Seu computador vai fazer as consultas DNS em seu servidor, qual responde como autoritativo pelos domínios fakes. Agora Acesse seus domínios em seu navegador.

Recebemos a tela padrão, que esta é o arquivo que está em /var/www/html/index.html
Como padrão então já sabemos que o diretório padrão do apaches (www-data) é /var/www/html/. Bom precisamos fazer nosso apache interpretar que cada site fique em um diretório diferente. Então vamos criar esses diretórios.

# mkdir -p /var/www/dom_fakes/dominio1.com.br
# mkdir /var/www/dom_fakes/dominio2.com.br

Agora criamos nossos 2 arquivos de configurações em /etc/apache2/sites-enabled/ para cada domínio.

dominio1.com.br

# vim /etc/apache2/sites-enabled/dominio1.com.br.conf
<VirtualHost *:80>
	ServerName dominio1.com.br
	ServerAlias www.dominio1.com.br

        ServerAdmin seu@email.com.br
        DocumentRoot /var/www/dom_fakes/dominio1.com.br
	<Directory /var/www/dom_fakes/dominio1.com.br/>
    		Options Indexes FollowSymLinks
    		AllowOverride All
	</Directory>

	LogLevel warn

        ErrorLog ${APACHE_LOG_DIR}/dominio1.com.br_error.log
        CustomLog ${APACHE_LOG_DIR}/dominio1.com.br_access.log combined

</VirtualHost>

dominio2.com.br

# vim /etc/apache2/sites-enabled/dominio2.com.br.conf
<VirtualHost *:80>
	ServerName dominio2.com.br
	ServerAlias www.dominio2.com.br
        ServerAdmin seu@email.com.br
        DocumentRoot /var/www/dom_fakes/dominio2.com.br

	<Directory /var/www/dom_fakes/dominio2.com.br/>
    		Options Indexes FollowSymLinks
    		AllowOverride All
	</Directory>

	LogLevel warn

        ErrorLog ${APACHE_LOG_DIR}/dominio2.com.br_error.log
        CustomLog ${APACHE_LOG_DIR}/dominio2.com.br_access.log combined

</VirtualHost>

Criamos um arquivo em cada diretório para que possamos visualizar que estamos acessando o domínio corretamente.

# echo > /var/www/dom_fakes/dominio1.com.br/d1.html
# echo > /var/www/dom_fakes/dominio2.com.br/d2.html

Agora restart o apache.

# /etc/init.d/apache2 restart

Bingo!

Vamos remover o /var/www/html/index.html e criar um link dos domínios fakes em /var/www/html/ assim quando você não quiser trocar o IP para resolver nomes, você pode acessar o http://IP/dominiofake….

# rm /var/www/html/index.html 
# ln -s /var/www/dom_fakes/ /var/www/html/

Para enviarmos os arquivos podemos usar um cliente SFTP como o FileZilla, Winscp entre outros. Mas para logar no nosso cliente SFTP vamos ter que fazer alguns ajustes no usuário www-data (usuário do apache), primeiramente ele não vem com permissão para logar, vale lembrar que eu não recomendo faze isso em servidores convencionais, este é um ambiente de “local” para estudos…

# usermod -s /bin/bash www-data

Sete uma senha para o usuário www-data com o comando. (Vamos usar ela para logar posteriormente no FileZilla)

# passwd www-data

Altere as permissões do diretório/subdir em /var/www para seu usuário www-data

# chown  www-data. /var/www/ -R

Agora basta você conectar-se para enviar os arquivos: (ex. FileZilla)

Se você deseja arriscar e elevar o nível e criar um servidor FTP você pode seguir o tutorial: Servidor FTP com usuários no banco de dados MySQL

Como está criando um ambiente para programar é interessante receber os erros do PHP, então edite as configurações do php.ini ele fica em /etc/php5/apache2/php.ini
Procure por display_errors e altere para On

display_errors = On

O padrão para upload de arquivos no PHP é de 2M. Você este valor procurando por upload_max_filesize e colocando o valor que achar melhor.

upload_max_filesize = 20M

A cada alteração feita no php.ini deve ser restartado o apache.

# /etc/init.d/apache2 restart

Se precisar ver os logs você encontra em /var/log/apache2/. Se você reparar vai ver que la na configuração do domínio no apache temos o valor [ErrorLog ${APACHE_LOG_DIR}/dominio2.com.br_error.log].
Ex de comando para visualizar:

# tail -f /var/log/apache2/dominio1.com.br_error.log 

Agora cada vez que deseja criar um domínio fake:
1 – Crie um arquivo/etc/apache2/sites-enabled/dominiofake.com.conf (sempre terminando em .conf)

Conforme modelos acima.

2 – Insira no /etc/bind/db.fakes.zone seu dominofake.com

*.dominiofake.com       IN CNAME .
dominiofake.com         IN CNAME .

3 – Restart o apcache e o Bind

/etc/init.d/bind9  restart
/etc/init.d/apache2 restart

Você pode criar também um usuário MySQL para cada aplicação sua, para separar as bases de dados, segue um ex. onde criamos a base de dados dominio1 com o usuario dominio1 e SENHA:

# mysql -u root -p

Você pode usar o phpmyadmin também.

CREATE DATABASE dominio1;
GRANT ALL PRIVILEGES ON dominio1.* TO 'dominio1'@'localhost' IDENTIFIED BY 'SUA-SENHA-DOM1';
FLUSH PRIVILEGES;
quit;

Pensando em facilitar sua vida, vou criar dois shell script. Uma para adicionar um domínio com apenas um comando, e outro para remover.

vim /bin/adddominio
#!/bin/bash

DOMINIO=$1

if [ -z $DOMINIO ];then
        echo
        echo "Comando imcompleto!"
        echo " Use ex.: adddominio dominio.tld"
        echo
else
        EXITE=`ls -lh /etc/apache2/sites-enabled/ |grep ${DOMINIO} |wc -l`
        echo
        if [ $EXITE = 1 ]; then
                        printf "3[1;31m ${DOMINIO} 3[0m já cadastrado! \n"
        else

                mkdir /var/www/dom_fakes/${DOMINIO}

                cat <<< "
                <VirtualHost *:80>
                        ServerName ${DOMINIO}
                        ServerAlias www.${DOMINIO}

                        ServerAdmin seu@email.com.br
                        DocumentRoot /var/www/dom_fakes/${DOMINIO}
                        <Directory /var/www/dom_fakes/${DOMINIO}/>
                                Options Indexes FollowSymLinks
                                AllowOverride All
                        </Directory>

                        LogLevel warn

                        ErrorLog ${APACHE_LOG_DIR}/${DOMINIO}_error.log
                        CustomLog ${APACHE_LOG_DIR}/${DOMINIO}_access.log combined
                </VirtualHost>
                " > /etc/apache2/sites-enabled/${DOMINIO}.conf

                echo "*.${DOMINIO}       IN CNAME ." >> /etc/bind/db.fakes.zone
                echo "${DOMINIO}         IN CNAME ." >> /etc/bind/db.fakes.zone

                chown  www-data. /var/www/dom_fakes/${DOMINIO}

                /etc/init.d/bind9 restart
                /etc/init.d/apache2 restart

                echo

                printf "3[1;32m$DOMINIO 3[0m configurado com sucesso! \n"
        fi
        echo
fi
vim /bin/deldominio
#!/bin/bash

DOMINIO=$1

if [ -z $DOMINIO ];then
        echo
        echo "Comando imcompleto!"
        echo " Use ex.: deldominio dominio.tld"
        echo
else
        EXITE=`ls -lh /etc/apache2/sites-enabled/ |grep ${DOMINIO} |wc -l`
        echo
        if [ $EXITE = 0 ]; then
                        printf "3[1;31m ${DOMINIO} 3[0m não encontrado! \n"
        else
                rm -rf /var/www/dom_fakes/${DOMINIO}

                rm -f /etc/apache2/sites-enabled/${DOMINIO}.conf

                sed -i "/${DOMINIO}/d" /etc/bind/db.fakes.zone

                /etc/init.d/bind9 restart
                /etc/init.d/apache2 restart
                echo
                printf "3[1;32m$DOMINIO 3[0m removido com sucesso! \n"
        fi
        echo
fi

Altere as permissões.

# chmod +x /bin/adddominio
# chmod +x /bin/deldominio

Pronto agora bastar você usar o comando adddominio para adicionar todas as configurações automaticamente e deldominio para remove-las.
Adicionando:

adddominio dominio3.com

Removendo:

deldominio dominio3.com

Parabéns! Você montou um servidor próprio!

Agora se você quer dar uma de preguiçoso vou deixar aqui o link para você importar a VM em seu virtual box.
Dev Web Server.ova 765MB (64bits)
Abra seu Virtual Box vá em: Arquivo –> Importar Amppliance e selecione o arquivo.

Usuários / Senhas
SSH:
webdev / remontti
root / remontti
www-data / remontti (SFTP)

MySQL
root / remontti
phpmyadmin / remontti

Se gostou, ficou com dúvida deixe seu comentário.

Abraço!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

8 Resultados

  1. Tony de Maceió disse:

    Não foi possível iniciar a máquina Dev Web Server pois as seguintes interfaces físicas de rede não foram encontradas:

    enp0s25 (adapter 1)

    Altere as configurações de rede desta máquina, ou desligue-a.

  2. Tony de Maceió disse:

    Remontti, está ocorrendo esse erro quando tentamos executar a máquina pelo Virtualbox:

    “Não foi possível iniciar a máquina Dev Web Server pois as seguintes interfaces físicas de rede não foram encontradas:

    enp0s25 (adapter 1)

    Altere as configurações de rede desta máquina, ou desligue-a.”

  3. Boa Tarde! Neste caso pra mim publicar este servidor web junto com meu proprio dns para resolver meus próprios dominios basta ter um ip publico para configurar no server ?

  4. WDS disse:

    Ola Remontti, esotu com o seguinte erro ao tentar acessar o servidor via ssh aparece a seguinte mensagem ‘PERMISSON DENIED, PLEASE TRY AGAIN”. ajuda-me. por favor.

  5. Alexandre disse:

    Sempre compartilhando conhecimento. Excelente artigo. Parabéns!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *