spletni strežnik

12
Oto Brglez Spletni strežnik 1 / 12 Fakulteta za elektrotehniko računalništvo informatko FERI Univerza v Mariboru Spletni strežnik Seminarska naloga pri predmetu Osnove Sistemske Programske Opreme Oto Brglez, 93643930 10. februar 2010 Spletni strežnik 1 / 12

Upload: oto-brglez

Post on 26-Oct-2014

183 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Spletni strežnik

Oto Brglez Spletni strežnik 1 / 12

Fakulteta za elektrotehnikoračunalništvo informatko FERI

Univerza v Mariboru

Spletni strežnikSeminarska naloga pri predmetuOsnove Sistemske Programske Opreme

Oto Brglez, 9364393010. februar 2010

Spletni strežnik 1 / 12

Page 2: Spletni strežnik

Oto Brglez Spletni strežnik 2 / 12

KazaloKaj je spletni strežnik?............................................................................................................ 3Zgodovina spletnega strežnika................................................................................................3Vrste spletnih strežnikov.........................................................................................................4Funkcionalnost sodobnih spletnih strežnikov........................................................................ 4Delovanje spletnega strežnika................................................................................................ 5Dinamične spletne strani in spletni strežniki.......................................................................... 6Praktčni spletni strežniki........................................................................................................6Spletni strežnik Apache.......................................................................................................... 7Spletni strežnik Internet Informaton Server (IIS)................................................................... 8Implementacija spletnega strežnika v jeziku C........................................................................9Implementacija spletnega strežnika v Pythonu.................................................................... 11Viri in literatura.....................................................................................................................12

Spletni strežnik 2 / 12

Page 3: Spletni strežnik

Oto Brglez Spletni strežnik 3 / 12

Kaj je spletni strežnik?Spletni strežnik je uporabniški program napisan v poljubnem programskem jeziku, ki

podpira „vtčnike“ (v nadaljevanju socket-e) in osnove omrežne operacije. Spletni strežnik je program, ki teče na računalniku in skozi HTTP protokol posreduje informacije. Posredovanje informacij poteka skozi sprejemanje zahtev (HTTP request) in dajanje odgovorov na te zahteve (HTTP response).

Zgodovina spletnega strežnikaPrvi spletni strežnik je napisal eden izmed očetov interneta Tim Berners-Lee med

svojim delom pri organizaciji CERN (European Organizazaton for Nuclear Research). Namen njegovega projekta je bil poenostavit izmenjavo podatkov med zaposlenimi znanstveniki z uporabo „hypertext sistema“.

Prvi spletni strežnik je bil napisan v programskem jeziku C, deloval pa je na operacijskem sistemu NeXTSTEP. Prvi spletni strežnik se je imenoval CERN htpd, kasneje, ko ga je prevzel konzorcij W3C pa se je preimenoval v W3C htpd. (htpd izhaja iz kratce HTTP in besede deamon). Poleg spletnega strežnika je Tim Berners-Lee napisal tudi prvi spletni brskalnik; brskalnik je poimenoval WorldWideWeb.

Spletni strežnik 3 / 12

Slika 1: Prvi spletni strežnik. CERN htpd. Avtor: Tim Berners-Lee

Page 4: Spletni strežnik

Oto Brglez Spletni strežnik 4 / 12

Vrste spletnih strežnikovGlede na implementacijo poznamo dve vrst spletnih strežnikov. Spletne strežnike, ki

so implementrani v samem operacijskem sistemu – kot moduli jedra ali kot navadni programi v uporabniškem prostoru.

Prednost strežnikov napisanih v prostoru jedra je v tem, da so zaradi tega, ker so napisani na nižjem nivoju tudi hitrejši. Saj dostopajo do strojne opreme, ki jo potrebujejo za svoje delo direktno in brez omejitev operacijskega sistema. Hitrejši dostop se pozna predvsem pri dostopih do pomnilnika, dostopih do procesorskih rezin in dostopih do omrežnih adapterjev. Dostopi do virov, ki jih spletni strežnik največ potrebuje in uporablja. Tipična predstavnika takih strežnikov sta Microsof IIS in odprto-kodni spletni Linux strežnik TUX.

Učinkovitost spletnega strežnika napisanega kot modul jedra ni nujno boljša kot učinkovitost spletnega strežnika napisanega v uporabniškem prostoru. Potrebno je vedet, da je veliko odvisno tudi od tega kakšno je jedro operacijskega sistema in kako deluje.

Funkcionalnost sodobnih spletnih strežnikov1) Spletni strežniki se uporabljajo za gostovanje „virtualnih gostteljev“ (virtual hosts).

Sistemi virtualnih gostteljev nam omogočajo, da na enem spletnem strežniku poganjamo več spletnih strani pod različnimi domenami. Prednost virtualnih gostteljev je v tem, da lahko na enem spletnem strežniku ponujamo več kot eno spletno stran.

2) Nudenje velikih datotek. Sodobni spletni strežniki morajo bit sposobni nudit in obdelovat velike datoteke, velikemu številu uporabnikov ponavadi tudi na različnih platormah in aritekturah.

3) Omejitve in optmizacije prometa. Sodobni spletni strežniki so sposobni predvidevat in optmizirat zahteve in odgovore. S pomočjo optmizacij zmanjšajo promet znotraj omrežja v katerem so prisotni.

4) Balansiranje prometa (load balancing). Strežnike lahko porazdelimo v hierarhije in mreže. S pomočjo enega ali več glavnih strežnikov lahko zahteve usmerjamo in porazdelimo med različne strežnike. Obiskovalci sploh ne opazijo na katerem spletnem strežniku je bila njihova zahteva obdelana saj se vse zgodi „v ozadju“

5) Shranjevanje v predpomnilniku (caching). Sodobni spletni strežniki uporabljajo različne mehanizme in načine za „keširanje“ odgovorov. S pomočjo mehanizmov polnjenja in praznjenja predpomnilnika spletnega strežnika lahko obidemo obdelavo vseh zahtev in tste, zahteve, ki so najpogostejše obdelamo in vedno posredujemo ist rezultat iz začasnega pomnilnika.

Spletni strežnik 4 / 12

Page 5: Spletni strežnik

Oto Brglez Spletni strežnik 5 / 12

Delovanje spletnega strežnikaNe glede na to, ali gre za spletni strežnik v uporabniškem ali v jedrskem prostoru,

vedno je osnovni koncept delovanja spletnega strežnika enak. Spletni strežnik teče kot program (deamon) neprekinjeno. Ima najmanj eno programsko nit, ki posluša na „vrath“ (portu) sistema. Kadar gre za navaden HTTP protokol so to vrata 80, kadar pa govorimo o varnem HTTP protokolu, poznanem tudi kot HTTPS pa so to vrata 443. Poslušanje je izvedeno tako, da ima strežnik odprt „socket“ za vse zahteve oziroma ga po potrebi odpre. Sam spletni strežnik ne počne ničesar brez zahtev. Zahteve do spletnega strežnika pridejo preko omrežja od različnih spletnih brskalnikov. Spletni brskalniki zapišejo na socket, ki posluša na odprtem portu nekaj vrstc GET zahteve. Spletni strežnik po uspešnem prejetju in dekodiranju te zahteve zahtevo obdela in pripravi odgovor, ki ga potem spletni brskalnik prebere.

Primer enostavne zahteve:GET /index.php HTTP/1.1

Host: faks.zaba.si

Primer enostavnega odgovora ( z glavo in HTML vsebino):zbook:~ otobrglez$ curl -D - http://faks.zaba.si

HTTP/1.1 200 OK

Date: Wed, 10 Feb 2010 22:26:16 GMT

Server: Apache

Author: Oto Brglez

X-Powered-By: opalab/apache

Content-Length: 4660

Content-Type: text/html; charset=UTF-8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title> …. <!--- sledi stran --->

Spletni strežnik 5 / 12

Page 6: Spletni strežnik

Oto Brglez Spletni strežnik 6 / 12

Dinamične spletne strani in spletni strežnikiPrvi spletni strežniki so bili namenjeni nudenju statčnih spletnih strani. Povedano

drugače, na sprejeto zahtevo so odpri datoteko, ki se je nahajala fzično na disku. To datoteko so potem po delčkih poslali do odjemalca. Tak način delovanja je zelo hiter vendar zelo nepraktčen pri velikih količinah podatkov. Kadar imamo velike količine podatkov ali sistemov podatkov moramo uporabit nekakšen mehanizem za „generiranje“ strani.

Zaradi teh zahtev in težav so se pojavili spletni strežniki, ki so podpirali „dinamične spletne strani“. V prvotnih implementacijah je ob ustreznem HTTP klicu spletni strežnik pognal program, ki je na standardnem vhodu prejel posredovano zahtevo (od spletnega strežnika) potem pa je na standardni izhod zapisal „generirano“ spletno stran. Tak koncept se imenuje CGI - Common Gateway Interface. Prvi CGI sistemi so imeli v ozadju statčne programe, ki so se pognali na zahtevo. Te programe so zamenjale skripte in interpreterji.

Danes največkrat najdemo implementacijo, kjer podamo zahtevo po strani, spletni strežnik to zahtevo obdela in interpreterju pove kateri skript naj naloži. S tem dobimo dodaten abstraktni nivo, ki ga lahko dodatno optmiziramo in prilagajamo.

Naslednji korak je najverjetneje prevajanje kode, ki je sicer interpretrana. S tem lahko dodatno optmiziramo določene segmente. Skratka v naslednjih generacijah spletnih sistemov se obetajo hibridi med interiranimi stranmi in prevedenimi programi. Sistemi bodo po konceptu podobni konceptom JIT (Just in tme compilaton) iz .NET okolja.

Praktčni spletni strežnikiTrg spletnih strežnikov je danes razpršen v večini na pet spletnih strežnikov. Večina

od teh peth strežnikov pokriva vse spletne strani na internetu. Izbira spletnega strežnika je seveda odvisna od zahtev in fnančne sposobnost naročnikov.

Ponudnik Spletni strežnik Število gostovanj spletnih strani (v milijonih)

Delež

Apache Foundaton

Apache 110 54,00%

Microsof IIS 50 24,00%

Igor Sysoev Nginx 16 8,00%

Google GWS (* Apache fork)

15 7,00%

Lightpd Lightpd 1 0,00%

Tržni delež brskalnikov . Vir: Netcraf

Spletni strežnik 6 / 12

Page 7: Spletni strežnik

Oto Brglez Spletni strežnik 7 / 12

Spletni strežnik ApacheNajbolj razširjen spletni strežnik vseh časov je spletni strežnik Apache – poznan tudi

kot Apache HTTPD. Po nekaterih ocenah pokriva 110 milijonov spletnih strani, kar predstavlja kar 46,59% tržni delež. Spletni strežnik Apache je prvi spletni strežnik, ki je uspel preseči mejo 110 miljonov spletnih strani.

Tržni delež brskalnikov za obdobje od Oktobra 2005 do Januarja 2010. Vir: Netcraf

Spletni strežnik se je razvil iz spletnega strežnika NCSA HTTPd. Spletni strežnik NCSA HTTPd je za „Natonal Center for Supercomputng Applicatons“ do leta 1994 razvijal Rober McCool. Po njegovom odhodu iz tega centra so po mailu začeli krožit popravki (patchi) za izbolšavo kode. Za voljo ogromnega števila popravkov je strežnik postal zelo „patchy“ in so ga kasneje preimenovali v „Apache“. Del odločitve za to ime nosi tudi spoštovanje do Ameriških staroselcev.

Spletni strežnik je zelo primere za razvoj in delo zaradi svoje modularne zasnove, razširljivost, hitrost, preizkušenost in stabilnost. Zanj najdemo zelo različne module; med najpogostejše zagotovo spadajo mod_php, mod_perl, mod_python, fastcgi, mod_ssl, mod_proxy. Ter tudi celovite rešitve kot so memcache mod_gzip itd.

Celotna konfguracija spletnega strežnika je izvedena preko konfguracijskih datotek in struktur. Spletni strežnik nima uradnega grafčnega vmestnika.

Spletni strežnik Apache je zelo dobra izbira tudi zaradi tega, ker deluje praktčno na vseh bolj razširjenih operacijskih sistemih in platormah; tako komercialnih kot tudi odprto-kodnih.

Najboljše pri vsem tem pa je, da je spletni strežnik Apache odprtokoden in kot tak popolnoma brezplačen. Zaradi svoje odprtokodnost najdemo tudi veliko število visoko optmiziranih prilagoditev in različic (forkov).

Spletni strežnik 7 / 12

Page 8: Spletni strežnik

Oto Brglez Spletni strežnik 8 / 12

Glavni namen spletnega strežnika ni, da bi bil „najhitrejši“ spletni strežnik. Čeprav se seveda kosa z vsemi „visoko odzivnimi“ spletnimi strežniki. Namesto implementacije enotne arhitekture, strežnik zagotavlja vrsto „mult procesorskih modulov“ (MultProcessing Modules MPMs), ki mu omogočajo, da teče v procesno zasnovani, hibridni (proces in nit) ali dogodkovno-hibridnem načinu, da bolje zadost zahtevam dotčne infrastrukture. Iz tega sledi, da je izbira ustreznih MPMov za dotčno infrastukturo zelo pomembna.

Trenutna glavna različica spletnega strežnika je 2.x, ki se od različice 1.x razlikuje predvsem po implementaciji UNIXovih nit, boljši podpori za ne UNIX okolje (za Windowse), izboljšanem API-ju, in podpori IPv6. Podpora za modularnost je bila prisotna že v različici 1.x vendar je v različici 2.x bistveno izboljšana. Apache 2.x je bil izdan marca 2000 (6. aprila 2002 je bila izdana stabilna različica).

Razvoj spletnega strežnika Apache se sponzorira preko fundacije Apache. Apache fundacija poleg Apache HTTPD strežnika podpira še veliko drugih močnih in pomembnih projektov. Med temi velja omenit tudi Apache TomCat (Java Applicaton Server). Spletni strežnik napisan v Javi namenjen nudenju v Javi napisanih spletnih strani in storitev.

Spletni strežnik Internet Informaton Server (IIS)Spletni strežnik IIS za razliko od Apache strežnika ni odprto-koden in je delo

programerjev iz korporacije Microsof. IIS je drugi najbolj razširjen spletni strežnik na svetu, gostuje okoli 30% vseh spletnih strani. Podpira spletne storitve za FTP, FTPS, SMTP, NNTP ter seveda HTTP in HTTPS.

Do danes je bilo razvith 8 različic, najnovejša različica je IIS 7.5. Prva različica spletnega strežnika je bila produkt dela razvijalcev iz „European Microsof Windows NT Academic Center (EMWAC) iz Škotske. Sprva je bil strežnik navoljo kot „freeware“. Zaradi potreb Microsofa so projekt bolj podprli in so ga kasneje izdali z Windows NT 3.51.

Zadnja stabilna različica je IIS 7, ki je izšla z operacijskim sistemom Microsof Vista oziroma Microsof Windows Server 2008.

IIS ima poseben grafčni vmesnik, ki omogoča administratorjem in razvijalcem, da v grafčnem načinu nastavijo celoten strežnik.

Spletni strežnik IIS je bil z let pogostokrat tarča raznih vdorov in varnostnih težav. Pred let je bil zelo popularen „črv“ Code Red worm, ki je s pomočjo preplavitve pomnilnika „bufer overfow“ prišel do dostopa do pomnilnika operacijskega sistema in tako omogočil izvajanje nedovoljenih operacij.

Arhitektura spletnega strežnika se je z let zelo spremenila. Tako, ne najdemo več ISAPI sistema, ki je bil nadgradnja CGI modulov, ki je bil pogostokrat šibki del sistema in je povzročal resne težave.

Spletni strežnik 8 / 12

Page 9: Spletni strežnik

Oto Brglez Spletni strežnik 9 / 12

Implementacija spletnega strežnika v jeziku C

Sledi implementacija spletnega strežnika v jeziku C. Nekatere nepotrebne vrstce so odstranjene. Bolj pomembne pa so označene z rdečo barvo.

#define BUFSIZE 8096#define ERROR 42#define SORRY 43

/* Navadni log */#define LOG 44

/* Podatkovni tipi, ki jih ponujam z pripadajocimi mime nizi*/struct { char *ext; // koncnjica char *filetype; // mime tip} extensions [] = { {"jpg", "image/jpeg"}, {"png", "image/png" }, {"htm", "text/html" }, {"html","text/html" }, {0,0} };

/* Funkcija se uporablja za belezenje napak v log*/void server_log(int type, char *s1, char *s2, int num){}

/* Ta funkcija postane glavni podprocesor spletnega streznika*/void web(int fd, int hit){ int j, file_fd, buflen, len; long i, ret; char * fstr;

/* Pomnilnik za staticni file */ static char buffer[BUFSIZE+1];

/* Preberem zahtevo */ ret =read(fd,buffer,BUFSIZE);

/* Napaka pri branju zahteve brskalnika */ if(ret == 0 || ret == -1) server_log(SORRY,"napaka pri branju zahteve brskalnika","",fd); /* Ponstavstavim buffer */ if(ret > 0 && ret < BUFSIZE) buffer[ret]=0; else buffer[0]=0;

/* Odstranim znake za nove vrstice */ for(i=0;i<ret;i++) if(buffer[i] == '\r' || buffer[i] == '\n') buffer[i]='*';

server_log(LOG,"request",buffer,hit);

/* Preverba ali gre za metodo GET */ if( strncmp(buffer,"GET ",4) && strncmp(buffer,"get ",4) ) server_log(SORRY,"Podprta je samo HTTP metoda GET!",buffer,fd);

/* Ignoriranje dodatnih tributov*/ for(i=4;i<BUFSIZE;i++) if(buffer[i] == ' ') { buffer[i] = 0; break; }

Spletni strežnik 9 / 12

Page 10: Spletni strežnik

Oto Brglez Spletni strežnik 10 / 12

/* V primeru, da ni nic nastavljenokot zadnji argument potem ponastavim na index.html*/

if( !strncmp(&buffer[0],"GET /\0",6) || !strncmp(&buffer[0],"get /\0",6) ) (void)strcpy(buffer,"GET /index.html");

/* Preverba ali imamo pravice za dostop do teh tipov */ buflen=strlen(buffer); fstr = (char *)0; for(i=0;extensions[i].ext != 0;i++) { len = strlen(extensions[i].ext); if( !strncmp(&buffer[buflen-len], extensions[i].ext, len)) { fstr =extensions[i].filetype; break; } } if(fstr == 0) server_log(SORRY,"Ta tip datoteke ni podprt!",buffer,fd);

/* Napaka pri branju datoteke */ if(( file_fd = open(&buffer[5],O_RDONLY)) == -1) server_log(SORRY, "Napaka pri branju datoteke!",&buffer[5],fd);

/* Belezim vsebino, ki je bila poslana*/ server_log(LOG,"POSLANO",&buffer[5],hit);

/* 200 standardna http koda za veljaven odgovor */ sprintf(buffer,"HTTP/1.0 200 OK\r\nContent-Type: %s\r\n\r\n", fstr); if( write(fd,buffer,strlen(buffer)) < 0);

/* Posljem vsebino razdeljeno po 8KB velikih blokih*/ while ( (ret = read(file_fd, buffer, BUFSIZE)) > 0 ) if(write(fd,buffer,ret) < 0);

/* Proces zaspi */ sleep(1);} // konec web

/* Glavni program. Pozene nit in se odmakne. */int main(int argc, char **argv){

/* Obicajne spremenljivke in struktore za delo z socketi. */ int i, port, pid, listenfd, socketfd, hit; size_t length; static struct sockaddr_in cli_addr; static struct sockaddr_in serv_addr;

/* Postane neustavljivi demonski proces brez slabih "potomcev".*/ if(fork() != 0) return 0;

signal(SIGCLD, SIG_IGN); /* Napaka otrok */ signal(SIGHUP, SIG_IGN); /* Napaka obesanja terminala */

/* Zaprem vse odprte datoteke */ for(i=0;i<32;i++) close(i);

/* Nastavitev procesne skupine */ setpgrp();

/* Belezim zagon */ server_log(LOG,"Zaganjanje ",argv[1],getpid());

/* Omrezni socket */ if((listenfd = socket(AF_INET, SOCK_STREAM,0)) <0) server_log(ERROR,

Spletni strežnik 10 / 12

Page 11: Spletni strežnik

Oto Brglez Spletni strežnik 11 / 12

"sistemski klic","socket",0);

port = atoi(argv[1]);

serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(port); if(bind(listenfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) <0) server_log(ERROR,"sistemski klic","bind",0); if( listen(listenfd,64) <0) server_log(ERROR,"sistemski klic","listen",0);

for(hit=1; ;hit++) { length = sizeof(cli_addr);

/* Sprejemanje */ if((socketfd = accept(listenfd,

(struct sockaddr *)&cli_addr, &length)) < 0)

/* Fork... */ if((pid = fork()) < 0) { server_log(ERROR,"sistemski klic","fork",0); } else { if(pid == 0) { /* Otrok */ /* Zaprem socket */ close(listenfd); web(socketfd,hit); // cakam } else { /* Stars */ close(socketfd); // zaprem } } }} // konec main

Implementacija spletnega strežnika v PythonuSledi implementacija spletnega strežnika v jeziku Python. Uporabljen je Twisted

„framework“.

from twisted.web.resource import Resource

class Foo(Resource): def render(self, request): return "<html>hello world</html>"

resource = Foo()

Spletni strežnik 11 / 12

Page 12: Spletni strežnik

Oto Brglez Spletni strežnik 12 / 12

Viri in literatura1) Web Server – Wikipedia

htp://en.wikipedia.org/wiki/Web_server2) Apache Web Server – Wikipedia

htp://en.wikipedia.org/wiki/Apache_HTTP_Server3) Internet Informaton Services – Wikipedia

htp://en.wikipedia.org/wiki/Internet_Informaton_Services4) nweb: a tny, safe web server (statc pages only) – IBM

htp://www.ibm.com/developerworks/systems/library/es-nweb/index.html5) Twisted-Examples – Python.org

htp://wiki.python.org/moin/Twisted-Examples6) CERN HTTPd – Wikipedia

htp://en.wikipedia.org/wiki/CERN_htpd7) Januar 2010 Web Server Survey – Netcraf

htp://news.netcraf.com/archives/2010/01/07/january_2010_web_server_survey.html

Spletni strežnik 12 / 12