ERR_EMPTY_RESPONSE 오류 원인과 해결 방법

Advertisement
ERR_EMPTY_RESPONSE란?
ERR_EMPTY_RESPONSE는 '이 페이지는 작동하지 않습니다. example.com에서 전송한 데이터가 없습니다.'(영문: "This page isn't working. example.com didn't send any data.")라고 표시되는 Chrome·Edge 오류 페이지입니다. Chromium 내부에서는 네트워크 오류 -324이며, "The server closed the connection without sending any data", 즉 서버가 아무 데이터도 보내지 않고 연결을 닫았다고 정의되어 있습니다.
브라우저는 대부분의 연결 오류보다 더 멀리 진행했습니다. 주소가 확인되었고, 연결이 열렸고, 브라우저가 요청을 보냈습니다. 그런데 서버, 또는 서버 앞단의 무언가가 빈 응답으로 연결을 닫은 것입니다. 상태 코드도, 헤더도, 페이지도 없습니다. Chromium 코드는 새 연결이 0바이트로 닫힐 때만 이 오류를 사용합니다. 재사용하던 오래된 연결이 닫힐 때는 Chrome이 조용히 다시 시도합니다.
요청이 실제로 전달되었기 때문에, ERR_EMPTY_RESPONSE는 대개 서버 쪽을 가리킵니다. 요청을 처리하다 크래시한 앱, 의도적으로 연결을 끊는 규칙, 연결은 받았지만 뒤에 아무것도 없는 서비스 등입니다. 내 컴퓨터의 몇 가지 원인으로도 발생할 수 있습니다.
ERR_EMPTY_RESPONSE의 원인
| 원인 | 위치 | 단서 |
|---|---|---|
| 요청 처리 중 앱이 크래시하거나 강제 종료됨 | 서버 | 모두에게 실패하며, 주로 무거운 특정 페이지에서 발생 |
| 연결을 끊는 규칙(nginx return 444, WAF, 봇 차단) | 서버 | 일부 방문자, IP, User-Agent에서만 실패 |
| 뒤에서 수신 대기하는 것이 없는 포트 포워딩(Docker, 로드 밸런서) | 서버 / 개발자 | 포트는 열려 있지만 모든 요청이 빈 응답을 반환 |
| HTTPS만 사용하는 포트로 http:// 요청 | 개발자 | https://로는 되고 http://로는 실패 |
| VPN, 프록시, 백신 HTTPS 검사 | 내 기기 | 내 기기나 내 네트워크에서만 실패 |
| 서버가 처리하기에 너무 큰 요청이나 헤더 | 서버 | 로그인 후 또는 쿠키가 많을 때 실패 |
Advertisement
해결 방법 1: 새로고침 후 시크릿 창에서 열기
서버가 하필 그 순간에 재시작되었다면 몇 초 뒤 새로고침하는 것만으로 충분합니다. 오류가 반복된다면 시크릿 창(Ctrl + Shift + N, Mac Cmd + Shift + N)에서 페이지를 열어 보세요. 시크릿 창은 쿠키와 확장 프로그램 없이 시작되므로, 브라우저에 저장된 무언가가 관련되어 있는지 빠르게 알 수 있습니다.
그다음 사이트가 모두에게 다운되었는지 확인하세요. DNS Robot의 HTTP 헤더 확인 도구는 저희 서버에서 페이지를 요청합니다. 저희 쪽에서 정상 응답을 받는다면 문제는 나와 사이트 사이에 있습니다. 저희 쪽에서도 아무것도 받지 못한다면 사이트 자체가 실패하고 있는 것입니다.
해결 방법 2: VPN, 프록시, HTTPS 검사 끄기
연결의 중간에 자리 잡은 것은 무엇이든 요청을 받은 뒤 응답을 전달하지 않고 연결을 닫을 수 있습니다:
VPN: 연결을 완전히 끊고 새로고침하세요.
프록시: Windows 11에서는 설정 → 네트워크 및 인터넷 → 프록시 → 프록시 서버 사용을 끄세요. Mac에서는 시스템 설정 → 네트워크 → 사용 중인 연결 → 세부사항… → 프록시로 이동하세요.
백신 HTTPS 검사: 웹 또는 HTTPS 검사 기능(HTTPS 검사, 웹 실드(Web Shield), SSL/TLS 프로토콜 필터링 등으로 불림)만 끄고 새로고침하세요. 그것으로 해결된다면 해당 사이트를 예외로 추가하고 검사를 다시 켜세요.
Advertisement
해결 방법 3: 사이트 데이터 삭제 및 확장 프로그램 끄기
아주 크거나 손상된 쿠키 때문에 서버가 응답하는 대신 요청을 끊을 수 있으며, 이 경우 로그인한 뒤에만 오류가 나타나는 경우가 많습니다. 해당 사이트의 쿠키를 지우세요: 주소창 왼쪽 아이콘 클릭 → 쿠키 및 사이트 데이터(또는 사이트 설정) → 데이터 삭제 후 다시 로그인.
다음으로 chrome://extensions에서 모든 확장 프로그램을 끄고 새로고침하세요. 하나씩 다시 켜 가며 방해하는 확장 프로그램을 찾으세요. 광고 차단기, 개인정보 보호 도구, 요청을 수정하는 확장 프로그램인 경우가 많습니다.
해결 방법 4: DNS 플러시 및 네트워크 스택 초기화
한 컴퓨터에서 모든 사이트가 빈 응답을 준다면 그 컴퓨터의 네트워크 구성을 초기화하세요. Windows에서는 관리자 권한 명령 프롬프트에서 아래 명령을 실행한 뒤 재시작하세요. Mac에서는 DNS 캐시를 플러시하고 Wi-Fi 네트워크를 삭제한 뒤 다시 추가하세요.
ipconfig /flushdns
netsh winsock reset
netsh int ip reset
ipconfig /release
ipconfig /renew휴대폰의 모바일 데이터 같은 다른 네트워크에서도 시도해 보세요. 거기서 사이트가 열린다면 평소 쓰는 네트워크(학교, 회사, ISP)의 필터가 연결을 끊고 있을 수 있습니다.
Advertisement
localhost와 Docker에서 발생하는 ERR_EMPTY_RESPONSE
개발자들은 이 오류를 자기 컴퓨터에서 가장 자주 봅니다. 흔한 원인은 다음과 같습니다:
Docker 컨테이너 안의 앱이 127.0.0.1에서 수신 대기함. 컨테이너 안에서
127.0.0.1은 '이 컨테이너만'을 뜻하므로, Docker의 포트 포워딩이 연결할 대상이 없어 브라우저는 빈 응답(설정에 따라서는 연결 리셋)을 받습니다. 컨테이너 안에서 앱이0.0.0.0에서 수신 대기하도록 하세요. 예:next dev -H 0.0.0.0,vite --host 0.0.0.0,flask run --host=0.0.0.0,uvicorn main:app --host 0.0.0.0.컨테이너 포트 매핑이 맞지 않음.
-p 8080:3000은 내 컴퓨터의 8080 포트를 컨테이너 내부의 3000 포트로 전달합니다. 앱이 실제로는 5000에서 수신 대기한다면 모든 요청이 빈 응답으로 돌아옵니다.HTTPS 전용 포트에 http://로 접속함. 일부 서버는 포트에서 TLS를 기대하다가 일반 HTTP가 들어오면 그냥 연결을 끊습니다.
http://대신https://localhost:8443으로 시도해 보세요.요청 처리 중 개발 서버가 크래시함. 개발 서버를 실행 중인 터미널을 확인하세요. 그 순간의 예외나 메모리 부족 오류가 답입니다.
# 브라우저 없이 재현하기
curl -v http://localhost:8080/
# "Empty reply from server" = 연결은 수락됐지만 아무것도 돌아오지 않음
# 컨테이너가 어떤 포트를 게시하고, 내부에서는 무엇이 수신 대기 중인가?
docker ps --format "table {{.Names}}\t{{.Ports}}"
docker exec -it <container> sh -c "netstat -tlnp 2>/dev/null || ss -tlnp"웹사이트 운영자용: 서버가 빈 응답을 보내는 이유
크래시와 메모리 부족 종료. 요청을 처리하던 프로세스가 죽으면 아무것도 보내지 못한 채 연결이 닫힙니다. 앱 로그를 확인하고, Linux OOM(메모리 부족) 킬러는
dmesg -T | grep -i "killed process"로 확인하세요. 특히 무거운 페이지와 업로드에서 자주 발생합니다.의도적인 연결 끊기. nginx의 특수 지시어
return 444;는 아무 응답 없이 연결을 닫으며, 악성 봇이나 알 수 없는 호스트 이름을 차단하는 데 자주 쓰입니다. 이런 규칙(너무 넓은 User-Agent 규칙이나 GeoIP 규칙)이 실제 방문자에게 적용되면, 방문자에게는 ERR_EMPTY_RESPONSE가 표시됩니다. HTTP/2 연결에서는 nginx가 대신 스트림을 리셋하므로 ERR_HTTP2_PROTOCOL_ERROR가 표시됩니다. WAF, 속도 제한기, 봇 차단 서비스도 같은 일을 할 수 있습니다.백엔드가 없는 포트 포워딩과 로드 밸런서. 연결은 받지만 뒤에 정상 서버가 없는 리스너는 빈 응답으로 연결을 닫을 수 있습니다. 대상 서버의 상태(health)와 백엔드 포트가 일치하는지 확인하세요.
응답 대신 연결을 닫는 타임아웃. 오래 걸리는 요청이 소켓을 조용히 닫지 말고 504 같은 적절한 오류를 반환하도록 하세요. 그래야 방문자와 모니터링 도구가 무슨 일이 일어났는지 알 수 있습니다.
너무 큰 요청. 아주 큰 헤더나 쿠키는 일부 서버가 요청을 끊게 만들 수 있습니다. 쿠키를 작게 유지하세요.
# 연결을 끊는 규칙이 있나요?
sudo grep -rn "return 444" /etc/nginx/
# 방문자가 연결하는 방식대로 외부에서 테스트
curl -sv https://yourdomain.com/ -o /dev/nullAdvertisement
ERR_EMPTY_RESPONSE와 비슷한 오류 비교
| 오류 | 코드 | 무슨 일이 일어났나 |
|---|---|---|
| ERR_EMPTY_RESPONSE | -324 | 요청은 전송됐지만 0바이트만 돌아온 채 연결이 닫힘 |
| ERR_CONNECTION_CLOSED | -100 | 요청을 보내기 전에 닫힘. 보통 HTTPS 핸드셰이크 도중 |
| ERR_CONNECTION_RESET | -101 | TCP 리셋으로 연결이 갑자기 끊김 |
| 502 Bad Gateway | HTTP | 프록시는 응답했지만 업스트림 앱이 실패함 |
관련 가이드: ERR_CONNECTION_CLOSED, ERR_CONNECTION_RESET, 502 Bad Gateway, 500 Internal Server Error. 서버의 포트가 외부 연결을 받는지 확인하려면 포트 확인 도구를 사용하세요.
내 네트워크 밖에서도 서버가 응답하나요?
DNS Robot의 포트 확인 도구는 도메인의 443 또는 80 포트가 저희 서버의 연결을 받는지 테스트합니다. HTTP 헤더 확인 도구와 함께 사용하면 서버가 실제 응답을 보내는지 알 수 있습니다.
사용해보기 포트 확인 도구Advertisement
자주 묻는 질문
브라우저가 서버에 연결해 요청을 보냈는데, 서버가 상태 코드도, 헤더도, 페이지도 없이 아무 데이터도 돌려보내지 않고 연결을 닫았다는 뜻입니다. Chromium에서는 네트워크 오류 -324이며, '이 페이지는 작동하지 않습니다. example.com에서 전송한 데이터가 없습니다.'라고 표시됩니다.