Articles by " nuno"
Jan 29, 2012 - Uncategorized    No Comments

Minificar CSS e Javascript com o nginx

O nginx é um servidor web fantástico com possibilidades de expansão por módulos praticamente ilimitado.
Utilizando o módulo de perl embebido é possível minificar css e javascript de forma automática.
O exemplo que se segue foi adaptado de vários exemplos que encontrei por forma a conseguir a configuração desejada.
De salientar que não sou programador e perl para mim é como pilotar um avião :)

Para o exemplo utilizo o ubuntu server 10.4 lts:

sudo add-apt-repository ppa:nginx/stable
sudo aptitude update
sudo aptitude install libcss-minifier-xs-perl libjavascript-minifier-xs-perl nginx-extras

De seguida grave o ficheiro em baixo como /etc/nginx/perl/Minify.pm e altere as permissões para execução (chmod 755)

package Minify;
use nginx;
use JavaScript::Minifier::XS;
use CSS::Minifier::XS;

sub css_handler {
my $r = shift;
my $cache_dir="/tmp";
my $cache_file=$r->uri . ".min.css";
$cache_file=~s!/!_!g;
$cache_file=join("/", $cache_dir, $cache_file);
my $uri=$r->uri;
my $filename=$r->filename;

local $/=undef;

return DECLINED unless -f $filename;

if (! -f $cache_file) {
open(INFILE, $filename) or die "Error reading file: $!";
my $css = ;
close(INFILE);

open(OUTFILE, '>' . $cache_file) or die "Error writing file: $!";
print OUTFILE CSS::Minifier::XS::minify($css);
close(OUTFILE);
}

$r->send_http_header('text/css');
$r->sendfile($cache_file);
return OK;
}

sub js_handler {
my $r = shift;
my $cache_dir="/tmp";
my $cache_file=$r->uri . ".min.js";
$cache_file=~s!/!_!g;
$cache_file=join("/", $cache_dir, $cache_file);
my $uri=$r->uri;
my $filename=$r->filename;

local $/=undef;

return DECLINED unless -f $filename;

if (! -f $cache_file) {
open(INFILE, $filename) or die "Error reading file: $!";
my $js = ;
close(INFILE);

open(OUTFILE, '>' . $cache_file) or die "Error writing file: $!";
print OUTFILE JavaScript::Minifier::XS::minify($js);
close(OUTFILE);
}

$r->send_http_header('application/javascript');
$r->sendfile($cache_file);
return OK;
}
1;

Por fim, edite a configuração do seu vhost no nginx e adicione o seguinte:

#Perl
perl_modules perl;
perl_require Minify.pm;

server {
listen 80;
server_name www.nome.pt;
root /srv/www/nome.pt/public;

...
a sua configuração existente
...

# Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico)$ {
}

# Perl Minify
location ~ \.css$ {
try_files $uri.min.css @minify_css;
}
location ~ \.js$ {
try_files $uri.min.js @minify_js;
}
location @minify_css {
perl Minify::css_handler;
}
location @minify_js {
perl Minify::js_handler;
}
}