september 29th, 2007Skrivnost večih IIS virtualnih serverjev na Windows XP Pro
Virtual server, Virtual Host??
Apache[1], je kot web strežnik odigral ključno vlogo v razvoju World Wide Web-a. Deset let nazaj je bil najbolj popularen HTTP server na svetu. Pred dobrim letom, dve pa je počasi začel izgubljati delež trga, predvsem zaradi IIS[2] ter .NET platforme. Trenutno Apache servira 50% vseh spletnih strani, IIS pa 34%. Dost je statistike, preidimo na stvar.
Da na eni “mašini” laufa več spletnih strani[3] je nekaj samoumevnega. Pri razvoju “web aplikacij” želimo, da objava spletne strani na “produkcijskem” strežniku poteka s čim manj zapleti. To najlažje dosežemo tako, da razvojno okolje čimbolj približamo produkcijskemu. Ta korak od nas zahteva zagon večih spletnih aplikacij na lokalni “mašini”. Praksa ki to omogoča se v Apache-ju imenuje “Virtual Host“. Kako konfiguriramo Apache za podporo virtual hostingu bom razložil kdaj drugič ;)
Microsoftov odgovor na Apache Virtual Host je Virtual Server. Tako kot pri Apache virtual hostih ima vsak virtual server na IISu svojo domeno in IP naslov[4]. Apache-jev “named-based” virtual host IIS podpira na isti način le da se ta propagira skozi imena “host headerjev”.
Ena izmed glavnih razvojnih značilnosti na katero je Microsoft pozabil pri “koraku” iz Windows 2000 Workstation na Windows XP Pro je zmožnost zagona večih virtualnih serverjev na eni mašini. Pravzaprav so fantje iz Microsofta onemogočili (skrili) element v meniju IIS Managment Console, ki omogoča kreiranje novih virtualnih serverjev. Za spletnega razvijalca, ki izdeluje in skrbi za nešteto aplikacij[5] je ta omejitev precej nadležna. Čeprav lahko teoretično kreiramo novo spletno stran pod privzetim spletnim serverjem[6], predstavlja to bolj problem kot rešitev. Nova spletna stran se mora zavedati te “kompenzacije poti” ko naslavlja sama sebe z uporabo absolutnih ali relativnih poti. Prednost novega in neodvisnega virtualnega serverja je v tem da sam prepozna svoj lasten virtualni “root” in poti.
Kajti ti bo Windows XP Pro saj imamo Windows Visto!
Res je. Navajam le dva argumenta, ki podpirata objavo tega prispevka:
- Windows XP so po uporabi še vedno daleč v ospredju. Samo eden od desetih razvijalcev[7], ki uporabljajo IIS bo ta članek prezrl ;)
- Za razvoj aplikacij v Visti potrebujemo ultra-super-duper hudo mašino, saj si bo že sam operacijski sistem rezerviral skoraj 3/4 prostega pomnilnika. Pri samem razvoju naletimo na kopico težav. Največ preglavic dela Vistin “ownership”, saj je potrebno za vsako stvar, ki ne lauafa pod IIS IUSR uporabniškim računom[8] eksplicitno prevzeti lastništvo.
Skrivnost
Kakorkoli obstaja alternativna rešitev, čeprav je rahlo nerodna. Kot sem že prej omenil je možnost kreiranja večih virtualnih serverjev le skrita, ni pa čisto odvzeta. Čeprav ne moremo ustvarit novega virtualnega serverja preko MMC-ja, lahko uporabimo administracijske skripte ki so v standardnem paketu IIS-a[9]. Virtualni serverji IIS-a so definirani v tako imenovai “IIS metabase” kot številčni vnosi pod W3SVC ključem.[10]
Da bi ustvarili nov virtualni server, odprite “command window”[11] in vpišite naslednje:
C:\Inetpub\AdminScripts> adsutil.vbs create_vserv W3SVC/2 C:\Inetpub\AdminScripts> adsutil.vbs copy W3SVC/1 W3SVC/2
Če prvič zaganjate adsutil.vbs vas bo sistem opozoril, da omenjena skripta ne deluje v WScriptu. V naslednjem pogovornem oknu pritisnite Yes in zadeva je rešena.
![]()
Prvi ukaz kreira nov virtualni server v IIS metabase
![]()
Drugi ukaz prekopira vse potrebne meta podatke iz prizvete spletne strani v novo spletno stran, ter s tem omogoči njeno pravilno delovanje.
S tem ko prekopiramo meta podatke iz stare spletne strani v novo, nova stran podeduje vse atribute stare strani, vključno z imenom. Seveda želimo da nov virtualni strežnik servira novo aplikacijo in s tem moramo poleg imena spremeniti še ostale parametre kot so “root” direktorij, host header ime, …
Let the magic begin
Razvojne spletne aplikacije ponavadi poganjamo na lokalni mašini. Brskalnik moramo prepričat da web stran ne išče po spletu, ampak jo naj naloži iz domačega serverja. To storimo z vnosom “hostname” v datoteko hosts[12]. Ta datoteka mapira ime hosta na določen IP naslov[13].
![]()
Za naš tutorial v datoteko dodajmo: www.foo-localhost.com in www.bar-localhost.com.
![]()
Na disku naredimo še dva direktorija z imenoma hostov za root direktorij posamezne spletne strani.
Odprimo MMC, opazili boste rdečo ikono – križec poleg novega virtualnega strežnika. To je normalno. Pomeni le da je proces inetinfo.exe želel zagnati ta novi virtualni server.
V čem je fora?
“Catch” je v tem, da kljub temu da lahko ustvarimo več virtualnih Web serverjev na eni Windows XP Pro mašini, lahko neankrat zaganjamo le eno, he he. :) Mene osebno to ne moti, saj naenkrat namenim dnevno več ur le enemu projektu, da je čimmanj miselnih preskokov od enega problema do drugega. Vrnimo se našemu tutorialu. Za testiranje virtualnih serverjev bomo v root direktorij[14] vsake od aplikacije dodali datoteko default.asp z naslednjo vsebino:
<%@ CodePage=65001 Language="VBScript"%>
<% OPTION EXPLICIT %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><%Response.Write(Request.ServerVariables("server_name"))%></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div class="container">
<h2>Some Server ASP Variables</h2>
<p>
<b>Your IP address is:</b>
<%Response.Write(Request.ServerVariables("remote_addr"))%>
</p>
<p>
<b>The server's domain name:</b>
<%Response.Write(Request.ServerVariables("server_name"))%>
</p>
<p>
<b>The http host name:</b>
<%Response.Write(Request.ServerVariables("http_host"))%>
</p>
<p>
<b>Application Md path:</b>
<%Response.Write(Request.ServerVariables("appl_md_path"))%>
</p>
<p>
<b>Application Physical path:</b>
<%Response.Write(Request.ServerVariables("appl_physical_path"))%>
</p>
</div>
</body>
</html>
Ostane nam še, da skonfiguriramo vsakega od virtualnih serverjev. Odprimo MMC, z miško se postavimo na ime enega od virtualnih serverjev in z desno tipko izberemo Properties:
- vpišimo ime virtualnega serverja – Description: Foo
- kliknemo gumb Advanced – Advanced Multiple Web Site Configuration
- dvokliknemo na Default, da se odpre Advanced Web Site Identification – vpišemo Host Header Name: www.foo-localhost.com
- izberemo zavihek Home Directory in nastavimo Local Path – F:\www\www.foo-localhost.com
- preverimo samo še zavihek Documents, če vsebuje med privzetimi dokumenti default.asp
Enako skonfiguriramo še drug virtualno strežnik. Preostane nam le da stestiramo ali vse skupaj “klapa”. Ne pozabimo da naenkrat lahko zaganjamo samo enega od obeh dveh! V MMC-cu ju ugasnemo/prižgemo[15] ustrezen virtualni strežnik ter v preiskusimo delovanje v brskalniku:
![]()
Virtualni server Foo – www.foo-localhost.com
![]()
Virtualni server Bar – www.bar-localhost.com
Omeniti velja še, da nezmožnost zaganjanja večih virtualnih serverjev neankrat velja le za IIS 5.1 na Windows XP Pro. Da ne bo kdo dobil zmotnega prepričanja da se isti problem pojavlja pri IIS 6 in Windows Server 2003 ;)
Med preklapljanjem virtualnih serverjev na lokalni mašini, bodite pozorni na izgubo aktivne seje in podatkov trenutno aktivnega virtualnega serverja. Naš glavni namen ostaja isti. Čimbolj približati razvojno okolje produkcijskemu, ter razvoj večih spletnih strani, brez odvečnih skrbi o tem kako bo treba obravnavat absolutne in relativne URL poti v izvorni kodi.
Happy blogging(coding)!
- upam da mi ni treba na drobo razlagat kaj to je ;) [↩]
- Microsoft Internet Information Services [↩]
- npr. www.podjetje1.com in www.podjetje2.com [↩]
- lahko je tudi enak [↩]
- za prijatelje, kolege in podjetja [↩]
- kot “child path” new->Virtual Directory [↩]
- če zaokrožimo 6% na 10% :) [↩]
- če razvijamo v klasičnemu ASP-ju [↩]
- C:\Inetpub\AdminScripts [↩]
- privzeti “Web site” je poimenovan W3SVC/1, naslednji ustvarjeni bo poimenovan W3SVC/2 itd. [↩]
- Pritisnemo tipko Windows+R, ki odpre Run kamor vtipkamo cmd ter pritisnemo enter. [↩]
- V windowsih jo najdete v C:\WINDOWS\system32\drivers\etc [↩]
- Za localhost je to 127.0.0.1 [↩]
- F:\www\www.bar-localhost.com in F:\www\www.foo-localhost.com [↩]
- desna tipka Stop/Run [↩]