localhost не открывается — почему «отказано в соединении» и как починить

Запустил проект, открыл в браузере localhost:3000 — а там «Не удаётся открыть страницу» или ERR_CONNECTION_REFUSED. Первая мысль обычно: «всё, сломал интернет» или «руки кривые».
Спокойно. Интернет тут вообще ни при чём, и в 90% случаев это одна из трёх банальных причин. Сначала поймём, что значит эта надпись, — а дальше пройдёмся по причинам сверху вниз, от самой частой.
Что значит «отказано в соединении»
localhost — это твой собственный компьютер. Не сайт в интернете, а адрес «сюда же, ко мне» (то же самое, что 127.0.0.1). Подробнее — в разборе что такое localhost.
А localhost:3000 — это «постучись ко мне в дверь номер 3000». Эта дверь — порт. «Отказано в соединении» значит ровно одно: ты постучал, а за дверью никого нет. Не «сломалось», а «некому ответить». Дальше — три причины, почему за дверью пусто.
Причина 1. Сервер не запущен
Самая частая, почти всегда дело в ней.
Браузер не показывает страницу сам — её отдаёт твоя программа (сервер), которую надо запустить и не закрывать. Если ты не запускал команду старта, закрыл терминал, или программа упала с ошибкой — за дверью пусто, отсюда и отказ.
- Как проверить. Посмотри в терминал, где запускал проект. Видишь строку вроде
Local: http://localhost:3000илиready— сервер жив. Видишь приглашение командной строки или красную ошибку — он не работает. - Как починить. Запусти команду старта заново (обычно
npm run dev,npm startили то, что написано в инструкции проекта). Терминал не закрывай — пока он открыт, сервер живёт. Появилась ошибка при старте — читай её: проблема в коде, а не в браузере.
Причина 2. Не тот порт
Сервер запущен, но ты стучишься не в ту дверь.
Проект может работать на 3000, а ты по привычке открыл 8080. Или наоборот. По нужному адресу — пусто, и снова «отказано».
- Как проверить. Возьми адрес из терминала, а не из головы. При старте сервер прямо пишет, на каком порту он живёт:
http://localhost:5173,:8000,:3000— у разных инструментов по-разному. - Как починить. Открой в браузере ровно тот адрес, что показал терминал. Просто скопируй его оттуда. Звучит как мелочь, но именно на этом спотыкаются чаще всего.
Причина 3. Порт занят другим процессом
Бывает обратное: сервер не стартует, потому что нужная дверь уже занята.
Если ты раньше запускал проект и закрыл окно, не остановив его как надо, старый процесс мог зависнуть и продолжать держать порт. Новый запуск ругается: port already in use (EADDRINUSE).
- Как проверить. При старте в терминале видна ошибка со словами «address already in use» или «port 3000 is already in use».
- Как починить. Два пути. Простой — запусти проект на другом порту (многие инструменты сами предложат: «порт занят, использовать 3001?» — соглашайся). Чистый — найди и закрой зависший процесс: на macOS и Linux это
lsof -i :3000, чтобы увидеть, кто держит порт, иkill <номер>, чтобы его остановить. На Windows проще перезагрузиться или закрыть лишний терминал.
Если прошёлся по всем трём, а дверь по-прежнему пуста — почти наверняка дело в первой: сервер всё-таки не запущен или упал. Вернись к терминалу и читай, что он пишет.
localhost и 127.0.0.1 — это одно и то же?
По сути да. Оба означают «этот же компьютер». localhost — имя, 127.0.0.1 — числовой адрес, на который это имя указывает. Иногда помогает попробовать 127.0.0.1:3000 вместо localhost:3000: если первое открывается, а второе нет — затык в локальных настройках имён, но сам сервер при этом точно работает.
Почему один порт работает, а другой нет?
Потому что на каждом порту «сидит» своя программа. localhost:3000 отвечает, только если на 3000 что-то запущено; localhost:8080 будет пустым, если там никого нет. Это не сбой — просто разные двери. И это совсем не то же, что ошибка 500, где сервер ответил, но упал внутри, или падающий деплой, где проблема уже на боевом сервере, а не у тебя.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





