Jan 29, 2012 -
Uncategorized
No Comments
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
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;
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;
}
}
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;
}
}