IIS 7 pro PHPčkáře

Jednou z novinek Internet Information Server 7.0 je modul FastCGI vyvinutý ve spolupráci se společností Zend, který je určen pro plnohodnotný běh PHP aplikací na Windows Server 2008. Tento modul lze doinstalovat i do IIS 6.0 ve Windows Server 2003. Proč ale provozovat PHP aplikace na Windows Server, když je tu Linux?

Začneme asi tím, na co se většina PHP programátorů zeptá hned na začátku: Proč Windows Server 2008 a IIS 7, když je tu Linux a Apache, navíc zadarmo. Odpověď bude, pro někoho možná překvapivě, netechnická.

Situace 1

Jste malá firma, která poskytuje služby spojené s některou z existujících PHP aplikací. Osloví vás potenciální zákazník, který chce začít provozovat firemní blog. Vy nabídnete Drupal a firma, která stojí s nabídkou proti vám, nabídne Dotnetnuke (běžící na ASP.NET).

Pro koho se asi rozhodne zákazník, pokud má jeden jediný server, na kterém provozuje Windows Server 2008? Pořídí si další HW a konektivitu pro Linux server a bude vám, kromě správy a úprav aplikace Drupal, ještě platit za správu Linuxového serveru, pro kterého nemá správce, nebo si raději vybere konkurenci, které bude platit jen za správu a úpravy aplikace Dotnetnuke, protože běží na IIS?

Situace 2

Chcete začít hostovat webové aplikace pro lokální firmy, které si stěžují, že velcí hosteři nejsou schopni reagovat dostatečně flexibilně na jejich požadavky. Omezíte se jen na PHP, když můžete na Windows Server 2008 plnohodnotně hostovat oboje?

Jedna z nejčastějších otázek se týká dostupnosti „mod_rewrite“ pro IIS. Takový modul skutečně existuje, umí importovat pravidla mod_rewrite z Apache, je zadarmo a popíšeme si jej o něco dále. Kromě toho si podobný modul (podstatně jednodušší) zkusíme vytvořit sami.

Zprovoznění podpory PHP na IIS 7

Podpora PHP, tedy modul FastCGI, je standardní součástí IIS 7 na Windows Server 2008 a na Windows Vista SP1. Stačí zapnout podporu CGI pro IIS:

Windows Vista: Start – Ovládací panely – Programy – Zapnout nebo Vypnout funkce systému Windows

Zapnutí PHP na IIS

Windows Server 2008: Povolit roli „Web Server (IIS)“

Zapnutí PHP na IIS

Dále je potřeba stáhnout instalaci PHP z www.php.net. V době psaní tohoto článku se jednalo o verzi 5.2.6 Non-thread-safe pro Win32 a samozřejmě PECL 5.2.6 Non-thread-safe pro Win32. PHP nainstalujete běžným způsobem. Já používám verzi bez instalátoru, kdy PHP jen rozbalím do vybraného adresáře. Další krok je konfigurace FastCGI modulu, aby věděl, kde se nachází PHP. Než si vysvětlíme jak to udělat, je třeba si vysvětlit jak funguje IIS 7 a jak se konfiguruje.

Základy konfigurace IIS 7

IIS 7 sestává z mnoha modulů. Každý z nich se stará o nějakou základní činnost, např. autorizaci uživatele, a vstupuje do hry v různých okamžicích života požadavku klienta, např. před odesláním hlaviček protokolu HTTP, a může být vázán na konkrétní typ souboru, např. modul FastCGI je vázán na soubory s příponou *.php.

Pokud je modul mapován na konkrétní typ souboru, tak se označuje jako handler. Po instalaci IIS 7 máte k dispozici několik desítek modulů, které ale nemusí vaše aplikace používat. Pokud kupříkladu naše aplikace nepoužívá pro přihlašování Windows doménu, je zbytečné mít v ní povolen modul WindowsAuthen­tication.

IIS 7 má globální konfigurační soubor, který obsahuje výchozí nastavení webového serveru a v něm běžících aplikací. Každá aplikace má pak svůj vlastní konfigurační soubor, kterým v podstatě „přepisuje“ výchozí nastavení webového serveru IIS 7. Samozřejmě ne vše je možné měnit na úrovni aplikace.

Konfigurační soubory využívají formát XML, proto je můžete měnit jak ručně pomocí libovolného textového editoru, tak pomocí konzole pro správu IIS 7. Globální konfigurace je uložena v souboru %windir%system32inetsrvconfigapplicationhost.config (odpovídá httpd.conf pro Apache) a musíte mít administrátorská práva pro jeho editaci. Aplikace pak obsahuje ve svém kořenovém adresáři soubor web.config (obdoba .htaccess pro Apache), který nastavuje konfiguraci pro danou webovou aplikaci.

Spuštění první PHP aplikace pod IIS 7

Už jsme si stručně vysvětlili, jak vypadá konfigurace IIS 7, co jsou to moduly a co jsou to handlery. Můžeme přistoupit ke spuštění první PHP aplikace. V libovolném adresáři si vytvořte PHP soubor, do kterého vložíte oblíbenou funkci pro testování PHP phpinfo(). Do tohoto adresáře musí mít přístup IIS 7.

Další vlastností IIS od verze 6 jsou tzv. Application Pools. Jde o skupinu aplikací, které běží pod stejnou identitou a jsou izolované od ostatních Application Pools. Standardně máte vytvořen DefaultAppPool a Classic .NET AppPool. Oba využívají identitu NetworkService. Pro testování mám připraven adresář, kam má přístup identita Everyone, tím pádem i libovolný Application Pool pod IIS.

Oprávnění v IIS

Nyní přidáme do IIS 7 virtuální adresář směřující na adresář s naším vytvořeným souborem.

  1. Spustíme konzolu pro správu IIS 7.
  2. Přidáme novou aplikaci na náš lokální IIS 7.
    Přidáme aplikaci do IIS
  3. Nastavíme alias a fyzickou cestu k našemu testovacímu adresáři (v našem případě mapujeme alias php na cestu C:tempwwwrootphptest):
    Nastavení aliasu v IIS
  4. Dále musíme přidat podporu PHP. V podstatě musíme připojit modul FastCGI na příponu PHP a nastavit cestu k instalaci PHP. Dvakrát kliknete na ikonu Mapování obslužných rutin a v pravém sloupci vyberete akci Přidat mapování modulů.
    Mapování modulů v IIS
  5. Nyní již stačí otevřít náš testovací PHP skript v prohlížeči:
    Spuštění testovacího skriptu

Když se nyní podíváte do adresáře s PHP skriptem, najdete v něm nový soubor web.config s následujícím obsahem:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="PHP" path="*.php" verb="*" modules="FastCgiModule"
                 scriptProcessor="C:phpphp-cgi.exe" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
</configuration> 

Soubor definuje mapování přípony *.php na modul FastCgiModule. Tento soubor můžete vytvořit i ručně. Není nutné použít konzolu pro správu IIS 7, jako jsme použili před chvílí my.

Jak jsem již psal, není potřeba mít zavedené všechny moduly a handlery, které se nacházejí ve výchozí konfiguraci IIS 7. Vyházení zbytečných modulů a handlerů můžete udělat pomocí konzole pro správu IIS nebo editací web.config. Jaké moduly můžete vyházet závisí na tom, jaké služby IIS 7 (cache, autorizaci, logování, URL rewrite, …) chcete využívat. Tyto služby jsou v podstatě nezávislé na aplikaci.

U handlerů je to jednodušší, protože potřebujete jen handler pro PHP soubory (maska *.php) mapovaný na FastCGI modul a handler pro statické soubory (maska *) mapovaný minimálně na StaticFile modul. Výchozí mapování statických souborů ještě zahrnuje moduly DefaultDocumen­tModule a DirectoryListin­gModule.

Modul URL Rewrite

Tento modul není standardní součástí instalace IIS 7 a je třeba ho stáhnout. Po instalaci můžete modul konfigurovat buď přes konzolu IIS 7 nebo opět pomocí ruční editace souboru web.config ve vaší aplikaci.

  1. Ve stromu webů najděte a vyberte vaši aplikaci
  2. Dvakrát klikněte na konfiguraci modulu URL Rewrite
    Přidání modulu rewrite
  3. Zobrazí se seznam pravidel, zatím prázdný
  4. Vyberte Add Rules…
    Přidání rewrite pravidel
  5. Vyberte pravděpodobně nejčastěji používané „User friendly URL“.
    User friendly URL
  6. Pravidlo si můžete nechat vygenerovat automaticky. Stačí vložit současné volání stránky a konfigurační utilita vám nabídne různé varianty pravidla. Také si můžete nechat vygenerovat „reverzní“ pravidlo, které přesměruje původní volání na „User friendly“.
    Přidávání rewritovacích pravidel
  7. Po kliknutí na OK je pravidlo vytvořené. Nyní si můžete prohlédnou změny v souboru web.config a pravidlo vyzkoušet.

Pokud migrujete existující aplikaci z Apache na IIS 7 a máte již hotová pravidla pro mod_rewrite, můžete tato pravidla naimportovat pomocí volby Import rules…

Import rewritovacích pravidel

Pak již stačí otevřít soubor s pravidly pro migrovanou aplikaci a provést import. Na následujícím obrázku je import .htaccess pro Drupal:

Import rewritovacích pravidel Drupalu

Nyní si ukážeme vytvoření vlastního modulu.

Jak si vytvořit vlastní modul?

Jednoduše. Stačí vytvořit třídu v .NET, která implementuje rozhraní System.Web.IHttpModule. Každý modul vstupuje do hry při vyvolání příslušné události IIS 7 serveru. Seznam událostí a jejich popis najdete v dokumentaci. Podle toho, kdy potřebujete do zpracování požadavku (HTTP requestu) vstoupit, si vyberete příslušnou událost, v které modifikujete požadavek podle potřeby. Nezapomeňte si uvědomit, že pokud v požadavku něco změníte, další modul dostane pouze změněný výsledek a nemá šanci zjistit původní verzi požadavku.

  1. Spusťte Visual Studio 2008 SP1
  2. Vytvořte webový projekt pro testování.
  3. Přidejte nový projekt typu Class Library do Solution.
  4. Přidejte referenci na knihovnu System.Web.
  5. Třída musí implementovat IHttpModule. Editor vám automaticky nabídne vytvoření metod rozhraní.
    Implementace IHttpModule
  6. V metodě Init (součást implementace rozhraní IHttpModule) si zaregistrujte příslušnou událost. Visual Studio vám opět pomůže s implementací handleru události:
    Metoda Init
  7. V kódu pro obsloužení události změňte požadavek dle potřeby.

Ukážeme si výpis ukázkového modulu SimpleUrlRewrite v jazyce C# (provádí jednoduchý rewrite URL naší aplikace):

using System;
using System.Text.RegularExpressions;
using System.Web;

namespace SimpleRewriteModule
{
    public class SimpleModRewrite : IHttpModule
    {
        Regex rx = new Regex("Kategorie/(.*).aspx", RegexOptions.IgnoreCase);

        public void Dispose() {}

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            // získání požadavku klienta
            HttpContext c = ((HttpApplication)sender).Context;

            Match m = rx.Match(c.Request.Path);

            if (!m.Success)
            {
                return;
            }

            string rewrite = rx.Replace(c.Request.Path, "Default.aspx?category=$1");
            c.RewritePath(rewrite);
        }
    }
} 

Testovací web musí mít nastavenu referenci na projekt s modulem. Do konfiguračního souboru pak stačí přidat odkaz na modul v sekci  <system.webServer>.<modules>.

<add name="SimpleRewriteModule" preCondition="managedHandler"
     type="SimpleRewriteModule.SimpleModRewrite"/> 

Generic Handler

Další zajímavou funkcí, která umožňuje snadno kombinovat PHP aplikace s ASP.NET, jsou tzv. GenericHandlers, které se používají typicky v situaci, kdy výstupem nemá být HTML, ale plain text, JSON apod. Jedná se o třídu, která implementuje rozhraní System.Web.IH­ttpHandler a je uložena v souboru s příponou ashx. Rozhraní IHttpHandler obsahuje metodu ProcessRequest, která je zavolána při spuštění handleru. Za obsah odpovědi jste v tomto případě komplet zodpovědní vy sami, proto musíte nastavovat i hlavičky HTTP odpovědi, zejména hlavičku Content-Type, abyste určili MIME odpovědi:

context.Response.ContentType = "text/xml"; 

Data zapisujete přímo do streamu odpovědi ( Response), který získáte z objektu HttpContext. Jednoduchá ukázka generování textového souboru:

public class Hello : IHttpHandler
{
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
} 

Závěr

PHP na IIS 7 funguje a jeho použití má svůj smysl. Snadno můžete kombinovat výhody PHP a ASP.NET a nejste omezeni jen na jednu platformu pro vývoj webových aplikací. Další užitečné informace najdete na oficiálních stránkách IIS a také bych vám doporučil článek Enhance Your Apps with the Integrated ASP.NET Pipeline z MSDN Magazine, v kterém najdete popis dalších modulů IIS 7 serveru a jejich možnou spolupráci s PHP aplikacemi.

Kód probíraný v článku si můžete stáhnout: IIS a PHP (ZIP 43352 bytů)


Autorem článku je Štěpán Bechynský, specialista pro vývojové nástroje ve společnosti Microsoft v České republice. Informace pro vývojáře také najdete na blogu odborníků z českého Microsoftu.

Provozovali byste PHP na IIS?

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 40

Přehled komentářů

petr.steinbauer phpinfo
Mireczech Prava
Anonym Re: Prava
Borek Bernard Web Platform Installer
luki.sk apache + php
Borek Bernard Re: apache + php
nbusr Re: apache + php
Standa Re: apache + php
Anonym Re: apache + php
webdev Re: apache + php
dc poznamocka
Borek Bernard Re: poznamocka
jurasek Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
texis Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Stefan Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
djanosik Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Anonym Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Jarda Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
broukoid tahnete s temahle srackama z rootu pryc!
Martin Hassman Re: tahnete s temahle srackama z rootu pryc!
Borek Re: tahnete s temahle srackama z rootu pryc!
Peter Re: tahnete s temahle srackama z rootu pryc!
JumBo Re: tahnete s temahle srackama z rootu pryc!
D.A.Tiger Re: tahnete s temahle srackama z rootu pryc!
D.A.Tiger Re: tahnete s temahle srackama z rootu pryc!
Martin Hassman Re: tahnete s temahle srackama z rootu pryc!
D.A.Tiger Re: tahnete s temahle srackama z rootu pryc!
JR Re: tahnete s temahle srackama z rootu pryc!
Láďa Re: tahnete s temahle srackama z rootu pryc!
dc Re: tahnete s temahle srackama z rootu pryc!
broukoid Re: tahnete s temahle srackama z rootu pryc!
Anonym Re: tahnete s temahle srackama z rootu pryc!
nbusr RE: IIS 7 pro PHPčkáře
Ded Kenedy at zije GUI
//R Práva?!?
Krtek VMware...
Martin Hassman Re: VMware...
Zdroj: https://www.zdrojak.cz/?p=2880