Como configurar um servidor para hospedar suas aplicações em Ruby
Serviços como Heroku, AppFog, EngineYard e afins são uma mão na roda, mas muito caros para profissionais desfavorecidos, estudantes e pessoas sovinas. Uma alternativa viável é a locação de uma máquina virtual (VPS) e sua configuração “na raça”, mas isso não é lá muito fácil para marinheiros de primeira viagem… Neste artigo ensinarei a configurar um VPS (ou servidor dedicado) para hospedar aplicações em Ruby baseadas em Rack.
Antes de mais nada, você precisa contratar um serviço de hospedagem. Há muitas opções de provedores no mercado, e eu pessoalmente recomendo o DigitalOcean (referral, yay!). Eles possuem planos a partir de US$5 e ótimas configurações com SSD, o que dá um gás no desempenho. Para este artigo, utilizei a configuração mais básica, com 1 CPU, 512Mb de RAM, 20Gb de SSD e 1Tb de transferência de dados.
Carreguei na máquina a imagem do Ubuntu Server 13.04 32bits, pois, além de ser estável, têm repositórios atualizados e completos. Mas por que você não utilizou a distro <sua distro favorita aqui>? Ubuntu é muito <reclamação aleatória>. Bom, escolhi o Ubuntu porque ele é fácil de utilizar, e eu não sou sysadmin. Se você gosta de usar o Slackware com um kernel customizado, problema seu.
Bom, vamos começar. Conecte-se ao seu servidor como root e faça login.
1. Mude a senha de root
O primeiro passo é mudar a senha do usuário root. Escolha uma senha forte, com muita entropia e guarde-a em um lugar seguro. Uma hash MD5 dá para o gasto se você tiver preguiça de pensar numa senha boa. Você terá de digitar a senha e a confirmar.
2. Crie um novo usuário
Você não quer ficar logando em seu servidor como root, e muito menos permitir que alguém possa fazê-lo via SSH. Para isto, precisaremos criar um novo usuário. Para criar um novo usuário, use o comando adduser e digite os dados requisitados (senha, nome, etc).
Em seguida, adicione o usuário criado ao arquivo sudoers, assim você poderá executar comandos com permissões especiais.
Adicione a seguinte linha ao arquivo, substituindo <username> pelo nome do usuário criado.
3. Limite o acesso via SSH
O próximo passo é limitar o acesso via SSH apenas para usuários autorizados, e bloquear para root.
Abra o arquivo de configuração de SSH:
Busque pelas seguintes linhas e mude seus respectivos valores para ficarem como abaixo, lembrando de substituir <username> pelo nome do usuário criado.
Reinicie o daemon de SSH. Sua conexão não será perdida.
4. Atualize os pacotes e resolva as dependências
Para manter o servidor seguro, deve-se atualizar todos os pacotes instalados.
Em seguida, precisamos instalar as dependências necessárias para que o servidor possa ser configurado. Isto inclui instalar SQLite3, vim, ferramentas para compilação (vamos compilar o Ruby e o nginx), OpenSSL e Git.
Por último, vamos instalar uma ferramenta para instalar automaticamente as atualizações de segurança.
Mas Gustavo, e se uma dessas atualizações quebrar o servidor?
Não é impossível, mas é melhor que o servidor quebre, fique fora do ar e seja reparado do que seja invadido e sofra danos irreparáveis.
A ferramenta unattended-upgrades pode ser instalada a partir dos repositórios padrão:
Após a instalação, devemos configurar a ferramenta:
Adicione as seguintes linhas ao arquivo e o salve.
Ainda precisamos assegurar que sejam instaladas somente as atualizações de segurança.
Modifique o bloco Unattended-Upgrade::Allowed-Origins para que ele fique como abaixo, somente com as origens de segurança não comentadas:
5. Instale o RVM e o Ruby
Vamos utilizar o RVM para compilar e instalar o Ruby e gerenciar nossas gems. Daí você pergunta, mas porque RVM e não rbenv? Porque eu quero, e porque não é preciso configurar o RVM.
Digite os comandos como root e aguarde a compilação e instalação da última versão do Ruby (2.0 em 19/06/2013).
6. Instale o nginx e o Passenger
Chegou a vez de instalar o nginx, nosso servidor web (tá, proxy HTTP e reverso) e o Phusion Passenger, um servidor de aplicações baseadas em Rack (Sinatra, Rails, o universo e tudo mais ;). Há várias outras configurações disponíveis como Apache + Passenger, nginx + Puma e Unicorn + nginx. Vai de sua preferência e necessidades, mas a priori o Passenger é o mais fácil de instalar e configurar, e bom o suficiente para a maioria das aplicações.
O Passenger vem empacotado em uma gem, então é bem fácil o instalar. Quando a instalação começar, escolha a opção 1, pois ela baixará, compilará e instalará o nginx. Escolha o diretório padrão como /opt/nginx.
Em seguida precisamos criar um script de inicialização para o nginx, pois infelizmente a instalação pelo Passenger traz o brinquedo sem pilhas.
Cole o seguinte script no buffer - ele não faz nada mais do que criar atalhos para gerenciar o nginx.
Mude as permissões do arquivo e configure-o como um script de inicialização:
Por último, mude o usuário do processo do nginx para o usuário que criamos:
Busque pela linha user (se estiver comentada remova os comentários) e a modifique para:
7. Instale e configure o Fail2ban
O Fail2ban é um serviço que analisa logs e bane os IPs que parecem executar atividades maliciosas (busca por brechas, ataques de força bruta, etc). O serviço é bem flexível e é possível criar regras customizadas para vários serviços e/ou aplicações. Você pode encontrar mais detalhes sobre o que faremos neste link.
Para instalar o Fail2ban, execute o comando:
Em seguida configure o Fail2ban para ler e atuar sobre os logs do nginx. O primeiro passo é criar um arquivo para guardar as suas configurações:
Adicione as seguintes linhas no final do arquivo. Elas são nada mais do que regras que iremos definir no próximo passo.
Em seguida, crie os seguintes arquivos na pasta /etc/fail2ban/filter.d/ para definir as novas regras de filtragem:
nginx-proxy.conf
nginx-noscript.conf
nginx-auth.conf
nginx-login.conf
8. Configurando o firewall
O iptables é a escolha mais comum quando tratamos de firewall no Linux, e é por isso que utilizaremos o ufw. Mas como assim usar o ufw, se o iptables é a melhor escolha? Duh! O ufw (UncomplicatedFirewall) não é nada mais do que um frontend para o iptables, e é muito mais fácil de configurar.
Precisamos bloquear todas as portas exceto a 80 (HTTP), 443 (HTTPS) e 22 (SSH). Para isto digite os seguintes comandos, e voilà!
9. Monitoramento de logs
O Logwatch é um sistema de análise de logs que monitora certos eventos e cria um relatório nas áreas que você especificar. Em nosso caso, este relatório será enviado ao nosso email diariamente, relatando acessos ao sistema, pacotes modificados e mudanças no sistema de arquivos.
Primeiro, instale o Logwatch:
Em seguida, crie um arquivo para agendar a tarefa:
Por fim, cole no arquivo o seguinte conteúdo, trocando <[email protected]> pelo seu endereço de email.
10. Instalando a aplicação
Como não vamos utilizar o Capistrano nem outra ferramenta para fazer o deploy, o faremos diretamente pelo Git. Para isto, faça login no servidor como o usuário que você criou no início do tutorial, e clone o repositório da aplicação em sua pasta raiz (~).
Instale as dependências de seu projeto (se não tiver uma Gemfile crie uma):
Também será necessário criar um arquivo config.ru para informar ao Passenger como rodar a aplicação. Se você não tiver o arquivo, busque por um na documentação do framework utilizado.
O próximo passo será alterar as configurações do nginx para rodar a aplicação. Para tal, edite o arquivo de configurações do nginx:
Adicione as seguintes linhas ao bloco http { … }, substituindo <username> pelo nome de seu usuário, <appdir> pelo diretório de sua aplicação e <domain> pelo nome de seu domínio.
Reinicie o nginx.
Se tudo estiver certo você poderá visualizar sua aplicação na URL utilizada. Caso exista um erro na configuração o nginx e/ou o Passenger irão reclamar.
11. Configurando SSL
Se você for utilizar um certificado SSL em sua aplicação (o que é muito interessante), deverá tomar mais alguns passos para o instalar e configurar.
Primeiro, crie uma nova pasta em seu diretório raiz para abrigar os certificados. Pessoalmente, gosto de usar ~/ssl. Há abordagens melhores, mas esta é a mais prática.
Em seguida, é preciso gerar uma requisição de assinatura de certificado e uma chave. Substitua <domain> pelo nome de seu domínio. Ao ser indagado sobre seu Common name (CN), digite o nome do domínio que receberá o certificado, sem o www.
Envie o arquivo CSR para sua entidade certificadora e aguarde o envio do certificado. Este processo varia de entidade para entidade.
Após receber o certificado (arquivo com extensão .crt), envie-o via SCP ou cole-o num novo arquivo na pasta ~/ssl:
Por fim, vamos configurar o nginx para utilizar nossos certificados.
Logo abaixo do bloco que você inseriu no passo anterior, insira o seguinte bloco, substituindo <domain> pelo seu domínio, <username> pelo nome do usuário criado e <appdir> pelo nome do diretório da aplicação.
Reinicie o nginx:
Se tude estiver correto o nginx e o Passenger iniciarão, e você poderá acessar sua aplicação via HTTP e HTTPS. Se ocorrer algum erro, se vire e procure por ele no Google. ;)
Num futuro próximo, ensinarei a fazer o deploy de uma aplicação em Rails 4 com Capistrano. É esperar para ver.
I used to have Disqus enabled on my website, but I have disabled it because of privacy concerns.
If you feel like commenting or asking something, you can still contact me via other means.