Dziś, podczas rutynowej aktualizacji serwerów VPS, zgodnie ze wskazaniami systemu – wykonałałem restart kolejnych serwerów. Wszystkie uruchomiły się prawidłowo, na prawie wszystkich uruchomiły się również wszystkie wymagane usługi. Problem był z jednym serwerem – nie wystartowała usługa webserwera Nginx. Skrypt działający na serwerze i podejmujące proste próby naprawy w takiej sytuacji (głównie restart usług + monit) też nie był w stanie automatycznie uporać się z problemem. Po zalogowaniu się do konsoli po SSH i ręcznej próbie startu usługi otrzymałem komunikat, który już kiedyś widziałem, choć tym razem przyczyna musiała być inna…

Nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)

Pierwsza czynność w takim przypadku, która sama się nasuwa, i często jest też najprostszym i najszybszym sposobem na rozwiązanie problemu, to (ponowny) restart systemu/serwera. Tym razem nic to nie dało, błąd pojawiał się nadal, i to, pomimo że sam test konfiguracji Nginx wypadał poprawnie:

Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

Wykonanie sugerowanego polecenia (wraz z dodatkowym elementem filtrującym) dawało wyniki w stylu:

patryk@vps01:~$ sudo journalctl -xe | grep "nginx"
nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)

Jest to jakaś wskazówka, można by w tym momencie zabrać się do przeglądania konfiguracji Nginx, a konkretnie skonfigurowanych vHostów. Ale z racji tego, że jest to dość ważny serwer (działa na nim choćby strona Webinsider.pl), to w innej lokalizacji mam jego awaryjną kopię, synchronizowaną za pomocą programu Rsync i SSH.

Nie jest to pełna synchronizacja systemu, bo oba serwer VPS działają na innej wirtualizacji, ale podstawowych usług, takich jak np. Nginx, PHP czy MySQL + bazy danych i katalog z plikami stron WWW. Wymuszenie szybkiej synchronizacji, czyli przesłania ustawień na serwer pomocniczy i test, czy tam będzie podobny problem pokazał, że z samą konfiguracją vHostów w Nginx wszystko jest OK. W takim razie problem musiał tkwić gdzieś indziej…

W tym momencie zostaje zabawa w ubijanie procesów, zwalnianie portów itp., ale już kiedyś na innej maszynie to przerabialiśmy ze znajomym, przy okazji weryfikując kolejne poradniki dostępne w internecie, i… tracąc czas. Dlatego moim zdaniem w przypadku takiego błędu najlepiej (i najszybciej) przeinstalować Nginxa, co nie zajmuje nawet 5 minut, a jest duża szansa, że rozwiąże problem. A już na pewnie nie zaszkodzi, jak i sama potencjalna strata czasu nie będzie specjalnie odczuwalna.

Z racji tego, że konfiguracji webserwera byłem pewien (test na zapasowej maszynie), to postanowiłem zachować całą konfigurację Nginx – mam na serwerze dużo różnych stron, do tego miejscami konfiguracja jest dość specyficzna, więc to spora oszczędność czasu i pracy.

Dlatego najpierw kopia istniejącego katalogu z ustawieniami Nginx:

sudo cp -avr /etc/nginx /etc/nginx_old

Następnie odinstalowanie z jednoczesnym kasowaniem ustawień (na wszelki wypadek):

sudo apt-get purge nginx nginx-common
sudo apt-get autoremove

Ponowna instalacja:

sudo apt-get install nginx

Test czy usługa startuje poprawnie (restart):

sudo systemctl restart nginx

Wszystko działa poprawnie, więc można przywrócić stare ustawienia:

sudo rm -rf /etc/nginx
sudo mv /etc/nginx_old /etc/nginx

Po tej operacji jeszcze jeden restart, by sprawdzić, czy wszystko działa i by Nginx mógł zaciągnąć pliki konfiguracyjne. I jak przewidywałem (i testowałem) wszystko wróciło do normy, również po restarcie serwera.

Oczywiście nie zawsze ten sposób pomoże, bo czasem faktycznie problem może być w konfiguracji vHostów (plików konfiguracyjnych), ale wtedy zazwyczaj odpowiedni komunikat wyrzuci procedura testująca konfigurację, z której zawsze warto skorzystać przed restartem Nginxa:

sudo nginx -t

Można też szukać konkretnej przyczyny, ale… jak już pisałem, zazwyczaj zmarnujemy na to więcej czasu i energii, niż na reinstalację webserwera.

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk