Izrada hit-critical web site-ova koristeći mod_perl

Preview:

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 => “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širenTeško da neki ISP pruža

mod_perl uslugeTeško da neki ISP podržava

mod_perl uopće

PITANJA...

Recommended