Troubleshooting Apache
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 |
# emerge -aCv '=www-servers/apache-2*'
# emerge -av '=dev-libs/apr-0*' '=dev-libs/apr-util-0*'
# emerge -av '=www-servers/apache-2*'
$ 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
# 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 |
APACHE2_OPTS="-D PHP5 -D USERDIR -D SSL"
APACHE2_OPTS=""
|
Listing 3.3: Restartowanie Apache |
# /etc/init.d/apache2 stop
# 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 |
CFLAGS="-O2 -mcpu=pentium3 -march=pentium3 -pipe"
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 |
# cd /etc/apache2/
# 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.
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|