Resolvendo o problema de locale no EC2

Tenho algumas instâncias no EC2 da Amazon e todas utilizam Ubuntu Server. E todas tinham um problema com language, o que me impedia de abrir o terminal do MongoDB por exemplo, ou exibia os avisos abaixo em algumas instalações:

WARNING! Your environment specifies an invalid locale. This can affect your user experience significantly, including the ability to manage packages.

perl: warning: Setting locale failed.

perl: warning: Please check that your locale settings:

    LANGUAGE = (unset),

    LC_ALL = (unset),

    LC_CTYPE = "de_DE.UTF-8",

    LANG = "en_US.UTF-8"

    are supported and installed on your system.

perl: warning: Falling back to the standard locale ("C").

locale: Cannot set LC_CTYPE to default locale: No such file or directory

locale: Cannot set LC_ALL to default locale: No such file or directory

O problema é não ter um locale definido, eu já tentei várias coisas, a maioria dos tutorias mandava eu fazer o seguinte:

sudo locale-gen fi_FI.UTF-8
sudo dpkg-reconfigure locales

Isso, teoricamente, resolve o problema porém ele voltou acontecer em todas as instâncias, e ter que repetir o processo não é o que chamo de solução.

O que realmente resolveu meu problema foi editar o arquivo /etc/environment e adicionar a seguinte linha:

LC_ALL="en_US.UTF-8"

Agora, sempre que a instância iniciar ela terá o LC_ALL definido, resolvendo o probelma com o locale inválido.

Tutorial – deploy com git no Ubuntu Server (AWS EC2)

Semana passada configurei um servidor novo para um cliente (GS Solutions) e optamos por usar AWS para este projeto (leia meu comparativo entre Locaweb e Amazon) e fiquei encarregado de configurar o servidor.

O servidor será exclusivo para um projeto e optei por fazer todos os deploys com git para manter o controle do código que vai para o ar e automatizar o deploy. 

Já fiz isso para o And After e para o Eu Compraria e lembro que foi um pouco complicado permitir o git pull através do apache (usuário www-data no Ubuntu Server).

Mas uma vez feito, não tem erro. este é um tutorial de 4 passos simples para configurar seu servidor e permitir deploy utilizando o Git.

O tutorial foi testado em servidor Linux (Ubuntu Server) e pode precisar de ajustes simples para outros servidores.

1. Instale o git no servidor

Sem nenhum mistério:

sudo apt-get install git

2. Crie uma chave para o user www-data

Aqui está o segredo de permitir o deploy diretamente por comandos do Apache, que utiliza o usuário www-data.

No meu caso o deploy é feito através de um ambiente fechado do sistema, onde através do PHP o git pull é executado. O repositório em questão será onde está configurado o domínio do serviço, então quando o pull é executado na branch master acontece o deploy.

Para criar uma chave ssh para o user www-data você vai precisar executar o ssh-keygen com este usuário, para isso execute no servidor:

sudo -u www-data ssh-keygen

E gere uma chave para este usuário, com ou sem senha. Na home deste usuáriuo (no Ubuntu Server a home do usuário www-data normalmente é /var/www/) você terá uma pasta .ssh onde ficarão as chaves.

3. Libere as chaves no seu repositório

Agora é só cadastrar as chaves no seu repositório para que seu www-data do servidor tenha acesso ao repositório, no terminal do servidor digite:

vi ~/var/www/.ssh/id_rsa.pub

Cadastre a chave pública no seu repositório e pronto, você está pronto para acessar seu repositório diretamente do seu servidor.

4. Clone o repositório

Agora no seu servidor você pode executar os comandos do git com o usuário www-data, por exemplo:

sudo -u www-data git clone meurepositorio.git

Lembre-se que para automatizar o seu deploy o domínio configurado no Apache (sites available) deve ser o seu próprio repositório.

Para fazer o deploy você pode escolher a forma que achar melhor. Eu executo os comandos com a ajuda do PHP em um ambiente fechado: assim o php (www-data) executa o git pull no repositório do seridor.

Não sei se existe (e qual é) o risco do user www-data ter uma chave pública cadastrada no repositório, mas o ideal é que este usuário tenha acesso apenas de leitura no seu repositório.

Leia também mais algumas dicas e utilidades para seu servidor:

Montando um novo volume na Amazon EC2

Uso o serviço de cloud (EC2) da Amazon, mas ainda não utilizo do S3 para storage de arquivos então tive a necessidade de montar um volume maior na minha instância, para armazenamento de backups e outros arquivos do servidor.

Criando um volume no EC2

O primeiro passo é montar um volume no painel de controle do AWS – monte o volume sem resgatar nenhuma snapshot.

Feito isso, agora precisamos deixar este volume criado acessível pela sua instância, para isso será necessário “interligar” o volume criado a sua intância.

  1.  Clique com o botão direito no volume criado
  2. Clique em attach volume
  3. Selecione a sua instância

Agora o novo volume estará visível para a sua instância, precisamos montar o volume. Primeiro vamos ver o nome do volume montado, ainda no painel selecione o volume que você criou.

No meu caso o nome é sdg (veja o campo Attachment das informações do volume (este nome é escolhido quando você seleciona a qual instância este volume irá ser atrelado, no passo anterior deste tutorial).


Montando o volume no EC2 (Linux)

Primeiro crie um FS para o volume criado:

sudo mkfs.ext3 /dev/sdg

Agora é só montar no local que você achar melhor, para este exemplo vou montar em /meuvolume

Abra o arquivo /etc/fstab:

sudo vim /etc/fstab

E adicione a seguinte linha:

/dev/sdg /meuvolume ext3 noatime 0 0

Agora crie o diretório meuvolume e monte:

mkdir /meuvolume
mount /meuvolume

Pronto, agora você tem um novo volume montado e acessível na sua instância!

Aprendi fazendo depois de ler aqui.

Como encontrar o PHP.ini?

Já tive problemas para encontrar o PHP.ini no MacOS, eu alterava as configurações do meu arquivo php.ini, reiniciava o meu apache e as mudanças não eram aplicadas.

Já imaginava que era isso, então descobri que eu estava alterando um php.ini que não estava sendo carregado pelo PHP na minha máquina.

Como descobrir onde está o PHP.ini?

Você pode criar uma página que exiba toda a configuração do PHP e exiba em seu navegador, para isso crie um arquivo com o seguinte:

<?
phpinfo();
?>

Coloque o arquivo em uma pasta acessível pelo seu Apache e abra ela no navegador, esta página exibe todas as configurações do seu PHP.

Procure por “configuration file” e lá estará o caminho (path) do arquivo de configuração carregado pelo PHP.

Descobrindo o php.ini no terminal

Se você tem acesso a um terminal pode exibir todas as informações do php.ini direto no terminal, para isso digite:

php -i

E para facilitar a identificação do caminho completo do seu arquivo de configuração do PHP (php.ini) execute o seguinte comando no terminal:

php -i | grep 'Configuration File'<br>

Espero ter te ajudado a encontrar o caminho do php.ini.


Graças ao google os artigos mais acessados do O Desenvolvedor são os que responsem dúvidas simples com respostas rápidas, quer saber mais sobre PHP? Leia também:

PHP short_open_tag

Uma vez um colega me disse que os erros bobos são os mais difíceis de serem detectados, e é onde acabamos perdendo mais tempo – por isso eu acho pair programming uma ótima idéia.

Resolvi escrever este post para que os leitores, quando se depararem com situação parecida, economizem o precisoso tempo indo direto a solução e não fazendo os testes como eu fiz. O problema: meu apache parou de executar algumas tags do PHP, imprimindo o código PHP na tela.

 

No Mac OS configurei o Apache, PHP, NodeJS e o MongoDB. Tesstei e todos estavam funcionando, porém vários dos meus projetos, como o And After e o Eu Compraria deixaram de funcionar corretamente. As páginas abriam, algumas sem CSS, tudo estranho! Fui verificar o código e o PHP não estava interpretando nada dentro do e estava imprimindo o código no HTML.

Com alguns testes descobri que <?php funcionava e <? não, com mais um pouco de pesquisa descobri uma configuração que nunca dei importância no PHP, a short_open_tag.

 

PHP short_open_tag

short_open_tag é a configuração que permite o atalho de sintaxe <? ser interpretado da mesma forma que <?php.

Como habilitar ou desabilitar a short_open_tag?

Esta configuração está no php.ini, portanto abra ele no seu editor de texto e faça uma busca por "short_open_tag", encontre a linha e altere o valor da configuração.

 

Não sei o motivo, mas no Mac OS o padrão (pelo menos da minha instalação) foi a short_open_tag desabilitada. Quer saber mais sobre o assunto? Documentação do PHP.