|
Jak ustawić port 80 tylko dla apache?
noe - 26-03-2009 22:54
Witam, jestem tu nowy i dopiero raczkuję to tak na wstępie. Otóż mam taki problem. Pewne aplikacje napisane w php muszą uruchamiać pewne aplikacje na serwerze (to że akurat uruchomi je www-data nie ma znaczenia). Wszystko działa ładnie ale pojawił się problem. Mianowicie w ten sposób uruchomione aplikacje blokują port 80 tzn. powstaje coś jakby echo programu na porcie 80 (mimo iż aplikacje uruchamiane są na portach powyżej 10000) efektem jest coraz wolniejsza praca apache. Wkońcu restart i błąd bo oczywiście port 80 używany przez inną aplikację.
Moje pytanie czy jest coś co mogę doinstalować do serwera co nie dopuści do uruchamiania żadnych procesów poza apachem na porcie 80?
gajosew - 26-03-2009 23:43
W jaki sposób są te aplikacje uruchamiane?
Ister - 27-03-2009 07:30
Wyświetl netstat -na
kidy ta "inna aplikacja" blokuje port 80. Jakiego rodzaju są aplikacje na serwerze (skrypty systemowe/programy w językach takich jak C/JAVA/Perl/kolejny PHP)?
noe - 27-03-2009 09:15
Uruchamiane aplikacje to ogólnie znane serwery ventrilo i teamspeak. Za pomocą skryptu phpshell z poziomu php wysyłana jest komenda do włączania danego serwera. Wyłączanie serwera przebiega bez problemu
kill xxx
i po sprawie nic nie zostaje na porcie 80.
Jednak uruchamianie tak jak napisałem, mimo że serwer uruchamia się powiedzmy na porcie 10000 to jednak pozostaje także jakby uruchomiony na porcie 80. Bezpośrednie zabicie tego procesu na porcie 80 powoduje zamknięcie aplikacji.
lessmian2 - 27-03-2009 09:38
Aplikacje uruchomione ze skryptu PHP nie blokują portu 80. Są to te skrypty z których zostały wywołane aplikacje na serwerze. A skrypty te będą działały tak długo jak będzie żył proces odpalany w nich funkcją exec czy jakąkolwiek inną podobną funkcją PHP. Po prostu funkcja ta czeka na zakończenie wywołanego procesu, a że ten to jakiś tam serwer który teoretycznie się nie kończy, to proces Apache czeka na niego w nieskończoność. I im dłużej, tym więcej jest tych procesów i tym wolniej wszystko działa. Należało by zmienić sposób odpalania tych aplikacji z PHP, tak aby PHP dostawał sygnał że wywoływany program zakończył działanie. Może wystarczy proces odpalać w tle (z &)?
noe - 27-03-2009 10:26
W tle nie pomaga, nadal to samo. Zastanawia mnie ta druga podpowiedź mianowicie z tym sygnałem zwrotnym o zakończeniu tylko jak to zrobić?
Zasugerowano też mi coś o nazwie mrb (method request brooken) czy jakoś tak, ale nie wiem z czym się to je i jak to ugryźć?
Ister - 27-03-2009 13:00
Może odpal komendę za pomocą nohup w tle, a następnie wymuś zamknięcie php za pomocą exit?
Nie testowałem czy to zadziała.
lessmian2 - 27-03-2009 13:01
Kawałek z dokumentacji funkcji exec PHP:
Spróbuj przekierować wyjście wywoływanego polecenia shellowego np. na /dev/null
noe - 27-03-2009 13:58
function stripslashes_deep($value) { if (is_array($value)) return array_map('stripslashes_deep', $value); else return stripslashes($value); }
if (get_magic_quotes_gpc()) $_POST = stripslashes_deep($_POST);
$username =******; $password = ******; $_SESSION['nounce'] = mt_rand(); $nounce = $_SESSION['nounce']; $path = "/home/vt/"; $pid=$path."ventrilo_srv.pid";
if($com=="start") { $command = "./ventrilo_srv -d"; $_SESSION['authenticated'] = ($username == $password);
if (empty($_SESSION['cwd'])) { $_SESSION['cwd'] = $path; $_SESSION['output'] = ''; } if (!empty($command)) { $_SESSION['output'] .= '$ ' . $command . "\n";
chdir($_SESSION['cwd']);
$length = strcspn($command, " \t"); $token = substr($command, 0, $length); $io = array(); $p = proc_open($command, array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $io);
while (!feof($io[1])) { $_SESSION['output'] .= htmlspecialchars(fgets($io[1]), ENT_COMPAT, 'UTF-8'); } while (!feof($io[2])) { $_SESSION['output'] .= htmlspecialchars(fgets($io[2]), ENT_COMPAT, 'UTF-8'); } fclose($io[1]); fclose($io[2]); proc_close($p); }
}
To jest aplikacja w php która po shellu , jak widac nie używam tu exec.
Teraz spostrzeżenie, mam do dyskzycji inna maszynę na której odziwo wszystko działa bezbłędnie kopiuje te same pliki uruchamiam i działa, nic nie uruchamia sie na porcie 80. co mnie tylko ździwiło to: na moim serwerze jak wpisze netstat - na ( zgodnie z radą) wygląda na to że te aplikacje uruchamiaja sie na porcie tcp i wygląda to mniej więcej tak :
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:106 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:1100 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
na niebiesko zaznaczyłem uruchomiona aplikację.
na tym drugim serwerze nie jest to tcp ale udp. I drugie spostrzeżenie Po wpisaniu lsof -i:80 na moim serwerze jest : COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME apache2 10471 root 5u IPv6 221074 TCP *:www (LISTEN) apache2 10476 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10477 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10478 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10479 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10480 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10481 www-data 5u IPv6 221074 TCP *:www (LISTEN) apache2 10483 www-data 5u IPv6 221074 TCP *:www (LISTEN)
a na tym co działą wszystko ok nie ma IPv6 a IPv4 czy to ma wpływ na sposób uruchamiania?
No i nakoniec , na moim serwerze jest Plesk, na tym drugim nie ma.
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|