Adresářová struktura Sandboxu – výhody?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nanuqcz
Člen | 822
+
0
-

Ahoj, od začátku co používám Nette, mi vrtá hlavou jedna věc. Jaké výhody má současná struktura, kde se musí zasahovat nad root webu? Pojďme si udělat takové shrnutí…

Výhoda: Bezpečnost

Tohle mi přijde diskutabilní. Dneska už každý hosting za 40 Kč / měsíc (dokonce i free-hostingy) dovoluje zapnutí .htaccess souboru. A pomocí něho jde přístup zvenku do složek app/, libs/, logs/ a já nevím co ještě, krásně zakázat. Bezpečnost je tak zajištěna i bez této struktury.

Nevýhoda: Více projektů na jednom serveru » Nepřehlednost

Dejme tomu, že chci mít na svém serveru tři aplikace (např. blog, wiki, forum). Pokud by Sandbox měl normální „plochou“ adresářovou strukturu (index.php by byl v rootu, místo ve složce www), vytvořil bych jednoduše tyhle 3 složky, udělal z nich subdomény, do každé z nich nakopíroval Sandbox a začal ty tři aplikace vyvíjet.

V současném stavu ale kromě těchto tří složek budu muset ztrojit složky app, logs, temp a tests (pokud chci psát testy), navíc budu muset v index.php a bootstrap.php tyto cesty upravovat. Pojďme se podívat, jak tedy výsledná struktura bude vypadat:

app_blog/
app_wiki/
app_forum/
blog/        #http://blog.example.com
forum/       #http://forum.example.com
libs/
logs_blog/
logs_wiki/
logs_forum/
temp_blog/
temp_wiki/
temp_forum/
tests_blog/
tests_wiki/
tests_forum/
wiki/        #http://wiki.example.com

A to jsme jen u třech projektů, a je v tom (podle mojeho názoru) binec jako prase :)

Přehlednější by určitě bylo:

blog/        #http://blog.example.com
  - ...      #adresáře patřící k aplikaci `blog`
forum/       #http://forum.example.com
  - ...      #adresáře patřící k aplikaci `forum`
wiki/        #http://wiki.example.com
  - ...      #adresáře patřící k aplikaci `wiki`

Na to mi určitě budete chtít namítnout „Však si tu adresářovou strukturu uprav“, a k tomu se chci dostat. Nebylo by lepší ji mít v Sandboxu takto hezky ploše už defaultně?

Výhoda: Společný adresář libs/ pro knihovny

Tady je to zase diskutabilní, jestli ušetření pár kB / MB místa stojí za ten binec v libs/ (umlouvám se těm, kteří ve složce libs mají i při několika projektech pořádek :-)) Ono některé knihovny budu používat ve všech projektech, některé zase jen v jednom projektu… při změně prvního projektu se na (již nepoužívané) knihovny budu bát sáhnout: „Co když jsou využívány v některém z dalších projektů? (které psal třeba i kamarád, kolega)“

Nevýhoda: Začátečníci nechápou, proč má mít jejich web URL www.example.com/www :-)

A já se jim ani nedivím, tahle struktura je prostě „mírně zvláštní“.

Nevýhoda: Někdy není možné „nad root“ webu zasahovat

Nadpis mluví sám za sebe.

Závěr: Chtěl bych se ostatních zeptat, jaký na to mají názor, jestli už taky někdy upravovali strukturu Sandboxu do její pložší podoby, jestli je napadají další výhody / nevýhody, a co říkají na nápad upravit přímo strukturu Nette Sandboxu.

Díky za názory

Editoval xxxObiWan (21. 7. 2011 18:32)

22
Člen | 1478
+
0
-

no já nevím, ale na tohle jsou přece moduly nebo mi něco uniká proč ne?

edit: A co se týka example.com/www … říkáš, že všude je .htaccess tak proč oddělovat index.php, když na to stejné místo můžu dát .htacces

RewriteEngine On
RewriteRule ^$ /your_folder/www [L,R=301]

takže jediná výhoda tvýho řešení je možná společná libs, ale já si většinu věci externích do dané aplikace dávám do app/XXXmodule/components

Editoval 22 (21. 7. 2011 18:51)

nanuqcz
Člen | 822
+
0
-

no já nevím, ale na tohle jsou přece moduly nebo mi něco uniká proč ne?

Možná to byl špatný příklad… Ale můžu mít aplikace, které spolu vůbec nesouvisí (třeba jen čekají na předání zákazníkům). Nebo chci mít na jednom serveru naše firemní stránky, pak třeba sociální síť (ala facebook), kterou vytváříme pro veřejnost (teď plácám :-)).

V takovýchto případech se podle mě použití modulů nehodí, i když chci mít aplikace na jednom serveru.

Editoval xxxObiWan (21. 7. 2011 18:53)

nanuqcz
Člen | 822
+
0
-
RewriteEngine On
RewriteRule ^$ /your_folder/www [L,R=301]

Tím docílíš jen přesměrování, a zase mám v URL to nechtěné www :-) Zkoušel jsem to kdysi bez přesměrování, jen s podstrkáváním, pak ale Nette generovalo špatně proměnnou {$basePath}.

22
Člen | 1478
+
0
-

Když spolu nesouvisí, proč mají sdílet stejný adresář teda, jen kvůli společným komponentám/knihovnám? A co když za půl roku budeš jeden z těch projektů chtít prodat a tedy přemístit na jiný hosting, to ti z toho jebne to vypreparovat a pravděpodobně tam dáš i tunu věcí, který ten projekt vůbec nevyužívá a to bude pak binec :-)

Editoval 22 (21. 7. 2011 18:58)

nanuqcz
Člen | 822
+
0
-

Ok, tak adresář libs/ společny nebude – detail. Podstata tohohle tématu byla myšlena trochu jinak :-)

Základní myšlenka je: Je lepší struktura, kde se přistupuje nad root webu, nebo je lepší plochá struktura? A proč?

Filip Procházka
Moderator | 4668
+
0
-

Organizace… Na to já jsem úchyl. Dokážu dlouhé hodiny strávit přejmenováváním presenterů tam a zpátky :)

  • Vyhovuje (čti „vyhovuje“ nikoliv „je lepší“) mi současný sandbox.
  • Předělával jsem ho zatím jen jednou jedinkrát, pouze jsem nakopíroval obsah složky www do rootu webu a opravil index.php (Framework::$iAmUsingBadHost = TRUE)
  • Ve velkých aplikacích to dává velký smysl tak jak je to teď.
app/
	ForumModule/
	BlogModule/
	FacebookModule/
temp/
log/
libs/
forum/
	css/ - vlastní styly
	images/ - vlastní obrázky
	index.php
blog/
	css/ - vlastní styly
	images/ - vlastní obrázky
	index.php
facebook/
	css/ - vlastní styly
	images/ - vlastní obrázky
	index.php
shared/
	css/ - sdílené styly
	images/ - sdílené obrázky

Nastavíš si apache2/nginx aby směřoval virtualhost/server do jednotlivých složek + rewrite na index a je vystaráno :)

  • Více projektů nepatří na jeden server – snažíš se ušetřit? Pokud ano tak VPS/Dedikovaný/Cloud/… → odpadá problém s prefixem www/
nanuqcz
Člen | 822
+
0
-

@HosipLan: Polovině tvojeho příspěvku jsem nerozuměl (což je z důvodu mé neznalosti), ale i tak děkuju za odpověď ;-) Získal jsem teď trochu dojem, že Nette je určeno hlavně pro velmi zkušené programátory a průměrný PHPčkař, který neví co to je „apache2/nginx“, „VPS/Dedikovaný/Cloud“ apod., bude mít s Nette vždycky trochu problémy.

Ano, snažím se ušetřit – čas (proto se učím Nette :-)) i peníze (proto řeším tyhle blbosti :-))

smasty
Člen | 90
+
0
-

Pridám sa k xxObiWan.
Je jasné, že na veľké aplikácie je oveľa výhodnejšia súčasná štruktúra a teoreticky je možno aj o niečo bezpečnejšia.

Ale sandbox by som skôr bral ako doporučenú štruktúru pre začiatočníkov, ktorá im bude bez problémov fungovať bez väčšej snahy. Pokročilí nech si používajú štruktúru, aká im vyhovuje (ja sám používam inú a to robím s Nette naozaj krátko).

A realita je taká, že na zdieľaných hostingoch (ktoré predpokladám bude používať asi väčšina začiatočníkov, a na bežné weby úplne stačia) je väčšinou štruktúra asi takáto:

/ FTP root
  /www     -> www.domena.tld
  /forum   -> forum.domena.tld

V takomto prípade je súčasná štruktúra značne nevýhodná, ako už ukázal xxObiWan.

Navyše, väčšina (nás) začiatočníkov sa asi veľmi nevyzná v konfigurovaní servera, takže je problém si v apache/nginx configu nastaviť potrebnú konfiguráciu. Tak isto aj na localhoste, niektorí sú radi, že majú XAMPP/WAMP, ktorý zázračne beží aj sám od seba a oni tam nič nastavovať nemusia.

Netvrdím, že je v poriadku nevedieť nič o konfigurácii servera, ale proste je to realita. Tak prečo začiatočníkom robiť začiatky (o trochu) ťažšími?

na1k
Člen | 288
+
0
-

smasty, pro dosažení aplikační struktury až v adresáři subdomény stačí dvouřádkový htaccess :)

nanuqcz
Člen | 822
+
0
-

@na1k: Sry nepochpil jsem tě, co znamená „dosažení aplikační struktury až v adresáři subdomény“ ?

Filip Procházka
Moderator | 4668
+
0
-

@**Smasty**: Všechno to jde nastudovat během pár dní, nejdéle. Chce to jen chtít.

@**xxxObiWan**: David s prý oblibou říká (já to ještě nepostřehl), že se nebojí doporučovat Nette i začátečníkům s PHP. Čili asi to nebude jen na velké projekty :)

na1k
Člen | 288
+
0
-

xxxObiWan,

/
      forum/
            app/
            lib/
            www/
      wiki/
            app/
            lib/
            www/
      www/
            app/
            ...

s tím, že jde o klasickou hostingovou FTP strukturu, kde forum, wiki, www, odpovídá subdoméně. Do každé z těchto subdomén pak dám .htaccess:

RewriteEngine on
RewriteRule ^(.*)$ /www/$1 [NE]

Ano, je to trochu proti filozofii sandboxu a zbytečně se duplikují knihovny, ale to jsou řádově kB až MB. To je malá cena za přehlednost, která touto organizací dle mého roste :-)

Navíc mi to dovoluje na subdoménách pouštět aplikace s různou verzí Nette (obecně knihoven), stejně jako můžu dát programátorovi konkrétní aplikace přístup jen k subdoméně a ne k celé doméně (rootu).

Editoval na1k (22. 7. 2011 10:12)

srigi
Nette Blogger | 558
+
0
-

Netreba zabudat, ze duplikovanie kniznic celkom spolahlivo zabija prinos, ktory prinasaju op-code cache. Podla mojho skromneho nazoru, mozu jednotne kniznice priniest zaujimavu vykonovu optimalizaciu pri multi-projekt aplikacii – v starej praci sme to videli na hostingoch, kde kniznice boli per-projekt a po zmene na symlinky sa aplikacie mierne zrychlili ale hlavne klesla zataz Apache (APC fragmentacia klesla hadam o 50%).

Tharos
Člen | 1030
+
0
-

Něco k té bezpečnosti. Kdysi tu bylo jedno vlákno od Davida s upozorněním, kolik procent webů běžících na Nette nemá zabezpečený config.ini. Nepamatuji si z hlavy, kolik přesně procent to bylo (a to vlákno už je koukám z pochopitelných důvodů odstraněné), ale bylo to velmi překvapivé číslo (určitě více než 5%). Vzpomínám si, že to končilo výzvou: „Běžte si to opravit!“ a následoval už jen lock toho vlákna. :)

Myslím, že to číslo bylo docela přesné, protože David měl od Jakuba Vrány (předpokládám, že od něj) seznam všech CZ domén, na kterých bylo podle hlaviček detekováno Nette, a předpokládám, že je prostě zkontroloval jednoduchým robotem.

V každém případě šlo o weby na serverech, kde programátoři z nějakého důvodu překopali výchozí strukturu na plochou (samozřejmě v mnoha případech museli). Překvapivě velké množství z těch programátorů pak už vůbec neřešilo nějaký .htaccess a nutnost ochránit config.ini, který se tak ocitl v rootu webu.

Pokud by výchozí struktura Nette byla plochá, jsem přesvědčen, že množství webů s touto bezpečnostní dírou by skutečně vzrostlo a to by na Nette nevrhalo dobré světlo (i když správně přednastavený .htaccess přímo v sandboxu by určitě ochránil většinu webů produkovaných méně zkušenými programátory).

kravčo
Člen | 721
+
0
-

Myslím si, že duplikovanie knižníc má zmysel v prípade, že potrebujem viaceré verzie (pretože jedna staručká aplikácia beží pod 0.9.x zopár novších pod starším 2.0-dev a najnovšia pod 2.0-beta).

Osobne si nemyslím, že problémom vysokého percenta viditeľných config.ini je zmena štruktúry, skôr neskúsenosť, neznalosť, alebo slabý dôraz na zabezpečenie webu. Ak má človek v adresároch app/ a libs/ .htaccess so zakázaným prístupom, tak je predsa jedno, kde v hierarchii tieto adresáre umiestni…

Teoreticky, ďalším dôvodom mohla byť kombinácia prístup len do doménového rootu + vypnutá podpora htaccess na serveri. Tam už je ale najlepším riešením zmeniť hostéra…

nanuqcz
Člen | 822
+
0
-

na1k napsal(a):

RewriteEngine on
RewriteRule ^(.*)$ /www/$1 [NE]

Zkoušel jsi to? Mě v tomhle případě Nette při URL http://localhost/blog/ hlásí chybu:

Nette\Application\BadRequestException #404

Cannot load presenter 'Blog', class 'BlogPresenter' was not found in 'D:\XamppLite_1.7.3\htdocs\blog\app/presenters/BlogPresenter.php'.

Otestováno na nejnovější vývojové verzi Nette. Navíc jsem to kdysi zkoušel i na 0.9.7 a i tehdy to způsobovalo tuhle chybu.

EDIT: Tak se omlouvám, v rootu localhostu (a tím pádem i v rootu subdomény) to funguje. V podsložce ale ne, takže mi to nepřijde jako univerzální řešení.

Editoval xxxObiWan (23. 7. 2011 16:51)

na1k
Člen | 288
+
0
-

100% univerzální to asi není; sám jsem aplikaci v podsložce nikdy nevyužil a jednotlivé aplikace mám buď na různých (local)hostech anebo v subdoménách

V případě http://localhost/blog/ by ale mělo stačit přesunout .htaccess z rootu do /blog/. Obecně by měl být na stejné úrovni jako app,lib,www

nanuqcz
Člen | 822
+
0
-

V případě http://localhost/blog/ by ale mělo stačit přesunout .htaccess z rootu do /blog/. Obecně by měl být na stejné úrovni jako app,lib,www

Jj přesně tak jsem to měl, ale Nette si z nějakého důvodu myslí, že blog je název presenteru (asi kvůli new Route('<presenter>/<action>/<id>', 'homepage:default'))

EDIT: Myslíte, že by se to dalo brát jako bug?

Editoval xxxObiWan (23. 7. 2011 18:19)

Filip Procházka
Moderator | 4668
+
0
-

Myslím si, že by se to dalo brát, jako špatně nastavené routy.

Aurielle
Člen | 1281
+
0
-

Tohle je imho bug Nette. Nedetekuje správně $baseUrl a proto si myslí, že blog je presenter…

Patrik Votoček
Člen | 2221
+
0
-

Stávající struktura je podle mě OK jiné frameworky to mají hodně podobně. Navíc Nette je v tomto směru doopravdy hodně volné. Takže vzít obsah složky www a hodit ho o ůroveň víše + editnout index.php je hračka.

Nehledě na to že mám možnost provozovat více instancí nad stejnýmy zdrojovímy kódy (a využít tak naplno APC / xCache / WinCache).

Výchozí stav je v tomto ohledu bych řekl OK s faktem snadné změny je to o to více OK. Nehledě na to že kvalitnější hostingy (pokud se pletu opravte mě – už více jak 2 roky jsem o hosting nezavadil) ti vstup nad document_root dovolují (ty za cenu rohlíku měsíčně jsou na tom holt hůře).

David Grudl
Nette Core | 8228
+
0
-

Adresář www je určený pro veřejně dostupné soubory. Dávat do něj neveřejné soubory mi připadá divné, zhruba stejně, jako kdybychom libs a log dali do adresáře images a jen zakázali přístup přes htaccess. Lze to, ale proč?

Peppy
Člen | 137
+
0
-

No, ja používam túto štruktúru:

public/
system/
   FrontEndModule/
   BackEndModule/
   ...
index.php

Ak ide o zložitejšie projekty tak:

libs/
   Nette/
forum/
   public/ # JavaScripty, Styly, Obrázky, Verejné súbory a iný balast.
   FrontEndModule/
   BackEndModule/
   ...
   index.php
wiki/
   public/
   FrontEndModule/
   BackEndModule/
   ...
   index.php