nginx를 proxy server로 구성하는 방법
- 기존 nginx configuration file에 server block을 추가함으로써 proxy server를 정의함
listen
이 정의되어 있지 않으면 80이 기본임. listen을 명시함으로써 포트 지정이 가능함location
: /data/up1 에 대한 request를 local file system으로 매핑하게 됨root
: location block 안에 root가 없을 때, server 블록 안에root
를 명시하여 사용할 수 있음
server { listen 8080; root /data/up1; location / { } }
proxy pass
directive를location
block에다가 명시하기- 두 번째 location 은
/images/
prefix를/data/images
폴더로 매핑시키게 됨
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
SpringBoot 이외에 nginx 를 추가로 사용하는 이유
- 서버 부하를 방지할 수 있다. nginx에서 정적페이지를 서빙하고, WAS에서 동적인 api 를 제공하는 것이 WAS의 부하를 줄여준다 ( WAS의 Thread 를 동적 데이터 반환하는데에 몰두할 수 있어서 좋을 것 같긴하다)
- 보안 강화 ( 클라이언트가 바로 WAS에 접근하는 식으로 아키텍처를 구성하면 WAS 뒤에 있는 DB에 대한 정보를 클라이언트나 해커가 알아낼 위험이 있습니다. 따라서 웹서버와 WAS를 물리적으로 분리해서 데이터 노출을 막을 수 있습니다)
- SSL에 대한 암복호화 처리를 Web Server(nginx)에서 할 수 있음
- 로드 밸런싱 (WebServer와 WAS를 분리해서, 여러 대의 서버에 접근할 수 있도록 해줌)
TroubleShooting
413 request entity too large 에러 발생 (form 에 파일 넣어서 보낼 때)
server { client_max_body_size 10M; ... }
504 Gateway Timeout [ 참고 ]
발생 주요 원인
- proxy_connetct_timeout(default: 60s)
- 주로 upstream 연결 지연으로 발생한다. 대부분의 upstream은 가까운 위치에 있어 자주 발생하지 않으나, 방화벽에 의해 proxy 연결이 차단될 경우 발생할 수 있다.
- 연결은 TCP/IP의 3-way handshake로 이루어지며, 지정된 시간 내에 SYN+ACK 응답을 받지 못하면 오류가 발생한다.
- proxy_send_timeout(default: 60s)
- 데이터 전송 지연 시 발생한다. 대표적으로, 사용자가 대용량 파일 업로드 중 속도 저하로 인해 발생할 수 있다.
- proxy_read_timeout(default: 60s)
- upstream에서의 응답이 지연되면 이 오류가 발생한다. 백엔드 서버에서 복잡한 작업을 수행하거나, 다른 이유로 인해 응답이 지연되는 경우가 대부분이다.
- 참고로 여기서 중요한 점은 클라이언트가 504 오류를 반환받더라도 요청은 이미 전송된 상태이므로, 리버스 프록시가 연결을 끊어도 upstream 작업은 계속 수행된다.
- 참고 : read_timeout directive는 ngx_mgmt_module에 있는데, 해당 directive는 Nginx Instance Manager로 보내는 info 에 대한 read_timeout 임. proxy server 로 보낸 응답에 대한 timeout이 아님
server { listen 80; location / { proxy_pass http://myplanit; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; proxy_connect_timeout 300s; // proxied server(WAS) 와의 커넥션 타임아웃 설정 proxy_send_timeout 300s; // nginx -> WebServer 에게 request 요청 시 300s 이내에 보내지 않으면 connection close proxy_read_timeout 300s; // 뒷 단의 WebServer에서 nginx로 300s 이내에 응답이 안오면 504 Error 발생 } location /static/ { alias /home/app/web/static/; } location /media/ { alias /home/app/web/media/; } } ...(아랫부분 생략)