Jak ustawi
Jak ustawić port 80 tylko dla apache?
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?
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?
Wyświetl
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)?
Kod: Zaznacz cały
netstat -na
Jakiego rodzaju są aplikacje na serwerze (skrypty systemowe/programy w językach takich jak C/JAVA/Perl/kolejny PHP)?
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 problemui 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.
Za pomocą skryptu phpshell z poziomu php wysyłana jest komenda do włączania danego serwera.
Wyłączanie serwera przebiega bez problemu
Kod: Zaznacz cały
kill xxx
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.
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 &)?
Kawałek z dokumentacji funkcji exec PHP:
Spróbuj przekierować wyjście wywoływanego polecenia shellowego np. na /dev/nullNotatka: Jeśli ta funkcja zostanie użyta do uruchomienia programu który ma działać w tle, należy upewnić się, że wyjście tego programu jest przekierowane do pliku lub innego strumienia wyjściowego. W przeciwnym wypadku PHP zawiesi działanie aż do zakończenia działania wykonywanego programu.
Kod: Zaznacz cały
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);
}
}
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 :
Kod: Zaznacz cały
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
[b][color=blue]tcp 0 0 0.0.0.0:1100 0.0.0.0:* LISTEN[/color][/b]
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 tym drugim serwerze nie jest to tcp ale udp.
I drugie spostrzeżenie
Po wpisaniu lsof -i:80 na moim serwerze jest :
Kod: Zaznacz cały
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)
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.