isProduction() vs. IP 10.x.x.x

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

Ahojte.
Na svojom hostingu som zistil, že webservery majú zapojené vo farme, a preto majú IP adresy tvaru 10.x.x.x ale navonok celý server ma iba jednú statickú IP adresu.

Kvoli týmto adresam ktoré sa aj dynamický menia na tych serveroch vo farme, mi nefunguje správne detekcia production prostredia. Keďže je to 10.x… tak mi prepne aj na ostrom servery do development módu.

Ja by som navrhoval pridať nejaké exclude vypinatko, kde by som si zadal adresy, ktoré sa nemajú brať v úvahu pri detekcii production módu.

Niečo také ako napr.:

<?php

Environment::excludeIPs = array('10.0.0.*', '127.0.0.1');

?>
Ondřej Mirtes
Člen | 1536
+
0
-

Tento problém mám taky a vyřešil jsem to detekcí produkčního prostředí v bootstrapu podle domény:

if (substr_count($_SERVER['HTTP_HOST'], 'example.com') > 0) Environment::setMode(Environment::PRODUCTION);
Cifro
Člen | 245
+
0
-

Hm diki, ma nenapadlo také riešenie… dával som kde som potreboval $_SERVER['SERVER_ADDR'] != "127.0.0.1".

Tak potom to moje vypinatko nebude mať asi opodstatnenie :/

PetrP
Člen | 587
+
0
-

Cifro napsal(a):

Hm diki, ma nenapadlo také riešenie… dával som kde som potreboval $_SERVER['SERVER_ADDR'] != "127.0.0.1".

Tak to není o tom dát to kde potřebuješ, ale jednou do bootstrapu, a podle toho nastavit režim (místo toho nechat to na autodetekci)

pmg
Člen | 372
+
0
-

Napadá mě, jestli by detekce v Nette nešla dělat podle REMOTE_ADDR.

Cifro
Člen | 245
+
0
-

PetrP napsal(a):
Tak to není o tom dát to kde potřebuješ, ale jednou do bootstrapu, a podle toho nastavit režim (místo toho nechat to na autodetekci)

To viem, ja som to myslel tak, že kým som to nenastavil bootstrape ako mi poradil LastHunter, tak som v kóde v presenteroch dával tu podmienku server_addr != 127.0… lebo automatická detekcia mi nešla dobre.

Napadá mě, jestli by detekce v Nette nešla dělat podle REMOTE_ADDR.

To by bolo fajn, lebo teraz podľa REMOTE_ADDR si vypínam Google analytics. Nechcem aby sa mi moje „development“ prístupy už na ostrý web zaratávali do štatistik.

Ondřej Mirtes
Člen | 1536
+
0
-

Detekce podle REMOTE_ADDR? To určitě ne, každý přistupující návštěvník ji má přeci jinou. A pokud by se to nastavilo jako REMOTE_ADDR == mojeIP ? Environment::DEVELOPMENT : Environment::PRODUCTION, tak by uživatelé se stejnou IP viděli Laděnku… Tudy určitě ne.

Ad analytics – já to zobrazuji právě podle Environment::isProduction().

pmg
Člen | 372
+
0
-

Ne, nemyslel jsem jmenovat konkrétní IP. Detekce by se lišila jen v tom, že by se místo SERVER_ADDR použila REMOTE_ADDR. Zdá se mi, že by to ve většině případů mohlo fungovat.

PetrP
Člen | 587
+
0
-

pmg napsal(a):

Ne, nemyslel jsem jmenovat konkrétní IP. Detekce by se lišila jen v tom, že by se místo SERVER_ADDR použila REMOTE_ADDR. Zdá se mi, že by to ve většině případů mohlo fungovat.

Hm možná. Jakou to přináší výhodu? Nejde REMOTE_ADDR podvrhnout?

pmg
Člen | 372
+
0
-

Vyřešilo by to Cifrův problém. Nevím o tom, že by šla adresa podvrhnout – může to občas být adresa vzdáleného proxy serveru, ale to nevadí.

Cifro
Člen | 245
+
0
-

Nakoniec som to poriešil takto:

<?php
if($_SERVER["SERVER_ADDR"] == "127.0.0.1"){
	require LIBS_DIR . '/Nette/loader.php';
	Environment::setMode(Environment::DEVELOPMENT);
	Debug::enable();
}else{
	require LIBS_DIR . '/Nette.minified/loader.php';
	Environment::setMode(Environment::PRODUCTION);
}
?>

Je to pre mňa akurat, lebo viem pod akou IP (127.0.0.1) ja vyvijam na notebooku a aká IP je na servery (10.0.0.x).

Takže to poriešilo moj pôvodný problem so serverovou farmou a isProduction().

A detekcia production / development podľa REMOTE_ADDR si tiež myslím, že není priliš vhodná. Lebo keď už hodím na ostrý server Nette applikáciu, tak chcem vedieť ako sa tam chová v production móde a nechcem aby sa mi to preplo podľa mojej REMOTE_ADDR aj na ostrom servery do development módu.

A ten Google analytics mam teraz takto:

{if Environment::getHttpRequest()->getRemoteAddress() != "x.x.127.190" && Environment::isProduction()}

(x = nemusim tu ukazovať IP :)

pmg
Člen | 372
+
0
-

A detekcia production / development podľa REMOTE_ADDR si tiež myslím, že není priliš vhodná. Lebo keď už hodím na ostrý server Nette applikáciu, tak chcem vedieť ako sa tam chová v production móde a nechcem aby sa mi to preplo podľa mojej REMOTE_ADDR aj na ostrom servery do development módu.

To nechce nikdo, ani jsem to nenavrhoval.

Cifro
Člen | 245
+
0
-

Ešte otvorím túto tému. Lebo mi niečo nesedí.

Tento kód:

echo "<pre>";
require LIBS_DIR . '/Nette/loader.php';

Environment::setMode(Environment::DEVELOPMENT, true);
Debug::enable(FALSE);
Debug::enableProfiler();

var_dump(Environment::getMode(Environment::DEVELOPMENT));
var_dump(Environment::isProduction());
var_dump(Environment::getName());

… na produkčnom serveri vygeneruje tento output:

bool(true)
bool(true)
string(10) "production"

Očakaval by som iné hodnoty, keďže som natvrdo nastavil Environment::DEVELOPMENT. isProdoction() by malo byť false a getName() by malo byť development. Podľa mňa to je chybné chovanie.

Ondřej Mirtes
Člen | 1536
+
0
-

Zkus ten setMode zavolat bez toho druhého parametru true, upřímě řečeno nevím, k čemu tam je :)

redhead
Člen | 1313
+
0
-
bool	$value	set or unset

(defaultně TRUE, takže by to mělo být ok)

redhead
Člen | 1313
+
0
-

když si projdeš zdroják lecos z toho pochopíš.

Ono totiž ten production (nejspíš) musíš vypnout, jelikož aplikace může běžet zároveň v několika módech (??; to jest ten druhý parametr, který specifikuje zda je zapnut, nebo vypnut)

takže bych zkusil ještě něco jako

Environment::setMode(Environment::PRODUCTION, FALSE);
Cifro
Člen | 245
+
0
-

redhead napsal(a):
takže bych zkusil ještě něco jako

Environment::setMode(Environment::PRODUCTION, FALSE);

Môj ouput pri tejto zmene je:

NULL
bool(false)
string(11) "development"

Takže toto je až očakavaný výstup. Toto chovanie by malo robiť aj Environment::setMode(Environment::DEVELOPMENT) a druhý parameter je potom zbytočný ale aj mätúci ak to má byť ako vypináč on/off pre daný nastavený režim.

Btw… som si uvedomil, že vôbec sa nespolieham na autodetekciu režimu podľa Nette. Lebo nastavenie serverov je rôzne, niekde majú IP 10.0.0.0/8 kvôli tomu že server je v serverovej farme, inde som sa stretol aj s tým že server mal IP 127.0.0.1.

(Hmm postupil som ďalej, ale pôvodný problem je aj tak chyba 500 na produkčnom serveri :-( )

Editoval Cifro (18. 11. 2009 21:37)

David Grudl
Nette Core | 8227
+
0
-

Abych to trošku shrnul, jsou zde dvě rozdílné záležitost:

  1. zda použít pro detekci REMOTE_ADDR nebo SERVER_ADDR: vážně nevím, chtělo by to provést nějakou rešerši, jestli nemůže být REMOTE_ADDR nebezpečné, stejně tak je množné, že se tím jeden problém vyřeší a jiný vznikne
  2. Environment::setMode(Environment::DEVELOPMENT): tohle je věc, která z principu funkce módu skutečně nefunguje, ale samotnému se mi to vůbec nelíbí. Napadá vás nějaké koncepční řešení?
Cifro
Člen | 245
+
0
-

Som rád že si sa aj na toto pozrel :)

Mam taký poznatok s Environment::setMode(Environment::PRODUCTION, FALSE);. Nastavil som si takto aplikáciu. Na localhoste beží v development… nahram na server tiež je v development (preplo sa podľa subdomény „dev“). Zatiaľ je to dobré. Skončí to ale na pripajaní do db podľa nastavení config.ini, kde pomocou sekcie development < production menim hodnoty nastavení pre development mód. A ejha. Na ostrom serveri nemam tú vyvojovú databázu a nastavenia k nej jak na localhoste (napr. na localhoste nepoužívam heslo do db). Žeby chybal ešte jeden mód, niečo ako „production development“? :-)))

A dôvod prečo prepínam aj na ostrom serveri do dev režimu je prostý – ladenie v skutočnom prostredí kde to pobeží.

Edit: dev.domena.tld je samozrejme zaheslované s .htpasswd

Editoval Cifro (24. 11. 2009 11:01)

Aurielle
Člen | 1281
+
0
-

Já to řeším tak, že podle isProduction() nastavím daný oddíl configu a development mód zapínám na Laděnce nezávisle na tomto.

j3nda
Člen | 12
+
0
-

taky zkusim pripojit svuj postup.
mam 4× prostredi:

  • localhost << toto jsem si jen pridal, abych vedel, kdo je localhost
  • development (devel.domain.tld) << verejna ip; jiny setMode, ale stejna db i data
  • beta_domain_tld (beta.domain.tld) << verejna ip; jiny setMode, ale stejna db i data
  • production (www.domain.tld)

v config.ini mam rozdeleni prostredi
[console < common]
[production < common]
mode.production = true
[beta_domain_tld < production]
mode.production = true
[development < production]
mode.production = true
[localhost < development]
mode.production = true

a zvlast v souboru: config.setMode.ini mam RE pravidla jako napr:
setMode.enabled = true;
setMode.fqdnRE[] = „^l$|^local$|^loc$|^localhost\.devel$|^devel$|^dev$|^d$“
setMode.fqdnRE[] = „^devel?\.domain\.tld$“
setMode.fqdnRE[] = „^beta\.domain\.tld$“

setMode.name[] = localhost
setMode.name[] = development
setMode.name[] = beta_domain_tld

na to mam statickou tridu setMode.php, ktera v bootstrapu resi toto:
require LIBS_DIR.‚/nette/loader.php‘;
include_once APP_DIR.‚/../setMode.php‘;
setMode::init();
Environment::loadConfig();
setMode::debug(Environment::getConfig(‚debug‘)); << toho si nevsimejte, zapina mi to debug::enabled podle toho, zda je to zapnuto v config.ini (vice debug.* voleb)

ten RE vyraz se hleda z $_SERVER[‚HTTP_HOST‘]

me osobne by se vic v configu hodily nejake RE/per IP pravidla na nastaveni prostredi za behu aplikace (v konecne produkcni aplikaci uz muze byt config.ini – do ktereho se nebude sahat; do jinych configu/prostredi zasahuje vic lidi)

Filip Procházka
Moderator | 4668
+
0
-

podle mě by problém řešilo přepsání property

final class Environment
// ...
	/** @var string  the mode of current application */
	private static $mode = array();
// ...

na string místo array… a samozřejmě s tím i chování metody setMode a getMode

Editoval HosipLan (23. 1. 2010 14:56)

arron
Člen | 464
+
0
-

Je tu takova zvlastni nekonzistence ohledne Environment::setMode().
Ta implementace, tak jak je ted, tak vlastne umoznuje nastavit vice modu, treba i protichudnych. Takze napriklad na produkcnim serveru, kdyz nastavim Environment::setMode(Environment::DEBUG);, coz by melo nastavit prostredi na debug, tak metoda Environment::isProduction() vraci stale TRUE. Je to proto, jakym zpusobem funguje metoda Environment::getMode(). Osobne bych byl pro nejaky refactoring, ktery by umoznil nastavit jenom jeden mode a provadel by autodetekci jenom tehdy, kdyz by mode nastaveny nebyl vubec.

A ted, kdyz to po sobe ctu, tak si nejsem jisti, jestli jsem k pochopeni:-)

j3nda
Člen | 12
+
0
-

me by se spis hodilo, kdyby bylo mozne si zvolit vlastni metodu pro detekci, tj. misto natvrdo zadratovanych ip adres, aby bylo mozne tuto metodu zmenit. napr pomoci nejakeho handleru v ramci enviroment.

uplne idealni by bylo, kdyby se dalo menit prostredi na zaklade:

  • ip adresy (vlastni metoda)
  • fqdn nazvu (vlastni metoda)

toto jsem se snazil vyresit pomoci vlastni tridy setMode (viz prispevky vyse)

romansklenar
Člen | 655
+
0
-

OT: Opravdu nevím, zda-li je nejvhodnější nazvat jakoukoliv třídu setNeco :)