nginx: desenvolvimento de módulos

Uma referência incontornável na introdução ao desenvolvimento de módulos nginx é sem dúvida o artigo Emiller’s Guide To Nginx Module Development.
Não menos valiosa é ainda a contribuição do Antoine Bonavita: Development of modules for nginx (tradução para Inglês do artigo original em Russo).

Para um servidor http com o potencial do nginx esta é, até agora, a melhor literatura que encontrei especificamente sobre o desenvolvimento de módulos.
O projeto em si padece de falta de documentação técnica e a bibliografia em geral não cobre detalhadamente esta componente.

Como quando se começa com uma nova linguagem de programação, a tentação é procurar um exemplo “hello world” que também o há para o nginx, no entanto, dada a facilidade de borrar a pintura entre apontadores e referências, parece-me mais prudente iniciar a experiência com um módulo cuja principal funcionalidade é não fazer nada. Neste contexto, “não fazer nada” significa que vamos conseguir compilar o nosso módulo junto com o restante código fonte do nginx (ao contrário dos módulos de Apache que são dinamicamente linkados, os módulos nginx são compilados com o core) , não quebrando o seu funcionamento.

Continue reading

nginx + php-fpm: File not found.

Uma pesquisa pelos termos “nginx + php-fp File not found.” oferece um vasto leque de literatura e receitas para, expectavelmente, resolver o problema.
Se por acaso “aterrou” nesta página já em último reduto, talvez a origem do problema não esteja no ficheiro de configuração do nginx.

No error_log pode ler-se ainda: FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, reforçando a possibilidade de tratar-se dum problema de permissões.

Se já confirmou que o utilizador/grupo nginx (ou outro com o qual o nginx esteja a ser executado) tem permissões para executar os scripts, então confirme que o php-fpm está a correr com esse utilizador.

  1. Abrir o ficheiro ficheiro de configuração da pool (/etc/php-fpm.d/www.conf)
  2. Procurar por “user”
  3. Modificar, se necessário, os valores de “user” e “group”
  4. Reiniciar o php-fpm (/etc/init.d/php-fpm restart)

No meu caso a pool por omissão estava configurada para o utilizador e grupo “apache”.

Reiniciar MAC Address

O VirtualBox permite reiniciar o MAC Address de qualquer adaptador de rede, mas nem sempre isto é tão pacífico como desejável.

Quando produzimos uma appliance para fornecer a terceiros estes têm a oportunidade de reiniciar o seu MAC Address, mas aquando do boot provavelmente vão estar bloqueados alguns minutos enquanto o network manager “percebe” que os adaptadores de rede não correspondem (MAC Addresses diferentes para a mesma interface) e inicializa uma nova interface de rede (provavelmente um eth1).

Para contornar este problema e antes de exportar a máquina virtual, podemos fazer as seguintes alterações no sistema operativo da máquina virtual (assumindo que é linux):

  1. Remover o ficheiro /etc/udev/rules.d/70-persistent-net.rules
    $ sudo rm /etc/udev/rules.d/70-persistent-net.rules
  2. Remover o ficheiro /lib/udev/rules.d/75-persistent-net-generator.rules
    $ sudo rm /lib/udev/rules.d/75-persistent-net-generator.rules
  3. Criar um link simbólico para /dev/null
    $ sudo ln -s /dev/null /lib/udev/rules.d/75-persistent-net-generator.rules

Reiniciando a máquina, é expectável que o boot não fique bloqueado a tentar “levantar” a(s) interface(s) de rede.

Este procedimento foi testado em Ubuntu 12.10

Intel XDK New

É recompensador quando a tecnologia cumpre a sua função e nos mostra resultados no tempo esperado.

“The Intel® XDK NEW development system is designed for developers who want to use their HTML5 expertise to build hybrid HTML5 apps for mobile devices (e.g., phones and tablets) and other platforms that host HTML5 web apps (such as a Google Chrome* extension or a mobile web site).”

No caso deste Intel XDK New demorou mais uns minutos: embora a interface de instalação (install_GUI.sh) diga que apenas o Ubuntu 12.04 é suportado, no arquivo vem um rpm.

O download pode ser feito no site oficial. Depois de descomprimir o arquivo, encontrarão o rpm no directório “rpm” (será qualquer coisa como intel-xdk-0154-2.0-0.x86_64.rpm, sendo que o nome do arquivo depende da versão)

A instalação decorrerá sem problemas: basta executar na linha de comandos

$ sudo yum install intel-xdk-0154-2.0-0.x86_64.rpm

Depois disto são precisos mais dois pequenos truques:

  1. corrigir permissões:
    $ sudo chmod 0755 /opt/intel/XDK/
  2. corrigir o symlink libudev.so.0: no meu caso a correcção passou por
    $ sudo unlink libudev.so.0; sudo ln -s /usr/lib64/libudev.so.1 /opt/intel/XDK/libudev.so.0

Depois disto, a oferta da Intel cumpriu.
Arrancou
interface principal do Intel(R) XDK Newe em poucos minutos deu frutos (Sapo A5)

Screenshot da aplicação a correr num Sapo A5

OpenVPN – Use this connection only for resources on its network

Isto é algo que me tem “tirado do sério”: há um bug no Network Manage (GUI) que não permite definir esta opção para as ligações VPN, o que faz com que sempre que se activa esta ligação, se perca a conectividade “para fora”.

Este assunto já foi reportado há muito e já foi alvo de correcção (por sinal bem simples porque parece que foi apenas uma linha que “desapareceu”).
A questão é que nem todas as distribuições permitem nos seus repositórios as últimas (“ultíssimas” versões) e no caso do meu Fedora 19, esta correcção ainda não está disponível. Felizmente quando é “open” há sempre alternativa Continue reading

Adeus Mint 12, bem-vindo Fedora 19

Para “celebrar” a chegada do Samsung SSD 840, actualizei finalmente o sistema: Fedora 19 com gnome3 em detrimento do Linux Mint 12 (excelente experiência).

Houve algumas leituras iniciais interessantes, relativamente ao particionamento dos SSD e optimização das escritas:

Disco cheio mas com espaço vazio

Quando algo não cabe numa caixa assumimos que ela está cheia e que essa é a única razão pela qual não podemos colocar mais nada lá dentro.

Esta era a analogia que fazia com os discos rígidos: num volume de 50GB cabem exactamente 5 ficheiros de 10 GB ou 10 ficheiros de 5 GB, … (ok tinha consciência que as conta não eram tão redondas/exactas, mas nunca na dimensão que se segue)

O rsnapshot é sem dúvida uma ferramenta fantástica para implementar uma política de backup, sendo muito astuto na utilização de hard links para minimizar os espaço em disco necessário. Na primeira execução faz uma cópia exacta da totalidade dos ficheiros da fonte e na segunda (e demais execuções) cria apenas hard links para os ficheiros copiados na primeira execução e que ainda existam na fonte.

Os discos (ou volumes lógicos) deixaram de ser caixas (a analogia inicial) graças ao rsnapshot e à sua filosofia de poupança de espaço através de hard links.

Num volume de 50GB, tenho “livres” 30GB mas já não consigo escrever lá nada

Filesystem            Size  Used Avail Use% Mounted on
/dev/xvdh              50G   30G   18G  63% /home/backups/volume

Curioso, não?! Continue reading

Ruby e RubyGems em CentOS

Sem segredos:

# yum install -y ruby
# yum install -y ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc

Prevendo que pode mesmo acontecer:

# sudo yum install httpd-devel\
  openssl-devel\
  zlib-devel\
  gcc\
  gcc-c++\
  curl-devel\

e depois sim

# passenger-install-apache2-module

The Apache 2 module was successfully installed.
Yupi!