Nginx

O Nginx (pronuncia-se “Enginex”) é um servidor web leve, que consome pouquíssimos recursos do servidor, e é muito utilizado para servir conteúdo estático, mas nada nos impede de o utilizarmos para servir conteúdo dinâmico, substituindo o Apache.

– Instalando – A instação do nginx é mais que tranquila, no meu Ubuntu, tive apenas que mandar:

$ sudo apt-get install nginx

Pronto, servido instalado. Se vc tiver o Apache ou outro servidor rodando, preste atenção, o nginx por padrão, vai tentar utilizar a porta 80, como todos. Com isso, já temos um servidor web, mas somente para conteúdo estático, vamos adicionar suporte a PHP. Primeiro vamos instalar o PHP, utilizando o jeito mais prático:

$ sudo apt-get install php5 php5-common php5-cgi php5-gd php5-mysql php5-sqlite

Temos agora, um PHP bem básico instalado, sem muitos módulos, pq não é o propósito deste artigo. Precisamos agora configurar o nginx para interpretar corretamente nossos scripts PHP, abra o arquivo “default” - aqui em /etc/nginx/sites-availabe - e cole o conteúdo abaixo.

server {
    listen 80;
    server_name localhost;
    location / {
        root /var/www; index index.php index.html index.htm;
        autoindex off;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/tmp/php-cgi.pid;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
        include fastcgi_params;
    }
}

Essa é uma regrinha simples, que faz com que todos os arquivos com extensão “.php” requisitado pelo cliente, seja enviado e processado pelo php-cgi.  É necessário também, habilitar uma linha no php.ini (/etc/php5/cgi/php.ini):

cgi.fix_pathinfo=1

Rodando o PHP como daemon No nosso caso, vamos utilizar o PHP no modo CGI,como você viu, as requisições a scripts PHP são encaminhadas via proxy para um socket. Cole o conteúdo abaixo em um aquivo vazio, vamos chamar de php-fcgi:

#!/bin/sh
#
# Author: Till Klampaeckel
#
# Credits
#
#  * original script: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2007-09/msg00468.html
#  * improved: http://till.klampaeckel.de/blog/archives/30-PHP-performance-III-Running-nginx.html
#  * all linux start script fu inspired by CouchDB's start script (by Noah Slater)
#

SCRIPT_OK=0
SCRIPT_ERROR=1

DESCRIPTION="php-fcgi super-duper-control thing"
NAME=php-fgcid
SCRIPT_NAME=$(basename $0)

WWW_USER=www-data
WWW_GROUP=www-data
PHP_CGI=/usr/bin/php-cgi

phpfcgid_children="2"
phpfcgid_requests="100"

log_daemon_msg () {
    echo $@
}

log_end_msg () {
    # Dummy function to be replaced by LSB library.
    if test "$1" != "0"; then
        echo "Error with $DESCRIPTION: $NAME"
    fi

    return $1
}

phpfcgid_start() {
    echo "Starting $NAME with $phpfcgid_children children (req: $phpfcgid_requests)."

    export PHP_FCGI_CHILDREN=$phpfcgid_children
    export PHP_FCGI_MAX_REQUESTS=$phpfcgid_requests

    su -m ${WWW_USER} -c "${PHP_CGI} -b /tmp/php-cgi.pid &"
}

phpfcgid_stop() {
    echo "Stopping $NAME."

    pids=`pgrep php-cgi`

    pkill php-cgi
}

phpfcgid_status() {
    log_daemon_msg "To be implemented: status"
    log_end_msg $SCRIPT_ERROR
}


parse_script_option_list () {

    case "$1" in
        start)
            log_daemon_msg "Starting $DESCRIPTION" $NAME
            if phpfcgid_start; then
                log_end_msg $SCRIPT_OK
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        stop)
            log_daemon_msg "Stopping $DESCRIPTION" $NAME
            if phpfcgid_stop; then
                log_end_msg $SCRIPT_OK
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        restart|force-reload)
            log_daemon_msg "Restarting $DESCRIPTION" $NAME
            if phpfcgid_stop; then
                if phpfcgid_start; then
                    log_end_msg $SCRIPT_OK
                else
                    log_end_msg $SCRIPT_ERROR
                fi
            else
                log_end_msg $SCRIPT_ERROR
            fi
            ;;
        status)
            phpfcgid_status
            ;;
        *)
            cat <&2
Usage: $SCRIPT_NAME {start|stop|restart|force-reload|status}
EOF
            exit $SCRIPT_ERROR
            ;;
    esac
}

parse_script_option_list $@

Atribuímos permissão de execução e rodamos, pronto, suporte a PHP instalado. De quebra, já colocamos para iniciar logo após o boot.

$ chmod +x php-fcgi
$ sudo mv php-fcgi /etc/init.d/
$ sudo update-rc.d php-fcgi defaults
$ sudo /etc/init.d/php-fcgi start
$ sudo /etc/init.d/nginx restart 

Conclusão — O nginx é um servidor web pronto que na minha opinião, já está pronto para substituir o Apache em aplicações de pequeno e médio porte, sites pessoais, blog e etc, onde se queira economizar ao máximo os recursos, ou mesmo servir conteúdo estático apenas. É difícil mensurar a carga máxima que ele pode aguentar, mas em todos os meus testes de carga, ele sempre respondeu muito bem.

No Wiki, há inclusive uma configuração que fizeram, utilizando FreeBSD, com 45k conexões ativas, vale a pena conferir.


Streaming e conversão de vídeos com Software Livre

Iniciando Para instalar o ffmpeg no Ubuntu, temos duas maneiras, a primeira, é compilando o mesmo, assim você dar uma refinada nos formatos que deseja dar suporte e ganha um software mais personalizado, ganhando assim em desempenho.

A segunda forma, é baixar do repositório Medibuntu, uma versão pré-compilada, com suporte a mp3 (iremos precisar para converter para FLV), já que na versão padrão do repositório do Ubuntu, não tem esse suporte, e é esta opção que vamos seguir abaixo, por ser a mais simples e fácil.

Instalando via Repositório

$ sudo -s
# wget http://www.medibuntu.org/sources.list.d/jaunty.list -O /etc/apt/sources.list.d/medibuntu.list
# wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | apt-key add - && apt-get update
# apt-get install ffmpeg lame mencoder libavcodec-unstripped-52

Testando a conversão

$ ffmpeg -i teste_in.wmv -b 1200 -deinterlace -ar 22050 -ab 64 -f flv -s 480x360 -aspect 4:3 -y -acodec libmp3lame -ac 1 teste_out.flv

Pronto, temos o ffmpeg pronto para uso.


Brincando com schemas no Cake 1.2

Introdução

Eu pessoalmente, gosto de brincar em meus projetos com dois bancos, o MySQL e o SQLite, esse segundo, eu gosto muito pela leveza e praticidade, já que fica em um arquivo só, além de ser extremamente rápido.

O SQLite, admito que uso pouco, apenas para sites pequenos, mas durante o desenvolvimento, vou usando o MySQL, já que também gosto muito do PHPMyAdmin para administrar e gerar as tabelas, ainda não achei um a altura para o SQLite, mas acho que é apenas questão de tempo.

Gerando um schema Para exportar a estrutura atual do banco:

$ cake schema generate

Utilizando um Schema Para criar a nova estrutura do banco:

$ cake schema -conection default run create

Notas Ainda em tempo, se você se interessou em utilizar o SQLite em algum projeto, dois softwares legais são o phpSQLiteAdmin, bem ao estilo de adivinha quem? Outro é o SQLite Manager, uma extensão para o Firefox, quebra um galho…


Transparência sem Compiz

Tava procurando na net alguma forma de resolver o problema da falta de bordas, quando acionava o Compiz aqui no Debian Lenny, quando me deparei com a seguinte dica no blog do Lorenzo para obter o único efeito que eu uso no Compiz: a transparência real no terminal.

$  gconftool-2 --type bool --set "/apps/metacity/general/compositing_manager" "true"

Facinho, facinho.. e cá estou eu, com o terminal transparente - vai por mim, se tu usa um o dia inteiro, como eu, vai te economizar alguns tantos “ctrl+tab”.

Essa foi du carai!


Backup incremental simples e indolor

Introdução

Com a morte do meu hd externo, que era o meu drive de backup por acaso .. fiquei, adivinha: sem backups, claro..

Pesquisei um pouco, e achei o Rsync bem fácil de usar, então, só precisei colocar na cron, para atualizar todos os dias..

Instalando Do lado servidor, apenas instalei o pacote nfs-server, e configurei o meu /etc/exports com as opções: /home/thiago 192.168.1.17(rw,async)

$ sudo apt-get install nfs-server
$ sudo echo "/home/thiago 192.168.1.17(rw,async)" >> /etc/exports

Pronto, exportei o meu home apenas para o ip do meu note… coisa simples, é uma rede local..

Agora, criei um script simples, só pra automatizar as coisas:

#!/bin/bash
sudo mount 192.168.1.1:/home/thiago /media/bridge1 -o rw
rsync -Cravzp --delete-excluded --force /home/thiago/Photos /media/bridge1/
sudo umount -l /media/bridge1

E pronto.. as opções, você pode pegar digitando rsync sem parâmetros, mas aquilo tudo ali quer dizer: copia tudo recursivamente (varrendo sub-diretórios), me mostrando o tudo (verbose), compacta durante a transferência, mantém as permissões e apaga o que foi excluído do original.. maravilha, tudo que precisava…

Agora, vai da necessidade, tem muito a que melhorar/acrescentar.. mas, ô trocinho bom esse Rsync hein?!?