/ / Prečo by som sa mal vyhnúť používaniu CGI? - rubín, cgi, fastcgi

Prečo by som sa mal vyhnúť používaniu CGI? - rubín, cgi, fastcgi

Snažil som sa vytvoriť moje webové stránky pomocou CGI a ERB, ale keď hľadám na webe, vidím ľudí, ktorí hovoria, že by som sa mal vždy vyhnúť používaniu CGI, a vždy používať Rack.

Chápem, že CGI rozdelí veľa procesov Ruby, ale ak použijem FastCGI, vytvorí sa iba jeden pretrvávajúci proces, ktorý je tiež prijatý na webových stránkach PHP. Plus FastCGI rozhranie vytvoriť len jeden objekt pre jednu požiadavku a má veľmi dobrý výkon, na rozdiel od Rack, ktorý vytvára 7 objektov naraz.

Existuje nejaký konkrétny dôvod, prečo by som nemal používať CGI? Alebo je to len falošný predpoklad a je úplne v poriadku použiť CGI / FastCGI?

odpovede:

1 pre odpoveď č. 1

CGI, čím mám na mysli aj rozhranie aspoločné programovacie knižnice a praktiky okolo neho boli napísané v inom čase. Má zobrazenie spracovateľov žiadostí ako odlišných procesov pripojených k webserveru prostredníctvom premenných prostredia a štandardných tokov I / O.

Toto bolo najmodernejšie v jeho deň, kedy v skutočnosti neboli "webové rámce" a "embedded serverové moduly", ako o nich dnes myslia. Tak ...

Model CGI opäť prináša nový proces na jedno spojenie. Počas procesov rozmnožovania per se je lacné v týchto dňoch, ťažké inicializácie webových aplikácií - čítanie a analýza skóre modulov, vytváranie databázových spojení atď. - robí to dosť drahé.

CGI má tendenciu k dizajnu s nízkou úrovňou (IMHO)

Opäť platí, že model CGI výslovne uvádzapremenné prostredia a štandardný vstup ako rozhranie medzi požiadavkou a obsluhou. Ale koho to zaujíma? To je oveľa nižšia úroveň ako návrhár aplikácií by mal vo všeobecnosti premýšľať.Ak sa pozriete na knižnice a kód založený na CGI, uvidíte, že väčšina z neho podporuje "obchodnú logiku" hneď vedľa parsovania a HTML generácie, ktoré je teraz vnímaná ako nebezpečné miešanie obáv.

Kontrast s niečím ako Rack ::Builder, kde hneď kodér myslí na mapovanie menného priestoru na akciu a čo to znamená pre širšiu webovú aplikáciu. (Náhle môžeme diskutovať o sémantickom webe a o čnostiach RESTu a to a to, pretože nerozmýšľame nad generovaním rádiových tlačidiel založených na vstupoch dodávaných používateľmi.)

Áno, niečo ako Rack :: Builder by mohlo byť implementované na vrchole CGI, ale to je bod. Musí to byť vrstva abstrakcie postavená na vrchole CGI.

CGI má tendenciu úškrne odmietnuť

Aj napriek tomu, že CGI funguje dokonale v rámci svojhonapriek tomu, že je jednoduché a všeobecne známe, CGI je často zamietnutá. Aj vy by ste mohli byť prepustení, ak je CGI všetko, čo poznáte.


1 pre odpoveď č. 2

Nepoužívajte CGI, prosím, nezostávajte to. Späť v deväťdesiatych rokoch, kedy nikto nevedel lepšie, sa zdalo byť dobrý nápad, ale to bolo, keď sa skripty boli zriedkavé, používali sa v špeciálnych prípadoch, ako je spracovávanie formulárov, nie riadenie celých stránok.

FastCGI je pokus o "lepšiu CGI", ale je stále nedostatok veľkého počtu spôsobov, hlavne preto, že musíte spravovať pracovné procesy FastCGI.

Rack je oveľa lepší systém a funguje to veľmi dobre. Ak používate rack, máte širokú škálu hostingových systémov na výber, dokonca cestujúci čo je naozaj jednoduché a spoľahlivé.

Neviem, čo to znamená, keď hovoríte, že Rack vytvára "7 objektov naraz", pokiaľ nemáte na mysli, že existujú 7 rôznych Rack procesov, ktoré nejako prebiehali, alebo ste urobili chybu vo vašej implementácii.

Nemôžem myslieť na jedinú inštanciu, kde by CGI bolo lepšie ako ekvivalent Rack.


0 pre odpoveď č. 3

Existuje veľa zmätok o tom, čo CGI, Rack atď. Ako popisujem tu, Rack je API a FastCGI je protokol. CGI je tiež protokolom, ale vo svojom úzkom zmysle aj implementácia a to, o čom hovoríte, nie je vôbec to isté ako FastCGI. Takže začneme s pozadím.

Späť na začiatku 90. rokov webové servery jednoducho čítalisúbory (HTML, obrázky, čokoľvek) z disku a odoslali ich klientovi. Ľudia začali chcieť robiť nejaké spracovanie v čase podania žiadosti a skoré riešenie, ktoré vyšlo, bolo spúšťať program, ktorý by priniesol výsledok poslaný späť klientovi, a nie len čítať súbor. "Protokolom" bolo, aby webový server dostal adresu URL, ktorá bola nakonfigurovaná tak, aby bola vykonaná ako program (napr. /cgi-bin/my-script), kde by webový server potom nastavil súborpremenných prostredia s rôznymi informáciami o žiadosti a spúšťať program s telom požiadavky na štandardnom vstupe. Toto bolo označené ako "Bežné rozhranie brány. "

Vzhľadom k tomu, že to odrazí nový proces pre každéhožiadosť, je to jednoznačne neefektívne a takmer určite nechcete používať tento štýl dynamického spracovania žiadostí na webových stránkach s vysokým objemom. (Spustenie úplne nového procesu je relatívne drahé v oblasti výpočtových zdrojov.)

Jedným z riešení na zefektívnenie je,skôr než začať nový proces, pošlite informácie o žiadosti do existujúceho procesu, ktorý už beží. "To je to, o čom je FastCGI, udržuje veľmi podobné rozhranie s CGI (máte súbor premenných s väčšinou informácií o požiadavke , a tok dát pre telo požiadavky) Ale namiesto nastavenia aktuálnych Unix premenných prostredia a spustenie nového procesu s telom na stdin, pošle požiadavku podobnú požiadavke HTTP na server FCGI, ktorý už beží na stroji, kde určuje hodnoty týchto premenných a obsah žiadosti.

Ak je webový server schopný nejako vložiť programový kód, stáva sa to ešte efektívnejšie, pretože práve spúšťa samotný kód. Dva klasické príklady toho, ako by ste to mohli urobiť, by boli:

  • Mať PHP vložený do Apache, takže "Apache server kód" len volá "PHP serverový kód", ktorý je súčasťou toho istého procesu, a

  • Nepoužívajte Apache vôbec, ale napíšte webový server v Ruby (alebo Pythone alebo inom) a načítajte a spustite viac kódov Ruby, ktoré boli prispôsobené na spracovanie žiadosti.

Takže kde to Rack príde na to? Rack je API ktorý umožňuje kód, ktorý spracováva webové žiadosti, ho prijímať bežným spôsobom bez ohľadu na webový server. Ak daný kód Ruby spracuje žiadosť, ktorá používa rozhranie Rack API, webový server môže:

  • Buďte webový server Ruby, ktorý jednoducho vykonáva funkčné volania vo svojom vlastnom procese na kód, ktorý je kompatibilný s rackami, ktorý je načítaný.
  • Buďte webový server (napísaný v ľubovoľnom jazyku)používa protokol FastCGI na rozhovor s iným procesom s kódom servera FastCGI, ktorý znova uskutočňuje volania funkcií na kód, ktorý spracováva požiadavku; alebo
  • Buďte server, ktorý spúšťa úplne nový proces, ktorý interpretuje premenné prostredia CGI a štandardný vstup prenesený na ne a potom zavolá kód kompatibilný s rackami.

Takže či už používate CGI, FastCGI, ďalšiemedziprocesový protokol alebo vnútropodnikový protokol, nemá žiadny rozdiel; môžete urobiť ktorékoľvek z tých, ktoré používajú Rack, pokiaľ o tom server vie alebo sa rozpráva s procesom, ktorý dokáže pochopiť CGI, FastCGI alebo čokoľvek a na základe tejto žiadosti zavolá kód Rack.

takže:

Ak chcete dosiahnuť lepšiu výkonnosť, rozhodne nechcete používať CGI, chcete používať FastCGI, podobný protokol (napríklad Tomcat) alebo priame volanie kódu v priebehu procesu.

Ak používate Rack API, nemusíte sa obávaťv počiatočnom štádiu, ktorý protokol používate medzi vaším webovým serverom a programom, pretože celý bod rozhrania API ako Rack je, že ho môžete neskôr zmeniť.