카테고리 없음

WebSocket- NGINX 연결 오류

kjw81024 2026. 8. 13. 11:03

영상 송출 및 person detection 을 Cloudflared 에서 WebSocket 으로 바꾸며 생겼던 오류 정리 


문제 1 : ConnectionAbortedError [WinError 10053] 

 

ConnectionAbortedError (연결 중단 오류) 는 네트워크 통신 중 상대방이나 로컬 소프트웨어 (firewall, vaccine) 이 활성 연결을 강제로 끊을 때 발생 -> 이미 맺어진 연결을 일부러 중단 시킴 -> 윈도우 소켓 스택이 abort 처리함

 

요청이 들어오면 NGINX 가 직접 처리할건지 backend 로 보내줄건지 결정 

-> 이 요청을 받아서 뒤로 넘겨주는게 PROXY

 

근데 nginx.conf 에 192.158.x.x:4327/ws/xx 가 들어왔을 때 어떻게 하면 되는지 적혀있지 않아서

NGINX 가 백엔드로 넘기지 않고 본인이 처리하려고 함 

-> 그래서 기본 동작 (정적 파일 서빙) 으로 처리하려다가 Websocket 을 어떻게 보낼지 몰라서 바로 연결을 끊음 

-> abort 오류 발생 

 

 

해결

(1) NGINX 에 이미 있는 conf 설정에 192.158.x.x:4327/ws/camera/ingest 를 backend proxy 하는 location 규칙을 추가하면 해결 됨 

(해당 경로를 백엔드로 넘겨주라는 말을 추가해주는거니까!)

그걸 넣으면 똑같은 요청도 오류가 나지 않음 

server {
    listen 4327;
    server_name 192.168.50.219;

    location /ws/ {
        proxy_pass http://localhost:8000;   # 백엔드(내부 8000)로 넘김
        proxy_http_version 1.1;
        # 추가 proxy 설정
    }
}

 

(2) 두번째 해결방법은 도메인 temp.url.co.kr 로 들어오는 요청은 이미 세팅되어서 돌아가고 있는 상황이기 때문에 

규칙을 새로 파지 않고 , IP 를 192.168.x.x:4327 로 직접 연결하지 않고

 

proxy 되는 endpoint 로 전환 하기!!!

배포 서버 url = temp.url.co.kr/ws/camera/ingest 로 연결하니까 연결 이후에 바로 연결 끊김/ 실패가 뜨는게 사라짐 

# 이 명령어에서 ws url 부분을 
python3 camera_daemon.py --source --backend --ws-url--ws-token

# 기존
--ws-url ws://192.168.x.x:4327/ws/camera/ingest

# 수정 
--ws-url wss://temp.url.co.kr/ws/camera/ingest

 

이번엔 (1) 대신 (2) 를 선택햇는데

왜냐하면... IP:4327 로 들어오는 요청은 오류 메시지에서 보이다시피 ws:// 로 시작함

근데 도메인은 HTTPS 니까 Websocket 도 wss:// 

암호화 된 WebSocket 으로 붙는게 훨씬 좋기 때문에 IP 를 하드코딩하여 nginx 에 추가하지 않고 실행 방법을 수정했다 

 

잘 돌아감!


문제 2: 잘 고치고 나니까 새로운 오류가 떴다 ... WebSocketBadStatusException 

[ws][WARN] 연결 끊김/실패: WebSocketBadStatusException:
Handshake status 400 None ... b'Can "Upgrade" only to "WebSocket".'

이번에는 해겨책이 에러메시지에 포함되어서 나왔다 

Can "Upgrade" only to "WebSocket" 웹소켓은 Upgrade 로 바꿔달라는 의미 

 

client 는 upgrade websocket 헤더를 붙여서 handshake 요청을 보내는데 

이 때 NGINX 가 Upgrade 헤더를 백엔드로 안 넘겨주면 그냥 HTTP 요청으로 받기 때문에 오류가 난다 

(NGINX 가 backend 로 어떻게 넘겨주는지는... 얘가 proxy 서버라 거기까진 관리자 모드로 확인이 불가능하긴 하다)

 

일단 이런 오류가 발생했을 때 NGINX /ws/ location 에 Upgrade 전달 설정을 추가해주기 

location /ws/ {
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Upgrade header 는 client 가 만들지만, NGINX 가 그걸 backend 로 전달해줘야 handshake 가 완성 


문제 3

오류가 전혀 안 뜨는 상황에서 카메라 화면이 미리보기 화면으로만 드고 CCTV 처럼 송출이 안 된다 ....

 

Tomcat WebSocket 메시지 버퍼 기본값이 8KB 인데 JPEG 가 n00KB 라 크기 제한을 넘어버려서 프레임이 거부되는 현상이었다 ... 연결은 유지되지만 프레임이 안 넘어가는 문제

 

해결: 백엔드 WebSocket Config 에서 ServletServerContainerFactoryBean 의 버퍼 크기를 1MB 로 올리기 

text 랑 binary 둘 다

private static final int WS_MAX_MESSAGE_BYTES = 1024 * 1024; // 1MB
container.setMaxTextMessageBufferSize(WS_MAX_MESSAGE_BYTES);
container.setMaxBinaryMessageBufferSize(WS_MAX_MESSAGE_BYTES);

 

다 해결하고 나니까.....

잘 뜸!

그새 좀 늙은듯한 나............ ㅎ