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
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!
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.
Vai nas configurações e altera para sua placa de rede.
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.”
Normal, vc precisa alterar nas configurações para sua placa de rede.
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 ?
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.
WDS:
Resolvido via conversa no Telegram!
Sempre compartilhando conhecimento. Excelente artigo. Parabéns!