Upload
arnie
View
30
Download
0
Embed Size (px)
DESCRIPTION
HrOpen. Izrada hit-critical web site-ova koristeći mod_perl. Vlatko Košturjak HULK Našice & HrOpen. Što koristiti?. Apache Perl mod_perl. Zašto Apache?. Po NetCraft-u jedan od najzastupljenijih web servera izrazito nadogradiv i konfigurabilan raspoloživ za gotovo sve platforme - PowerPoint PPT Presentation
Citation preview
Izrada hit-critical web site-ova koristeći mod_perl
Vlatko KošturjakHULK Našice & HrOpen
HrOpen
Što koristiti?
ApachePerlmod_perl
Zašto Apache?
Po NetCraft-u jedan od najzastupljenijih web servera
izrazito nadogradiv i konfigurabilanraspoloživ za gotovo sve platformeotvoren izvorni kodbesplatanteško da će nestati
Zašto PERL?
Izrazito brzIzrazito nadogradivObjektanMoćanPortabilanRaspoloživ izvorni kod
Zašto mod_perl?
kompajliranje on-demandmogućnost pisanja Apache modula
mogućnost pisanja handlera za svaki dio korisničkog zahtjeva
mogućnost skriptne konfiguracijebrzina uz fleksibilnost
Instalacija Apache-a i mod_perl-a
Pomoću paketa na Linux distribucijama pomoću paketa
(deb, rpm, …) na *BSD-ovima pomoću paketnih
programa (pkg_add)Iz izvornog kodaPomoću Apache Toolbox-a
Instalacija na već postojećem Apache-u
Instaliranje kao tipičnog PERL modulaPerl Makefile.pl makemake testmake install
Kako Apache radi?
WEB preglednikWEB
poslužitelj(APACHE)
Zahtjev
Odgovor
Pogled u međusobnu komunikaciju
GET /index.php3 HTTP/1.1Host: www.linux.hr
HTTP/1.1 200 OKDate: Tue, 13 March 2001 13:16:02 GMTServer: Apache/1.3.12 (Linux) mod_perl/1.13Last-Modified: Wed, 11 Feb 2001 21:05:25 GMTContent-Length: 892Connection: closeContent-type: text/html
<HTML>…
Implementacija jednostavnog Web klijenta
#!/usr/bin/perl
use IO::Socket;
$host = "www.linux.hr";
$remote = IO::Socket::INET->new (
Proto => "tcp",
PeerAddr => $host,
PeerPort => "http(80)",
);
Web klijent II
unless ($remote) { die "cannot connect to $host" }
$remote->autoflush(1);
print $remote "GET /index.php3 HTTP/1.1\nHost: www.linux.hr\n\n";
while (<$remote>) { print }
-close $remote;
Izlazni kodovi web poslužitelja
200 OK404 NOT FOUND500 INTERNAL SERVER ERROR403 FORBIDDEN405 METHOD NOT ALLOWED301 MOVED PERMANENTLY302 MOVED TEMPORARY
Životni ciklus Apache-a
Krug zahtjeva Krug zahtjeva Krug zahtjeva
Umiranje djetetaUmiranje djeteta Umiranje djeteta
Podizanje poslužitelja
Inicij. modula
Inicij. djeteta Inicij. djeteta Inicij. djeteta
Krug zahtjeva(Request loop)
REQUEST
(wait) Post-Read req.
URI translation
Header parsing
Access control
Authentication
Authorization
MIME type check
fixupsRESPONSE
logging
cleanup
Hit-Critical site-ovi
Optimizacija već postojećih PERL web site-ova pisanih kao CGI skripte
Kako početi pisati hit-critical web site-ove optimizirano pomoću PERL modula
Optimizacija već postojećih PERL site-ova
Regularna optimizacija Optimizacija SQL upitaDodatne mod_perl optimizacije
hello.cgi
#!/usr/local/bin/perl
print “Content-type: text/html\n\n”;
print “<HTML>\n”;print “Hello World\n”;print “</HTML>\n”;
Regularna optimizacija
Optimizacija kao i kod regularnih programa Optimizacija kritičnih dijelova Zakon optimizacije: “Najmanji kod ne
mora biti i najbrži!”
Primjer regularne optimizacije
$sum=1;for ($i=1;$i<=$num;$i+
+){
$sum=$sum*$i;}
$sum=1;$sum=$SUM_FOR_200 if
($num==200)else{
for ($i=1;$i<$num;$i++){
$sum=$sum*$i;}
}
Optimizacija SQL upita
Smanjiti broj SQL upita ako je moguće
Zatražiti u upitu samo ona polja koja su potrebna
Pohraniti ih u polje, a ne hash
Primjer optimizacije SQL upita
SELECT * FROM addressbook;
fetch_hashref();
SELECT name,tel FROM addressbook;
fetch_array();
Dodatne mod_perl optimizacije
Pomoću Apache::Registry-aDodavanjem u Apache konfiguraciju:
Alias /perl /usr/local/apache/perl/<Location /perl>
SetHandler perl-scriptPerlHandler Apache::RegistryPerlSendHeader OnOptions +ExecCGI
</Location>
Izrada novog web site-a:
Napraviti plan site-aTreba skicirati i izabrati što će
biti kritično Primjer: Kod pretraživača će biti
kritično samo pretraživanje, a ne i unošenje
Odlučiti što treba ubrzati i kako
Pisanje PERL handlera
package hropen::primjer;
sub handler {
my $r=shift;
return STATUS_CODE;
}
1;
STATUS_CODE
OKDECLINEDDONESERVER_ERRORNOT_FOUNDBAD_REQUESTUNAUTHORIZED
Hello Worldpackage hropen::hello;
use strict;use Apache::Constants qw (:common);
sub handler {my $r=shift
$r->content_type(‘text/html’);
Hello World II
$r->send_http_header;$r->print (<<END);
<HTML>Hello World</HTML>END
return OK;}
1;
Hello World III
Dodati u apache konfiguraciju:
<Location /hropen/hello>SetHandler perl-scriptPerlHandler hropen::hello
</Location>
Hello World u C-u I
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_protocol.h"
static int hello_handler (request_rec *r)
{
Hello World u C-u II
r->content_type = "text/html";
ap_send_http_header(r);
hostname = ap_get_remote_host (r->connection,r->per_dir_config,REMOTE_NAME);
ap_rputs("<HTML><HEAD>\n",r);
ap_rputs("<TITLE>Hello</TITLE>\n",r);
ap_rputs("</HEAD><BODY>\n",r);
ap_rprintf(r,"Hello %s\n",hostname);
ap_rputs("</BODY></HTML>\n”,r);
return OK;
}
Hello World u C-u III
static handler_rec hello_handlers[] =
{
{"hello-handler", hello_handler},{NULL}
};
module MODULE_VAR_EXPORT hello_module =
{
STANDARD_MODULE_STUFF,
NULL, /* module init */
NULL, /* per-dir config creator */
NULL, /* dir config merger */
NULL, /* server config creator */
NULL, /* server config merger */
NULL, /* command table
Hello World u C-u IV
hello_handlers, /* content handlers */
NULL, /* URI-to-filename translation */
NULL, /* check/validate user_id */
NULL, /* check access by host adr */
NULL, /* MIME type checker/setter */
NULL, /* fixups */
NULL, /* logger */
NULL, /* header parser */
NULL, /* process init */
NULL, /* process exit/cleanup */
NULL /* post read_request handling */
};
Statičko kompajliranje
./configure --activate-module=src/module/site/chello.c --enable-module=hello
make
Dinamičko kompajliranje
Korištenjem Apache Extension Tool-a (apxs-a):
/usr/local/apache/bin/apxs -c -i -a chello.c
Hello World sa prenošenjem parametara I
package hropen::phello;
use Apache();use Apache::Constants qw(:common);
sub handler { my $r = shift; my %params = $r->method eq 'POST' ? $r->content : $r-
>args; my $user = $params{'user'} || 'nepoznati';
$r->content_type('text/html'); $r->send_http_header();
Hello World sa prenošenjem II
$r->print (<<END);
<HTML>Pozdrav $user <BR><FORM METHOD=POST><INPUT NAME=user MAXSIZE=40 LENGTH=40><INPUT TYPE=submit VALUE="promjeni"></FORM</HTML>END
Hello World sa prenošenjem III
return OK;}
1;
Hello World sa prenošenjem IV
Unos u konfiguraciju Apache-a:
<Location /hropen/phello> SetHandler perl-script Perlhandler hropen::phello</Location>
Dodatne optimizacije SQL upita koristeći mod_perl
Korištenje stalnih (persistant) veza prema bazi:
use Apache::DBI();
$DBH||=DBI->connect($data_source, $user, $password);
Primjer pisanja PERL-a u konfiguraciji
Dodajemo direktno u Apache konfiguraciju:
<Perl>my $hostname=`hostname`;$user=“nobody”;$user=“www-data” if $hostname
=~/^debian/;$user=“httpd” if $hostname =~/^redhat/;</Perl>
Primjer pisanja Virtual Host-ova pomoću PERL-a
$VirtualHost{‘192.168.3.15’}=[{
ServerName => “jedan.test.hr”,
ServerAdmin => “[email protected]”,
DocumentRoot => “/home/httpd/html”
},
{
ServerName => “jedan.test.hr”,
ServerAdmin => “[email protected]”,
DocumentRoot => “/home/httpd/html”
}
]
Negativne strane mod_perla
Slabo raširenTeško da neki ISP pruža
mod_perl uslugeTeško da neki ISP podržava
mod_perl uopće
PITANJA...