isProduction() vs. IP 10.x.x.x
- Cifro
- Člen | 245
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
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
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
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().
- Cifro
- Člen | 245
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
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
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
Zkus ten setMode zavolat bez toho druhého parametru true, upřímě řečeno nevím, k čemu tam je :)
- redhead
- Člen | 1313
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
redhead napsal(a):
takže bych zkusil ještě něco jakoEnvironment::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 | 8218
Abych to trošku shrnul, jsou zde dvě rozdílné záležitost:
- 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
- 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
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)
- j3nda
- Člen | 12
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
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
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
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
OT: Opravdu nevím, zda-li je nejvhodnější nazvat jakoukoliv třídu
setNeco
:)