Jak sprawdzić, dlaczego moja strona nie działa
Spis treści
DNS? Aplikacja? Reverse proxy? A może ruch w ogóle nie dociera do serwera? Można zgadywać i grzebać na chybił trafił, restartując po kolei wszystko, co się nawinie. Można też podejść do tego jak detektyw i sprawdzać krok po kroku, od domeny aż po pakiety wpadające do serwera. Ta druga metoda jest nudniejsza, ale za to działa.
Czy domena w ogóle wskazuje na Twój serwer#
dig przyklad.pl +short
Dostaniesz adres IP, na który domena rozwiązuje się w tej chwili. Porównaj go z adresem swojego serwera. Nie zgadzają się? To problem siedzi w DNS-ie, czyli w złym rekordzie A/AAAA w panelu domeny albo w Cloudflare. Ruch nawet nie dochodzi do Twojego VPS-a.
Podejrzewasz, że zmiana DNS jeszcze się nie rozeszła po świecie? Zapytaj bezpośrednio konkretny serwer DNS, na przykład Google’a, z pominięciem cache u Twojego dostawcy internetu:
dig @8.8.8.8 przyklad.pl +short
Czy aplikacja w ogóle działa lokalnie#
Zanim zaczniesz rzucać podejrzenia na reverse proxy czy firewall, sprawdź najprostszą rzecz: czy sama aplikacja odpowiada, bezpośrednio na serwerze, z pominięciem całej reszty:
curl -v http://localhost:3000/
-v pokazuje cały przebieg połączenia: nawiązanie, wysłane nagłówki, odpowiedź. Jeśli tu wszystko gra, aplikacja jest niewinna i problem leży gdzieś dalej.
A jeśli przed aplikacją stoi reverse proxy, które rozpoznaje strony po nazwie domeny (virtual host)? Wtedy możesz udać konkretną domenę prosto z terminala, bez ruszania DNS-u, podając nagłówek Host:
curl -s -o /dev/null -w "%{http_code}\n" -H "Host: przyklad.pl" http://127.0.0.1/
200 oznacza, że proxy znalazło tę domenę i ją obsłużyło. 502, 404 albo 000 (brak odpowiedzi) mówią, że coś jest nie tak z konfiguracją reverse proxy. I to zanim w ogóle w grę wejdzie prawdziwy ruch z internetu.
Sprawdzanie reverse proxy (nginx/Apache)#
Na początek składnia konfiguracji:
sudo nginx -t
Dla Apache odpowiednikiem jest sudo apache2ctl configtest.
Składnia w porządku, a strona dalej leży? Pora zajrzeć do logu błędów. Nginx jest tam zaskakująco rozmowny i zwykle mówi wprost, co mu nie pasuje:
sudo tail -f /var/log/nginx/error.log
Taki wpis zobaczysz, gdy nginx działa, ale aplikacja za nim (backend) leży:
connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:9999/", host: "localhost"
Czytamy: nginx dostał żądanie, próbował przekazać je pod 127.0.0.1:9999, a tam nikt nie odebrał. Sprawdź wtedy, czy aplikacja naprawdę działa i czy proxy_pass w konfiguracji nginx celuje we właściwy port.
Czy ruch z internetu w ogóle dociera do serwera#
Ostatnia deska ratunku. Lokalnie wszystko wygląda dobrze, a z zewnątrz strona dalej milczy. Czas zobaczyć na żywo, czy pakiety w ogóle do serwera docierają:
sudo tcpdump -i eth0 -n port 80
Zostaw to włączone, a w drugim oknie albo z telefonu spróbuj wejść na stronę.
Widzisz w tcpdump przychodzące pakiety (Flags [S] to próba nawiązania połączenia)? Ruch dociera, więc problem jest po stronie serwera: w aplikacji albo w proxy.
Cisza? Ruch w ogóle nie dochodzi. Sprawdź firewall (UFW/iptables) i to, czy w panelu Mikrusa masz otwarty i przekierowany właściwy port.
Podglądanie kończysz Ctrl+C.
Najczęstsze błędy#
curl localhost działa, więc “przecież działa”. To, że coś odpowiada lokalnie, nie znaczy, że odpowiada światu. Firewall albo przekierowanie portów mogą blokować ruch z sieci i w ogóle nie dotykać ruchu lokalnego.
DNS sprawdzony z własnego komputera, więc “u wszystkich jest tak samo”. Nie jest. DNS potrafi wyglądać różnie zależnie od operatora i lokalizacji, zwłaszcza tuż po zmianie rekordu. dig @8.8.8.8 daje wynik pewniejszy i niezależny od Twojego cache.
Pomijanie logu błędów proxy. nginx -t sprawdza tylko składnię, nie to, czy backend odpowiada. Prawdziwą przyczynę prawie zawsze widać dopiero w error.log.
Jeśli szukasz miejsca dla swoich developerskich potrzeb, to zapoznaj się z ofertą serwerów VPS od Mikrusa.
SerweryVPS już od 35 zł rocznie.
Dowiedz się więcej