Ocultando versões do Nginx e PHP de seu servidor web

Uma prática comum em administração de servidores é ocultar a versão dos softwares utilizados, o que dificultaria na exploração de falhas específicas de um determinado pacote. Resolvi escrever esse arquivo mostrando como é fácil ocultar tais informações no Nginx e no PHP.

Nginx

Para remover a versão do Nginx das requisições, edite o arquivo nginx.conf (geralmente em /etc/nginx) e dentro de umas seções: http, server ou location, acrescente:

server_tokens off;

O uso da variável na seção http modificará a exibição em todos os servers configurados. Por sua vez, você pode filtrar esse comportamento usando a diretiva na seção server, para remover a informação de versão em um servidor específico ou ainda na seção location, para um local específico. Realizada a alteração, reinicie o servidor web:

service nginx restart

PHP

Para ocultar a versão do PHP, abra o arquivo php.ini e procure pela configuração expose_php:

expose_php = Off

Não se esqueça de reiniciar o Apache ou o PHP5-FPM para que a alteração surja efeito.

 

Plugin WordPress: Fast Flickr

Apesar do Flickr não ser mais o mesmo de antes, precisei em um trabalho exibir as fotos de um set em uma janela estilo lightbox. Em 2006 tinha escrito um plugin tosco e resolvi escrever algo novo.

Demo:

[fastflickr set=72157630371382464]

Uso:

  1. Faça o download dos arquivos, copie-os para seu diretório de plugins;
  2. Ative o Fast Flickr em seu administrador;
  3. Use em seus posts ou páginas:
[ fastflickr set=ID DO SET ]

Foi algo que escrevi em poucas horas e faz apenas o básico. O código está no GitHub.

 

Geração de PDFs indolor no PHP

Tempos atrás escrevi um artigo sobre como gerar PDF dentro do Rails usando a gem wicked_pdf e o wkhtmltopdf. Como escrevi no post anterior, o wkhtmltopdf usa Webkit, a engine de renderização do Safari / Chrome para gerar a visualização do documento. Isso o torna superior se comparado com bibliotecas do PHP como o FPDF, pois, geralmente, essa bibliotecas possuem dificuldades para reproduzir efeitos de CSS.

Em um novo projeto, estou usando novamente o wkhtmltopdf, mas agora dentro do PHP. No post anterior, indiquei que você pode usar o binário disponível no site, entretanto no servidor atual, tive alguns problemas com isso. Então, se possível, compile o wkhtmltopdf direto da fonte.

Compilação passo-a-passo

Instale em seu servidor alguns pacotes que irá precisar:

apt-get install openssl build-essential xorg libssl-dev libxrender-dev git-core

… e obtenha o código fonte recente do wkhtmltopdf:

git clone git://github.com/antialize/wkhtmltopdf.git wkhtmltopdf
git clone git://gitorious.org/+wkhtml2pdf/qt/wkhtmltopdf-qt.git wkhtmltopdf-qt

Veja, para usar o wkhtmltopdf você precisará do QT. Nesse caso também vamos compilá-lo manualmente:

cd wkhtmltopdf-qt
git checkout staging
QTDIR=. ./bin/syncqt
./configure -nomake tools,examples,demos,docs,translations -opensource -prefix "../wkqt"
make -j3 && make install
cd .. 

Com o QT gerado, você finalmente poderá compilar o wkhtmltopdf:

cd wkhtmltopdf
../wkqt/bin/qmake
make && make install

Não inventei a receita acima, mas ela funcionou perfeitamente no Debian. Com a compilação a pasta /usr/bin ganhou 2 novos executáveis: wkhtmltopdf e wkhtmltoimage. Com isso você já pode usar o utilitário pelo shell. Se quiser testá-lo, experimente:

PHP

Dentro do próprio site do wkhtmltopdf há uma classe em PHP para utilizar o aplicativo dentro do seu site, entretanto, optei por uma classe disponível no Github. Um simples exemplo, tirado do próprio repositório:

try {
	$wkhtmltopdf = new Wkhtmltopdf(array('path' => APPLICATION_PATH . '/../public/uploads/'));
	$wkhtmltopdf->setTitle("Title");
	$wkhtmltopdf->setHtml("Content");
	$wkhtmltopdf->output(Wkhtmltopdf::MODE_DOWNLOAD, "file.pdf");
} catch (Exception $e) {
	echo $e->getMessage();
}

O que o exemplo não mostra é como definir uma mensagem de rodapé. Só depois de algum tempo, percebi que o wkhtmltopdf busca um arquivo externo. No meu aplicativo, defino o rodapé dinamicamente:

$wkhtmltopdf->setFooterHtml("footer.php?msg='Hello World!'");
 

Coletânea de dicas sobre WordPress

Resolvi escrever uma série de posts com diversas dicas para o WordPress.

Temas

Vai escrever um template do zero? Recomendo começar pelo HTML5 Boilerplate. Trata-se de um template com diversas otimizações e resets para garantir a compatibilidade máxima entre browsers.

Também é interessante uma leitura sobre o desenvolvimento de temas, principalmente sobre a hierarquia dos templates e a função get_template. Venho utilizando essa função para não repetir código nos arquivos archive.php, page.php, search.php e single.php.

Rascunhos de posts

O WordPress salva automaticamente seus posts, o que pode aumentar o tamanho de seu banco de dados. Para desabilitar esse recurso, você pode editar o arquivo /wp-config.php:
Read more

 

Busca nos campos personalizados do WordPress

Os campos personalizados é um recurso usado no WordPress para que o autor de um post possa armazenar dados a sua escolha. Você pode usar esse recurso de várias formas: mostrar imagens personalizadas, falar o que você está ouvindo durante a escrita do post, adicionar informação pessoal e muito mais. Em um blog sobre livros, você pode usar tal recurso para criar os campos “Autor”, “Editora”, “Ano” e por aí vai.

Estou trabalhando em um projeto que utiliza os campos personalizados na área de Imprensa, onde cada post aponta em que tipo de imprensa determinada informação foi postada: Rádio, TV, Internet, Jornal. Como dito acima, criar o campo personalizado é simples. Difícil é filtrar os posts de acordo com o valor do campo.

A solução

Descobri um plugin chamado Search Custom Fields. Numa explicação rápida, ele adiciona os Campos Personalizados na query de busca de posts.

Antes:

<a href="/?s=minhabusca">minha busca</a>

Depois:

<a href="?meucampopersonalizado=Veículo&s=meuvalordocampopersonalizado">minha busca pelo campo personalizado</a>

Na documentação do plugin, o autor mostra como turbinar o campo de busca do WordPress. Ao invés disso, escrevi uma pequena função para listar os valores de um atributo personalizado:

function list_custom_fields($metakey, $output) {
	// based on http://sixrevisions.com/wordpress/custom-fields-search/
	global $wpdb;
	$items = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
	if ($items) {
		if ($output == "dropdown") { // display values in a select
			echo "<form action=\"/\" method=\"get\"><input type=\"hidden\" name=\"key\" value=\"$metakey\" /><select name=\"s\" onchange=\"this.form.submit();\"><option></option>";
			foreach ($items as $item) {
			  echo "<option value=\"" . $item . "\">" . $item . "</option>";
			}
			echo "</select></form>";
		} else if ($output == "list") { // display values in a list
			echo "<ul>";
			foreach ($items as $item) {
			  echo "<li><a href=\"/?s=$item&key=$metakey\">$item</a></li>";
			}
			echo "</ul>";
		}
	}
}

Coloque a função acima no arquivo functions.php do seu tema e chame-a, de duas formas, em seu sidebar, por exemplo:

< ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "dropdown"); ?>

…para mostrar os valores do campo personalizado “Veículo” em select do HTML ou…

< ?php if(function_exists('list_custom_fields')) list_custom_fields("Veículo", "list"); ?>

…para mostrar os valores do campo personalizado “Veículo” em uma lista.

 

Alternativas ao PHPMyAdmin

O PHPMyAdmin é quase uma unanimidade em gerenciadores de banco de dados MySQL. Mas existe vida além dele. Vamos lá:

SQL Buddy

O SQL Buddy é uma alternativa bacana, com bonita interface e traduzido para vários idiomas, incluindo português.

sqlbuddy

Adminer

Já o Adminer é um app em php feito em 1(!) único arquivo. Possui diversas traduções (nenhuma ainda em português) mas é altamente indicado o mantermos em nossos servidores para uma rápida manutenção.

adminer

 

URL curta no WordPress

As URLs curtas possuem muitas utilizações por aí, principalmente em microblogs como o Twitter.

Use a função acima no arquivo functions.php do seu tema. Para exibir o link, crie a seguinte linha no arquivo do post – single.php:

< ?php echo '<a href="'.getShortUrl(get_permalink($post->ID)).'">short url'; ?>
 

PHP junto com o Passenger no Leopard

Na minha máquina de desenvolvimento uso o Passenger para trabalhar com o Rails e hoje eu precisei fazer alguns testes com PHP. Deixar o PHP junto com o Passenger é tão simples como 2 + 2 são 4. Vamos lá.

Abra o arquivo de configuração do Apache (/etc/apache2/httpd.conf) como superusuário e procure a linha que chama o módulo do PHP (linha 114):

LoadModule php5_module        libexec/apache2/libphp5.so

Basta descomentar essa linha. Em seguida, no fim desse arquivo, crie um host virtual chamado php:

<virtualhost *:80>
  ServerName php
  DocumentRoot "/Users/leonardofaria/Sites/php"
  <directory "/Users/leonardofaria/Sites/php">
	Options Indexes MultiViews
	AllowOverride None
	Order allow,deny
	Allow from all
  </directory>
</virtualhost>

Pronto. Agora a url http://php/ responderá pelo conteúdo da pasta “/Users/leonardofaria/Sites/php”. Lá dentro, você pode criar um index.php e para testar se está tudo ok, use o conhecido phpinfo()

< ?php
phpinfo();
?>

Se tudo der certo, você terá uma tela como a seguinte :)

 

Obtendo o número de leitores do seu Feedburner

Post rápido da madrugada: eu e toda blogosfera (sic) que utiliza o Feedburner para gerenciar feeds de blogs e whatever pode não gostar dessa imagenzinha:

Esse azul-calcinha geralmente não combina muito com os layouts de nossos sites. Eu sei que existe forma de mudar de azul-calcinha para rosa-bebê, mas isso não melhora grandes coisas. A solução em duas linhas está no PHP:

$xml = simplexml_load_file("http://api.feedburner.com/awareness/1.0/GetFeedData?uri=SEUFEED");
$subs = $xml->feed->entry['circulation'];

O método simplexml_load_file é um parser rápido e esperto do PHP 5. No código acima, $subs retorna o número de leitores. Simples assim.

 

Alterando o PHP.ini da Dreamhost

Algumas configurações do PHP da Dreamhost, como o uso do fopen(), são desabilitadas por questões de segurança. Isso pode atrapalhar o funcionamento de suas aplicações. Entretanto, é possível habilitar essa e outras funções via shell.

O wiki da Dreamhost traz muitas dicas sobre a configuração do PHP.ini. Uma que eu reproduzo abaixo é a habilitação do fopen().

Após fazer uma conexão ssh com o servidor, crie o seguinte shellscript:

PHP 4

#!/bin/sh
CGIFILE="$HOME/[your website directory]/cgi-bin/php.cgi"
INIFILE="$HOME/[your website directory]/cgi-bin/php.ini"
cp /dh/cgi-system/php.cgi "$CGIFILE"
cp /etc/php/cgi/php.ini "$INIFILE"

perl -p -i -e '
s/.*allow_url_fopen.*/allow_url_fopen = On/;
' "$INIFILE"

PHP 5

#!/bin/sh
CGIFILE="$HOME/[your website directory]/cgi-bin/php.cgi"
INIFILE="$HOME/[your website directory]/cgi-bin/php.ini"
cp /dh/cgi-system/php5.cgi "$CGIFILE"
cp /etc/php5/cgi/php.ini "$INIFILE"

perl -p -i -e '
s/.*allow_url_fopen.*/allow_url_fopen = On/;
' "$INIFILE"

Defina qual o domínio a ser alterado (linha 2 do script), salve esse script, dê permissão de execução (chmod +x php-update.sh) e o execute (./php-update.sh).

Você também pode colocá-lo em execução semanalmente, para evitar erros futuros. Para isso, abra o crontab (crontab -e) e agende: @weekly /home/myusername/php-update.sh

[update]: via comentário do Vinícius, vale lembrar que deve-se criar um arquivo .htaccess, para mudar o modo de como o PHP é executado por padrão:

Options +ExecCGI
Action php-cgi /cgi-bin/php.cgi
AddHandler php-cgi .php
 

Microblogs e Tumblelogs

Uma nova mania interessante são os microblogs, blogs com pequenos textos. O mais famoso é o Twitter. Esse ano, surgiu o Pownce (já falei dele por aqui), que além de micro-posts, reúne fáceis formas de compartilhar arquivos.

Junto a tudo isso vivem também os tumblelogs, que reúnem de forma fácil a postagem de vídeos, imagens, textos e links. Testei recentemente o Tumblr. O que chama a atenção nele (Powered by Rails) é o simples adminstrador, que não requer do usuário preocupações de como manter seu diário pessoal.

Baseado nessa simplicidade, procurei por algumas soluções semelhantes ao Tumblr, para um futuro projeto. O primeiro é o Gelato CMS, escrito em PHP. Pelo menos um dos templates dele parece muito com um template usado no Thumblr. Descobri, também em PHP, o Bazooka. E em Rails vi o ozimodo.

 

Conheça o sNews, mini CMS profissional em PHP

O sNews é uma solução em PHP/MySQL que conheci baseada em 1 único arquivo, leve, rápido, fácil de instalar e webstandards. Com todos esses features listados em seu site, resolvi instalar em um subdominio. O adminstrador é bem simples e minimalista. O sistema possui busca, URLs amigáveis e RSS para todo o site. Além disso, existe um fórum da aplicação, com traduções para vários idiomas e alguns mods interessantes.

 

Estatísticas

Quem não estiver satisfeito com o Webalizer, Google Analytics, Awstats e cia, pode instalar o Slimstat. Instalei no domingo no meu servidor e achei muito bacana. Traz referências de formas bem completas e para (quase) tudo oferece um feed.

(Graças a esse sistema eu descobri que, se você digita “comendo um coelho” no Google, meu site aparece em 3º lugar)

 

Fast Flickr

Fast Flickr is my first WordPress plugin. This plugin shows a set of Flickr easily, with Lightbox 2 suport.

USAGE:
1) Download the plugin.
2) Copy Fast Flickr folder into wp-content/plugins.
3) Active in Plugins Panel
4) In sidebar.php, paste:

< ?php fastflickr("Set id", "Show title of set: false or true","Show description: false or true"); ?>

EXAMPLE:

< ?php fastflickr("72157594168783620", 1,1); ?>

FAST FLICKR IN ACTION (WITHOUT TITLE, DESCRIPTION AND CSS): fastflickr(“72157594168783620”, 0,0); There is 3 CSS Class of this code: .f_title (title of set), .f_description (description of set) and .f_picture (used in images). An example of style:

.f_title {font-weight: bold; display: block}
.f_description {color: red; display: block}
.f_picture {border: 1px solid #999999; padding:4px; margin: 3px;}

Note: to run Fast Flickr in any post, you need of PHP Exec Plugin, that allows PHP executations. For default, WordPress deny PHP Scripts in posts and pages.

 

Top plugins para WordPress

WordPress é unanimidade em solução para blog. Há uns três anos, quando comecei minha vida blogger, eu mesmo escrevia um pequeno gerenciador de notícias, mas isso não se mostrou tão eficiente. Depois disso, adotei o AJ-Fork, mas esse também não se mostrou tão eficiente. Adotei o WordPress e agora relato alguns plugins bastantes interessantes, que uso aqui, ou na extranet da empresa (sim, aonde trabalho estamos desenvolvendo uma extranet).
Read more

 

Webalizer

O Webalizer, para quem não sabe, é um software que mostra as estatísticas de utilização de um site. Seu acesso, na maioria das vezes, é feita pelo cPanel, painel de controle do servidor. Esse acesso só acontece se o usuário estiver logado, o que pode inviabilizar o acesso as estatísticas por pessoas sem a senha.
Entretanto, há uma forma de exibir esses dados, publicamente.
Read more

 

Verificando contas de e-mail POP3 com PHP

Escrevi uma funçãozinha que verifica a existência de emails (e informações adicionais como: assunto, remetente e data) de contas POP3, em PHP. O código está abaixo.

Na próxima semana, postarei uma revisão desse código. A próxima versão implementará uso de CSS e Javascript, para uma interface mais interativa.

Read more