**Common Gateway Interface** (CGI) on verkkosovellusten tekniikka, jonka palvelimella suoritettava CGI-ohjelma tuottaa verkkosivun selainohjelmalle. CGI määrittää rajapinnan palvelimella ajettavalle *CGI-skriptille*.

Havainnekuva CGI-ohjelman sijainnista.
CGI syntyi Rob McCoolin, John Franksin, Ari Luotosen, George Phillipsin ja Tony Sandersin www-talk-postituslistalla käymien keskustelujen tuloksena.
NCSA:lla työskentelevä McCool teki standardin ensimmäisen version ja mallitoteutuksen NCSA HTTPd -palvelinta varten käyttäen tiedon välitykseen Web-palvelimen ja käynnistettävän prosessin välillä ympäristömuuttujia.

Web-palvelimen näkökulmasta CGI toimii siten, että tietyt URL-osoitteet on määritetty suoritettavaksi ajettavina ohjelmina (esimerkiksi `http://www.example.com/wiki.cgi?page=etusivu`) Kun tätä URL:ia haetaan selaimella, vastaavaa ohjelmaa (wiki.cgi) kutsutaan. Ohjelmalle annetut parametrit välitetään suoritettavalle CGI-ohjelmalle. Ohjelman tuottama tuloste kerätään web-palvelimella ja lähetetään asiakasohjelmalle (selaimelle) HTTP-protokollan vaatimien otsikkotietojen jälkeen.

CGI on kieliriippumaton. Aluksi CGI:ssa käytettiin yleisesti Shell-skriptejä. Näitä on kuitenkin erittäin vaikea toteuttaa turvallisesti, joten Webin yleistyessä CGI-ohjelmien tekoon käytettiin useimmin Perl-kieltä. Erilaiset komentosarjakielet, kuten Python, Ruby, PHP ja TCL ovat edelleen suosituimpia.

Ongelmat ja seuraajat
---------------------

Koska CGI-tekniikka käynnistää joka kerta fork() -systeemikutsulla uuden prosessin suoritettavaksi, ja tämä on useimmissa käyttöjärjestelmissä raskas operaatio, palvelimen kuormitus kasvaa nopeasti. Tämä vuoksi on kehitetty edelleen tehokkaampia tekniikoita, joissa komentosarjakieli on sisällytetty web-palvelimeen.

Näistä yksi ensimmäisiä oli Netscape NSAPI (Netscape Server Application Programming Interface) Netscape Enterprise Server -palvelinta varten.
Open Market -yhtiö kehitti NSAPI:n kilpailijaksi FastCGI-tekniikan 1990-luvun puolivälissä. Tässä prosessi pysyy koko ajan käynnissä ja kommunikoi web-palvelimen kanssa Unix domain socketin kautta. Useat palvelimet tukevat tätä protokollaa. Tätä käytettäessä skripti on kirjoitettava tietyllä tavalla tukemaan palvelinta.
Apachelle on olemassa mod\_perl-moduuli, jolla Perl-skriptit saa siirrettyä palvelimessa toteutettavaksi.
PHP:ta voi käyttää joko CGI-skriptien ajamiseen tai palvelimen moduulina.

Eräät palvelimet, esimerkiksi nginx eivät forkkaa uutta prosessia pyynnön käsittelyyn, vaan käyttävät yhtä säiettä. nginx ei tue lainkaan CGI-ohjelmia, vain FastCGI-tyyppisiä skriptejä, joissa skriptit ajetaan koko ajan käynnissä pysyvässä erillisessä prosessissa, jonka kanssa palvelin keskustelee Unix domain socketin kautta.

Esimerkki CGI-ohjelmasta
------------------------

Esimerkki CGI-ohjelmasta Perlillä. Ohjelma on kirjoitettu Unix-ympäristöön. Ajattava ohjelma sijoitetaan tyypillisesti cgi\_bin-nimiseen hakemistoon käyttäjän kotihakemistoon ja sille on annettava suoritusoikeudet. Lisäksi web-palvelimella on asetettava päälle käyttäjien CGI-ohjelmat.

Ohjelma tulostaa HTTP-protokollan otsikoihin kuuluvan rivin, joka kertoo sisällön MIME-tyypin. Palvelinohjelmisto tulostaa oletettavasti ennen käyttäjän CGI-ohjelmaa omia otsikkotietojaan. Otsikon jälkeen on kaksi rivinvaihtoa (\n), mikä kertoo otsikkojen päättyvän ja varsinainen sisältö alkaa.

```
#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><body>Hello, world.</body></html>";

```

Katso myös
----------

* PHP
* ASP
* Perl
* HTTP

Lähteet
-------

1. ↑  The WWW Common Gateway Interface Version 1.1 16th October 1995. David Robinson. Acknowledgements
2. ↑  q.w. nginx
3. ↑

Aiheesta muualla
----------------

*