Gentoo Logo

Troubleshooting Apache

Spis treści:

1.  Przeszukiwanie dziennika

Jeżeli wiadomo, że instalacja Apache jest uszkodzona, ale nie wiadomo w jaki sposób, to szukanie błędów należy rozpocząć od przeglądania plików dziennika (logów).

Apache zazwyczaj zakłada kilka takich plików i wszystkie znajdują się wewnątrz katalogu /var/log/apache2/. Niektóre z nich mogą na danym systemie nie istnieć - zależy to od zainstalowanych modułów.

access_log i ssl_access_log

Listing 1.1: access_log

67.185.0.236 - - [18/Jun/2005:12:05:50 -0700] "GET / HTTP/1.0" 200 721
10.0.1.80 - - [18/Jun/2005:12:11:07 -0700] "GET /~jaspenelle/__journal1.jpg HTTP/1.1" 200 19079
66.239.233.163 - - [18/Jun/2005:12:15:06 -0700] "GET /~jaspenelle/avy14.gif HTTP/1.0" 200 1661
67.185.60.155 - - [18/Jun/2005:12:18:48 -0700] "GET / HTTP/1.0" 200 721
67.185.0.236 - - [18/Jun/2005:12:25:39 -0700] "GET / HTTP/1.0" 200 721
10.0.1.80 - - [18/Jun/2005:12:28:04 -0700] "GET /~jaspenelle/avy14.gif HTTP/1.1" 200 1661
10.0.1.80 - - [18/Jun/2005:12:28:46 -0700] "GET /~jaspenelle/avy7.png HTTP/1.1" 200 13066

Zawartość tego pliku to lista wszystkich zapytań jakie otrzymał dany serwer. O ile domyślna konfiguracja nie została zmieniona, to będzie on zapisany w ogólnym formacie dziennika.

Listing 1.2: Składnia ogólnego formatu dziennika

remotehost rfc931 authuser [date] "request" status bytes
remotehost Nazwa zdalnego komputera lub jego numer IP
rfc931 Login użytkownika na zdalnym komputerze
authuser Login jako który użytkownik się autoryzował
[date] Data oraz czas zapytania
"request" Wiersz zapytania w dokładnie takiej formie, w jakiej przyszedł od klienta
status Wartość statusu HTTP zwrócona do klienta
bytes Długość przekazanego dokumentu

error_log i ssl_error_log

Listing 1.3: error_log

[Mon Feb 07 23:33:18 2005] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec2)
[Mon Feb 07 23:33:18 2005] [notice] Digest: generating secret for digest authentication ...
[Mon Feb 07 23:33:18 2005] [notice] Digest: done
[Mon Feb 07 23:33:18 2005] [notice] Apache/2.0.52 (Gentoo/Linux) PHP/4.3.10 configured -- resuming normal operations
[Sat Jun 18 13:01:54 2005] [error] [client 10.0.1.80] File does not exist: /var/www/localhost/htdocs/favicon.ico
[Sat Jun 18 13:02:14 2005] [error] [client 10.0.1.80] File does not exist: /var/www/localhost/htdocs/favicon.ico
[Sat Jun 18 13:02:18 2005] [error] [client 10.0.1.80] File does not exist: /var/www/localhost/htdocs/favicon.ico
[Sat Jun 18 13:02:21 2005] [error] [client 10.0.1.80] File does not exist: /var/www/localhost/htdocs/favicon.ico
[Sat Jun 18 13:02:24 2005] [error] [client 10.0.1.80] File does not exist: /var/www/localhost/htdocs/favicon.ico

Jak widać, ten plik może zawierać bardzo wiele wpisów, zależnie od dyrektywy ErrorLevel w httpd.conf. Jest w nim zapisane czy Apache poprawnie wystartował, jakie wystąpiły błędy i tak dalej. W uproszczeniu zapisuje on wszystkie nietypowe sytuacje. Jeżeli coś nie działa to właśnie ten plik powinno się sprawdzić najpierw.

suexec_log

Listing 1.4: suexec_log

[2005-02-11 22:33:19]: uid: (1000/vericgar) gid: (1000/1000) cmd: test.cgi
[2005-03-11 19:20:13]: uid: (1000/vericgar) gid: (1000/1000) cmd: test.cgi
[2005-03-11 19:34:47]: uid: (1000/vericgar) gid: (1000/1000) cmd: test.cgi

Ten plik zawiera wpis dla każdego wykonania skryptu przy pomocy CGI oraz suexec. Jeżeli jakiś skrypt nie współpracuje z suexec to właśnie ten plik powinno się sprawdzić najpierw, gdyż zazwyczaj będzie on zawierał wiersz z wypisaną przyczyną, dla której odmówiono współpracy.

2.  Zainstalowany moduł nie działa!

Samo zainstalowanie modułu nie wystarcza - musi on zostać wyraźnie włączony. Jest tak, aby łatwiej było włączać i wyłączać moduły, dzięki czemu łatwiej jest znaleźć te, które sprawiają problemy oraz łatwiej jest je testować oraz wyłączać.

Kiedy moduł zostanie zainstalowany, powinien pojawić się komunikat podobny do tego:

Listing 2.1: Wiadomość po zainstalowaniu modułu

 *
 * To enable mod_layout, you need to edit your /etc/conf.d/apache2 file and
 * add '-D LAYOUT' to APACHE2_OPTS.
 *
 *
 * Configuration file installed as
 *     /etc/apache2/modules.d/15_mod_layout.conf
 * You may want to edit it before turning the module on in /etc/conf.d/apache2
 *

Opis ten mówi wprost co należy zrobić, aby uruchomić dany moduł.

W razie braku wiadomości jest jeszcze inny sposób sprawdzenia, co należy dodać do APACHE2_OPTS w /etc/conf.d/apache2: sprawdzenie pliku konfiguracyjnego zainstalowanego przez moduł. Powinien on się znajdować w /etc/apache2/modules.d/. Należy w nim odnaleźć wiersz w którym znajduje się IfDefine:

Listing 2.2: Wyciąg z 15_mod_layout.conf

<IfDefine LAYOUT>
  <IfModule !mod_layout.c>
    LoadModule layout_module    modules/mod_layout.so
  </IfModule>
</IfDefine>

Blok IfDefine jest wykonywany kiedy doda się -D LAYOUT do /etc/conf.d/apache2. LAYOUT jest tylko przykładem.

Kilka opcji które można dodać do APACHE2_OPTS jest zdefiniowanych w domyślnej konfiguracji. Ich szczegółowy opis można znaleźć w pliku /etc/conf.d/apache2.

Dokumentacja wszystkich wbudowanych modułów znajduje się w dokumentacji Apache 2.0.

3.  Apache zwraca tylko puste strony lub zwraca błąd "naruszenie ochrony pamięci" (segfault)

Najczęściej dzieje się tak po aktualizacji, gdy złamana została binarna kompatybilnośćw APR (co może zdarzyć się z wielu przyczyn). Aby to naprawić konieczne będzie przebudowanie stosu narzędzi Apache:

Listing 3.1: Przebudowywanie stosu narzędzie Apache

(Koniecznie należy wykonać to w tej kolejności, to naprawdę ważne!)

(Najpierw usuwamy istniejącego Apache)
# emerge -aCv '=www-servers/apache-2*'

(Następnie przebudowujemy stos narzędzi)
# emerge -av '=dev-libs/apr-0*' '=dev-libs/apr-util-0*'

(Następnie ponownie instalujemy Apache)
# emerge -av '=www-servers/apache-2*'

(Ustalamy, które pakiety polegają na Apache)
$ equery depends www-servers/apache
[ Searching for packages depending on www-servers/apache... ]
dev-php/phpsysinfo-2.3-r2
dev-php/phpsysinfo-2.1-r2
dev-lang/php-5.2.4_p20070914-r2
net-www/mod_layout-4.0.1a-r1
www-servers/gorg-0.5

(Następnie budujemy ponownie te, które są zainstalowane)
# emerge -av '=dev-lang/php-5.2.4_p20070914-r2' '=net-www/mod_layout-4.0.1.a-r1'

Lokaliwozanie uszkodzonego modułu

Jeśli po wykonaniu powyższych instrukcji problem nadal występuje, to winowajcą jest prawdopodobnie jeden z zainstalowanych modułów dodatkowych.

Najpierw wyłączamy wszystkie moduły i restartujemy Apache.

Listing 3.2: Wyłączanie dodatkowych modułów

(Modyfikujemy /etc/conf.d/apache2)

(Przed zmianą)
APACHE2_OPTS="-D PHP5 -D USERDIR -D SSL"

(Po zmianie)
APACHE2_OPTS=""

Listing 3.3: Restartowanie Apache

# /etc/init.d/apache2 stop
(Należy się upewnić, że Apache jest całkowicie zatrzymane)
# ps -A
# /etc/init.d/apache2 start

Uwaga: Być może konieczne będzie dokonanie drobnych zmian w konfiguracji jeśli wykorzystane były dyrektywy które te moduły zapewniają w miejscach, które nie testują czy dany moduł jest załadowany. Zaleca się, aby umieszczać je zawsze w kontenerach testowych. Przykłady można znaleźć w plikach .conf w /etc/apache2/modules.d.

Jeżeli Apache przestaje segfaultować oraz wysyłać puste strony to można być pewnym, że problemem był jeden z modułów dodatkowych. Aby sprawdzić który z nich, dodajemy je z powrotem, po jednym, za każdym razem całkowicie restartując Apache.

Jeżeli Apache przestanie działać po dodaniu konkretnego modułu, to wiadomo, że to właśnie on sprawiał problemy. Czasem zwyczajne przebudowanie modułu rozwiąże kłopoty.

Jeżeli po przebudowaniu modułu i zrestartowaniu Apache nadal występują te same problemy, to należy zgłosić błąd wymieniający konkretną wersję i aktualizację modułu oraz wspomnieć o tym, czy segfaultuje. Najpierw należy poszukać już zgłoszonych błędów!

4.  Serwer nie przetwarza skryptów PHP lub CGI, zamiast tego wyświetla ich kod

W większości przypadków sytuacja, kiedy apache wyświetla kod skryptu zamiast go uruchomić, mimo włączenia odpowiednich modułów w pliku /etc/conf.d/apache2, jest spowodowana problemem ze starym cache po stronie przeglądarki.

Często problem pojawia się, gdy łączymy się z serwerem poprzez jego nazwę DNS, a znika, gdy wybierzemy jego numer IP. W takim wypadku niemal na pewno jest to problem z cache.

Ten problem można rozwiązać czyszcząc cache przeglądarki.

5.  configure: error: changes in the environment can compromise the build

Jeśli zdarza się taki błąd, to prawdopodobnie w CFLAGS w /etc/make.conf znajdują się zbędne spacje. Poprawka jest prosta - należy usunąć dodatkowe spacje:

Listing 5.1: Przykładowe zmiany w /etc/make.conf

(Przed zmianą)
CFLAGS="-O2 -mcpu=pentium3 -march=pentium3  -pipe"

(Po zmianie)
CFLAGS="-O2 -mcpu=pentium3 -march=pentium3 -pipe"

6.  Address already in use: make_sock: could not bind to address 0.0.0.0:443

Taki błąd zdarza się podczas startu i jest wywołany przez istnienie w konfiguracji kilku wzajemnie niekompatybilnych dyrektyw Listen. Rozwiązaniem tego problemu powinno być wyszukanie w konfiguracji Listen oraz naprawienie każdego wystąpienia.

Listing 6.1: Znajdowanie wszystkich dyrektyw Listen

(Upewnienie się, że znajduje sięw katalogu konfiguracji)
# cd /etc/apache2/

(Wyszukanie wszystkich dyrektyw Listen)
# grep Listen httpd.conf vhosts.d/*.conf modules.d/*.conf

Poszukujemy konfliktów między tym, do czego próbuje dowiązać się Apache. Na przykład, jeżeli w httpd.conf znajduje się wpis Listen 80, a w innym pliku można znaleźć Listen 10.0.0.15:80, to serwer nie będzie w stanie wystartować. Dzieje się tak ponieważ Apache najpierw dowiązuje się do portu 80 na wszystkich adresach IP dostępnych na komputerze, a następnie do portu 80 na adresie 10.0.0.15, co nie udaje się, gdyż jest on już wykorzystany.

Zalecaną konfiguracją jest umieszczenie pojedynczej dyrektywy Listen 80 (tak jest w domyślnym httpd.conf) tak, aby dowiązać się na wszystkich adresach do standardowego portu HTTP, a następnie dla każdego VirtualHost z SSL stworzyć oddzielną bezwzględną dyrektywę Listen (na przykład Listen 10.0.0.15:443).

7.  Po aktualizacji do apache-2.0.54-r13 domyślne vhosty (SSL i nie-SSL) już nie działają

W aktualizacji do apache-2.0.54-r13 dodano dwie nowe dyrektywy aby poprawić błąd 100624.

Nowe dyrektywy to -D DEFAULT_VHOST dla aktywacji domyślnego vhosta oraz -D SSL_DEFAULT_VHOST dla aktywacji wersji z SSL. Obydwie muszą zostać dodane do APACHE2_OPTS w /etc/conf.d/apache2 jeżeli Apache ma się zachowywać tak, jak dawniej.

8.  Szukanie wsparcia

Jeżeli żadna z powyższych rad nie pomogła w rozwiązaniu problemu lub jeśli występuje potrzeba zadania innych pytań, zawsze można skorzystać z kanału #gentoo-apache na irc.freenode.net. Można też zgłosić błąd na Bugzilli Gentoo.



Drukuj

Zaktualizowano 29 listopada 2007

Podsumowanie: W tym dokumencie opisane zostało kilka sposobów znajdowania i rozwiązywania problemów z Apache.

Michael Stewart
Author

Elfyn McBratney
Contributor

Bryan Østergaard
Contributor

Benedikt Böhm
Contributor

Aleksander Kamil Modzelewski
Tłumacz

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.