Strona 1 z 1

Jak ustawić port 80 tylko dla apache?

: 26 marca 2009, 22:54
autor: noe
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?

: 26 marca 2009, 23:43
autor: gajosew
W jaki sposób są te aplikacje uruchamiane?

: 27 marca 2009, 07:30
autor: Ister
Wyświetl

Kod: Zaznacz cały

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)?

: 27 marca 2009, 09:15
autor: noe
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

Kod: Zaznacz cały

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.

: 27 marca 2009, 09:38
autor: lessmian2
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 &)?

: 27 marca 2009, 10:26
autor: noe
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źć?

: 27 marca 2009, 13:00
autor: Ister
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.

: 27 marca 2009, 13:01
autor: lessmian2
Kawałek z dokumentacji funkcji exec PHP:
Notatka: 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.
Spróbuj przekierować wyjście wywoływanego polecenia shellowego np. na /dev/null

: 27 marca 2009, 13:58
autor: noe

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);
        
    }


}
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 :

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 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 :

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)
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.