430 likes | 573 Views
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
E N D
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 • otvoren izvorni kod • besplatan • teško da će nestati
Zašto PERL? • Izrazito brz • Izrazito nadogradiv • Objektan • Moćan • Portabilan • Raspoloživ izvorni kod
Zašto mod_perl? • kompajliranje on-demand • mogućnost pisanja Apache modula • mogućnost pisanja handlera za svaki dio korisničkog zahtjeva • mogućnost skriptne konfiguracije • brzina 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 koda • Pomoću Apache Toolbox-a
Instalacija na već postojećem Apache-u • Instaliranje kao tipičnog PERL modula Perl Makefile.pl make make test make install
Kako Apache radi? WEB preglednik WEB poslužitelj (APACHE) Zahtjev Odgovor
Pogled u međusobnu komunikaciju GET /index.php3 HTTP/1.1 Host: www.linux.hr HTTP/1.1 200 OK Date: Tue, 13 March 2001 13:16:02 GMT Server: Apache/1.3.12 (Linux) mod_perl/1.13 Last-Modified: Wed, 11 Feb 2001 21:05:25 GMT Content-Length: 892 Connection: close Content-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 OK • 404 NOT FOUND • 500 INTERNAL SERVER ERROR • 403 FORBIDDEN • 405 METHOD NOT ALLOWED • 301 MOVED PERMANENTLY • 302 MOVED TEMPORARY
Životni ciklus Apache-a Podizanje poslužitelja Inicij. modula Inicij. djeteta Inicij. djeteta Inicij. djeteta Krug zahtjeva Krug zahtjeva Krug zahtjeva Umiranje djeteta Umiranje djeteta Umiranje djeteta
Krug zahtjeva(Request loop) REQUEST (wait) Post-Read req. URI translation Header parsing cleanup Access control Authentication Authorization logging MIME type check fixups RESPONSE
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 upita • Dodatne 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!”
$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; } } Primjer regularne optimizacije
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
SELECT * FROM addressbook; fetch_hashref(); SELECT name,tel FROM addressbook; fetch_array(); Primjer optimizacije SQL upita
Dodatne mod_perl optimizacije • Pomoću Apache::Registry-a Dodavanjem u Apache konfiguraciju: Alias /perl /usr/local/apache/perl/ <Location /perl> SetHandler perl-script PerlHandler Apache::Registry PerlSendHeader On Options +ExecCGI </Location>
Izrada novog web site-a: • Napraviti plan site-a • Treba 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 • OK • DECLINED • DONE • SERVER_ERROR • NOT_FOUND • BAD_REQUEST • UNAUTHORIZED
Hello World package 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-script PerlHandler 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 => “web@jedan.test.hr”, DocumentRoot => “/home/httpd/html” }, { ServerName => “jedan.test.hr”, ServerAdmin => “web@jedan.test.hr”, DocumentRoot => “/home/httpd/html” } ]
Negativne strane mod_perla • Slabo raširen • Teško da neki ISP pruža mod_perl usluge • Teško da neki ISP podržava mod_perl uopće