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.
1 |
# 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.
1 |
# 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.
1 |
# vim /root/.bashrc |
Descomente
1 2 3 4 5 |
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:
1 |
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;36m\]\h\[\033[00m\]:\[\033[01;37m\]\w\[\033[01;32m\]\$\[\033[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
1 |
# apt install bind9 |
Altere o DNS do seus servidor para ele mesmo
1 |
# 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
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.
1 |
# 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.
1 2 3 |
# 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 |
1 |
# 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.
1 2 3 4 5 6 7 8 9 10 11 |
$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.
1 |
# vim /etc/rc.local |
Insira antes de exit 0
1 2 3 |
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
1 2 3 4 5 |
zone "fakes.zone" { type master; file "/etc/bind/db.fakes.zone"; allow-query {none;}; }; |
1 |
# vim /etc/bind/db.fakes.zone |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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 . |
1 |
# vim /etc/bind/named.conf.options |
Insira no arquivo antes de fechar a chave options.
1 2 3 |
response-policy { zone "fakes.zone" policy CNAME web.local; }; |
Ficando assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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)
1 |
# /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.
1 2 |
# 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
1 |
# vim /etc/apache2/sites-enabled/dominio1.com.br.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<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
1 |
# vim /etc/apache2/sites-enabled/dominio2.com.br.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<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.
1 2 |
# echo > /var/www/dom_fakes/dominio1.com.br/d1.html # echo > /var/www/dom_fakes/dominio2.com.br/d2.html |
Agora restart o apache.
1 |
# /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….
1 2 |
# 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…
1 |
# 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)
1 |
# passwd www-data |
Altere as permissões do diretório/subdir em /var/www para seu usuário www-data
1 |
# 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
1 |
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.
1 |
upload_max_filesize = 20M |
A cada alteração feita no php.ini deve ser restartado o apache.
1 |
# /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:
1 |
# 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)
1 |
Conforme modelos acima. |
2 – Insira no /etc/bind/db.fakes.zone seu dominofake.com
1 2 |
*.dominiofake.com IN CNAME . dominiofake.com IN CNAME . |
3 – Restart o apcache e o Bind
1 2 |
/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:
1 |
# mysql -u root -p |
Você pode usar o phpmyadmin também.
1 2 3 4 |
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.
1 |
vim /bin/adddominio |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/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 "\033[1;31m ${DOMINIO} \033[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 "\033[1;32m$DOMINIO \033[0m configurado com sucesso! \n" fi echo fi |
1 |
vim /bin/deldominio |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/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 "\033[1;31m ${DOMINIO} \033[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 "\033[1;32m$DOMINIO \033[0m removido com sucesso! \n" fi echo fi |
Altere as permissões.
1 2 |
# 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:
1 |
adddominio dominio3.com |
Removendo:
1 |
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.
1 2 3 4 5 6 7 8 9 |
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!