Skip to content

NGINX 오류 및 설정

geonoo Lee edited this page Aug 1, 2022 · 2 revisions

NGINX를 적용하면서 여러 겪은 문제들

Handshake failed due to invalid Upgrade header

  • 일반적으로 HTTPS(SSL)로 하기 위해서는 도메인에 인증서를 등록하고 그 인증서를 서버내부에 저장하고 nginx로 들어오는 요청에 대해서 SSL로 요청하도록 443번 포트로 Redirect를 하도록 설정해 놓지만 ELB에서 인증서를 등록해놓고 뒷 서버로 넘겨주기 때문에 그래줄 필요가 없다.
  • 특정 포트로 요청이 들어오면 그대로 뒷 서버로 전달만 해주면 된다.
  • 하지만 주의 할점은 웹소켓은 기본적으로 HTTP 프로토콜을 이용하여 그 연결을 끊지 않고 유지시켜주는 방식으로 동작하기 때문에 반드시 header에 websocket으로 upgrade한다는 것을 명시해야한다.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;

위 처럼 nginx config에 설정 해주어야 한다.

이미지 첨부 시 에러

  • 이미지를 첨부할 때 스프링에서는 최대 10Mb까지 받을 수 있도록 설정해 두었다.
  • 하지만 NGINX를 적용하면서 이미지를 첨부할 때 CORS ERORR를 반환해 주고 있었다.
  • 분명, 기존 API들은 프론트가 요청할 때 정상적으로 CORS를 통과했지만 이미지 업로드할 때 해당 문제가 발생하니 당황스러웠다.
  • 리서치 해본 결과 NGINX는 설정을 안해주면 기본적으로 1Mb로 제한되어 있어서 해당 부분을 받을 수 있게 설정해주어야 했다.
client_max_body_size 15M;

1M 로 되어있던 설정을 위 처럼 변경하니 정상적으로 이미지가 등록되었다.

소켓 채팅 최적화

#하나의 프로세스가 처리할 수 있는 커넥션 수 
worker_connections 1024;
    
#작업 프로세스가 한번에 모든 새 연결을 수락합니다.
multi_accept on;
    
#정적 파일을 보낼 수 있도록 허용
sendfile on;
    
#클라이언트로 패킷이 전송되기 전에 버퍼가 가득 찼는지 확인하여, 다 찼으면 패킷을 전송하도록 하여 네트워크 오버헤드를 줄이도록 설정합니다.
tcp_nopush on;
    
#tcp_nodelay를 활성화하면 소켓이 패킷 크기에 상관없이 버퍼에 데이터를 보내도록합니다.
tcp_nodelay on;
    
#클라이언트에서 해당 서버로 keepalive 커넥션을 유지할 수 있는 시간을 설정합니다. 너무 길면 요청이 없는 클라이언트와의 커넥션을 연결하고 있기 때문에 자원의 낭비가 발생한다.
keepalive_timeout 10;

위 와같이 설정해서 채팅속도를 어느정도 개선했다.