--=REKLAMA=--

Jak lepiej uruchomić PHP - jako skrypt CGI czy moduł Apache?

Z Joomla!WikiPL

Są dwie główne metody uruchamiania środowiska PHP:

  1. Konfiguracja Apache, aby ładował interpreter PHP jako moduł Apache
  2. Konfiguracja Apache, aby uruchamiał interpreter PHP jako program CGI

(PS: Windows IIS konfiguruje zwykle PHP jako skrypt CGI)

Intencją tej wiadomości jest dostarczyć Ci informacji dotyczącej konfiguracji i rozpoznawania każdej z tych metod. "Ogólnie" i historycznie rzecz biorąc, tylko jedna metoda albo inne metody zostały zaimplementowane, jednakże wraz ze zmianami architektonicznymi poczynionymi w PHP, poczynając od PHP5, firmy hostingowe mogą skonfigurować obie wersje, jedną działającą jako moduł, drugą jako skrypt CGI. Powszechniejsze jest drugie rozwiązanie, bo zapewnia większe bezpieczeństwo, ale z kolei działanie PHP jako modułu Apache jest wydajniejsze i zwykle jest upowszechnione w pudełkowych wersjach preinstalacyjnych.

Jaka jest różnica między trybem CGI, a modułem Apache?

Moduł Apache

...jest kompilowany na binaria serwera, czyli interpreter PHP działa w ramach procesu Apache, co oznacza, że kiedy Apache generuje proces potomny (child), każdy taki proces zawiera binarny obraz PHP. CGI jest uruchamiany jako indywidualny proces dla każdego zapytania (request) i musi wykonać wywołania exec() lub fork() dla uruchomienia PHP, co oznacza z kolei, że każda prośba (request) tworzy nowy proces interpretera PHP. Apache jest bardziej wydajny w obsłudze zapytań (request) i w zarządzaniu zasobami, co czyni ten moduł nieco szybszym od CGI (jak również bardziej stabilnym przy obciążeniu).

Tryb CGI

... jest z drugiej strony bardziej bezpieczny ponieważ teraz serwer zarządza i steruje dostępem do plików binarnych. W tej wersji PHP może działać raczej jako Twój realny użytkownik niż zwykły użytkownik Apache. Oznacza to, że możesz wprowadzić hasła bazy danych do pliku dostępnego tylko dla Ciebie i Twoich skryptów php. Prawa dla Grupy (Group) i Inni (Other) zobacz: Jak działają prawa dostępu do plików w UNIX? mogą być teraz ustawione w bardziej restrykcyjny sposób. Tryb CGI jest uważany także za bardziej elastyczny w wielu aspektach, których teraz nie będziemy rozważać. Przy zastosowaniu phpSuExec (Prawa dostępu i phpsuexec) znikają problemy z prawami własności, dzięki czemu nie powinieneś mieć więcej problemów z FTP kiedy próbujesz uzyskać dostęp lub chcesz modyfikować pliki, które zostały załadowane przez interfejs PHP, taki jak np. instalator w panelu administracyjnym Joomla!

Jeżeli Twój serwer jest skonfigurowany dla PHP jako moduł Apache, wtedy będziesz miał wybór użycia pliku albo php.ini albo .htaccess. W przypadku działania PHP w trybie CGI, by zmienić ustawienia możesz korzystać tylko z lokalnego pliku php.ini, ponieważ Apache nie ma już całkowitej kontroli nad PHP.

Testowanie i przegląd twojej instalacji PHP

Czyli wszystko "co kiedykolwiek chciałeś i czego nie chciałeś wiedzieć o PHP"

Aby uzyskać informację o trybie pracy interpretera PHP i generalnie przetestować swoją instalację PHP, a także dowiedzieć się o specyfice środowiska PHP, wspieranych narzędziach, aplikacjach i ustawieniach, utwórz prosty plik zawierający tylko następującą linię;

phpinfo()

Ta pojedyncza linia kodu wygeneruje zadziwiającą ilość informacji, przygotuj się na to. Zapisz ją w pliku pod dowolną nazwą (np. info.php) ale zawsze z rozszerzeniem ".php", następnie prześlij ten plik przez FTP np. do głównego katalogu Twojego serwera i uruchom go przez przeglądarkę z adresu http://www.twojastrona/info.php

Inne użyteczne informacje

Wymienione niżej funkcje PHP uruchomione z pliku PHP, mogą również dostarczyć wielu użytecznych informacji - choć mniej niż wspomniany wyżej phpinfo(). Wiele z nich powinno dać się uruchomić na wielu serwerach, ale niektórzy administratorzy wyłączają część z nich ze względów bezpieczeństwa. Dlatego nie ma pewności, że zawsze dadzą się uruchomić.

Podobnie jak poprzednio utwórz plik z dowolną nazwą ale z rozszerzeniem .php, wklej do niego poniższe linie i prześlij za pomocą FTP na serwer.

<?php
echo "Hostname: ". @php_uname(n) ."";
if (function_exists( 'shell_exec' )) { echo "Hostname: ".
@gethostbyname(trim(`hostname`)); } else { echo "Server IP: ".
$_SERVER['SERVER_ADDR'] .""; }
echo "Platform: ". @php_uname(s) ." ". @php_uname(r) ." ". @php_uname(v) ."";
echo "Architecture: ". @php_uname(m) ."";
echo "Username: ". get_current_user () ." ( UiD: ". getmyuid() .", GiD: ". getmygid() ." )";
echo "Curent Path: ". getcwd () ."";
echo "Server Type: ". $_SERVER['SERVER_SOFTWARE'] . "";
echo "Server Admin: ". $_SERVER['SERVER_ADMIN'] . "";
echo "Server Signature: ". $_SERVER['SERVER_SIGNATURE'] ."";
echo "Server Protocol: ". $_SERVER['SERVER_PROTOCOL'] ."";
echo "Server Mode: ". $_SERVER['GATEWAY_INTERFACE'] ."";
?>

Pomocne w określeniu trybu, w jakim pracuje Twój serwer oraz uzyskaniu szeregu informacji związanych z tematem, włącznie z zaleceniami co do konfiguracji mogą być rozszerzenia:

  • Joomla! HISA lub
  • Joomla! Tools Suite

Joomla! Tools Suite (JTS) jest kompletnym zestawem narzędzi do pomocy w problemach związanych z prowadzeniem systemu Joomla!, który zawiera "HISA" script.

Joomla! Health, Installation and Security Audit (HISA) jest pojedynczym skryptem, który dostarcza informacji tylko o konfiguracji.

Pośrednią, ale niepewną metodą ustalenia, w jakim trybie pracuje Twój serwer, jest sprawdzenie możliwości korzystania z pliku .htaccess. Jeśli nie możesz użyć pliku .htaccess na serwerach Apache pracujących na platformie Linux, to oznacza, że Twój serwer pracuje w trybie CGI albo administrator wyłączył .htaccess, nawet jeśli PHP działa jako moduł Apache. Podkreślamy raz jeszcze, że takie pośrednie wnioskowanie nie daje 100% pewności.

Uwaga !!! Usuń wszystkie wyżej wymienione pliki .php służące do uzyskiwania informacji natychmiast po ich wykorzystaniu, informacje przez nie wygenerowane mają istotne znaczenie dla Twojego PHP i dla konfiguracji serwera, a w konsekwencji dla bezpieczeństwa całej Twojej witryny.

Konfiguracja PHP jako modułu Apache

Dla tych, którzy chcą wiedzieć więcej, "Jak ..."

Aby skonfigurować Apache do ładowania PHP jako modułu do parsowania twoich skryptów PHP należy zmodyfikować plik httpd.conf, typowo umieszczony w "c:\Program Files\Apache Group\Apache\conf\" lub w "/etc/httpd/conf/".

W tym pliku wyszukaj sekcję, która zawiera serię wykomentowanych deklaracji "LoadModule". (Deklaracje z prefiksem "/#" są wykomentowane). Jeżeli PHP działa w trybie "Apache Module" powinieneś zobaczyć coś bardzo podobnego do poniższej linii;

LoadModule php4_module "c:/php/php4apache.dll"
Apache 1.x

Dla PHP5

LoadModule php5_module     C:/php/php5apache2.dll

albo (platformy niezależne)

LoadModule php5_module     /usr/lib/apache/libphp5.so

Dla PHP4

LoadModule php4_module     libexec/libphp4.so

albo (platformy niezależne)

LoadModule php4_module     C:/php/php4apache.dll

oraz

AddModule mod_php4.c

albo

AddModule mod_php5.c
Apache 2.x

Dla PHP5

LoadModule php5_module     C:/php/php5apache2.dll

albo (platformy niezależne)

LoadModule php5_module     /usr/lib/apache/libphp5.so

Dla PHP4

LoadModule php4_module     libexec/libphp4.so

albo (platformy niezależne)

LoadModule php4_module     C:/php/php4apache.dll

oraz

AddModule mod_php5.c

albo

AddModule mod_php4.c 

Uwaga:

Nie martw się, że nie możesz znaleźć gdziekolwiek w systemie pliku "mod_php4.c" albo "mod_php5.c". Ta dyrektywa nie zmusza Apache do wyszukiwania plików w Twoim systemie. Dla ciekawych; specyfikuje ona kolejność, w jakiej różne moduły są ładowane przez serwer Apache.

Jeżeli używasz

Apache 2,x nie musisz wklejać dyrektywy AddModule, nie jest ona w tej wersji potrzebna. Apache 2,x posiada swoją wewnętrzną metodę określania kolejki ładowania modułów.

Teraz znajdź w tym pliku sekcję "AddType", i dodaj następującą linię po ostatniej deklaracji w "AddType"

AddType application/x-httpd-php .php

Jeżeli potrzebujesz włączyć inne typy plików jak "AddType", po prostu dodaj je do listy jak niżej;

AddType application/x-httpd-php .php3
AddType application/x-httpd-php .phtml

Uruchom sprawdzenie błędów i jeśli wszystko jest prawidłowo, restartuj Apache...

Uruchomienie PHP w trybie CGI

Aby skonfigurować PHP jako CGI ponownie musisz zmienić plik httpd.conf, ale najpierw sprawdź czy wyżej wymienione ustawienia nie są już skonfigurowane, zanim będziesz wiedzieć, co robisz, możesz wygenerować sobie błędy "HTTP 500". Wyszukaj w httpd.conf sekcji "ScriptAlias"

Dodaj następującą linię poniżej ScriptAlias dla "cgi-bin".

Uwaga:

Położenie będzie zależało od tego, gdzie PHP zostało zainstalowane na Twoim serwerze, powinieneś zamienić odpowiednią ścieżkę w miejsce "c:/php/" (np. na "c:/Program Files/php/").

ScriptAlias /php/ "c:/php/"

Apache ponownie musi być skonfigurowane dla typu PHP MIME. Wyszukaj sekcję "AddType" i dodaj po niej następującą linię;

AddType application/x-httpd-php .php

Podobnie jak w przypadku działania PHP jako modułu Apache, możesz dodać rozszerzenia, jakie chcesz, które Apache rozpozna jako skrypty PHP, takie jak;

AddType application/x-httpd-php .php3
AddType application/x-httpd-php .phtml

Następnie będziesz musiał "powiedzieć" serwerowi żeby uruchamiał PHP za każdym razem, gdy napotka skrypt PHP. Dodaj następującą linię po istniejących wejściach w sekcji "Action"

Action application/x-httpd-php "/php/php.exe"

Jak zauważyłeś używaliśmy odniesienia "ScriptAlias", część "/php/" będzie rozpoznawana jako scriptAlias skonfigurowany jak wyżej, to jest rodzaj aliasa ścieżki, który będzie korelował z Twoją instalacją PHP uprzednio skonfigurowaną. Innymi słowy nie wklejaj w tę dyrektywę "c:/php/php.exe" lub "c:/Program Files/php/php.exe" wklej;

"/php/php.exe", 

Apache PRZETWORZY to jeżeli zostało prawidłowo skonfigurowane.

Konfiguracja domyślnego pliku indeksu

Ta sekcja odnosi się do wszystkich użytkowników, bez względu na to, czy załadujesz PHP jako moduł czy jako skrypt CGI.

Jeśli chcesz spowodować, aby serwer www uruchamiał domyślnie najpierw skrypt php, musisz w pliku "httpd.conf" zmodyfikować odpowiednio deklarację DirectoryIndex, definiującą nazwę pliku, który jest zwracany, gdy żądanie klienta nie zawiera nazwy pliku. Odszukaj linie rozpoczynające się "DirectoryIndex" i dodaj "index.php" do listy plików po tej linii. Na przykład, linię:

DirectoryIndex index.html

zmień na

DirectoryIndex index.html index.php

jeśli chcesz, aby pliki .html, były wykonywane przed plikami .php

albo

DirectoryIndex index.php index.html

jeśli chcesz, aby pliki .php, były wykonywane przed plikami .html

Następnym razem, kiedy uzyskasz dostęp do witryny albo katalogu w witrynie bez nazwy pliku, Apache będzie automatycznie odczytywać najpierw "index.php", jeśli jest dostępny, albo "index.html", jeśli "index.php" nie będzie dostępny.

Dziękujemy za wkład

» Stefan Wajda [zwiastun],