File(Socket) Descriptor 가 소켓 통신을 할때 어떤식으로 생기는지에 대한 테스트를 해보았다.
nginx(reverse proxy)와 tomcat was를 linux에 띄우고 Reqeust가 들어올때마다 File Descriptor가 어떤식으로 생성되는지 lsof 명령어를 통해서 살펴보기
서버에 java와 nginx를 설치한다.
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
# was url 등록
proxy_pass http://localhost:8080/;
}
...
@GetMapping("/start_sleep/{mill}")
public void startSleep(@PathVariable int mill) throws InterruptedException {
log.info("start sleep");
Thread.sleep(mill); // 특정 시간 만큼 멈추도록 설정
log.info("enb sleep");
}
was 실행 nohup java -jar test.jar &
lsof -i:8080 명령어로 확인해보기
요청 전 : TCP/IP 8080 포트를 사용 중이고 상태는 LISTEN 상태인 FD를 확인할 수 있음.
요청 후(Tread Sleep 상태 즉 통신 중인 상태) : 3개의 결과를 볼 수 있는데 결과가 3개인 이유는 1개의 서버에서 nginx 와 was를 같이 띄웠기 때문이다.
따라서
이렇게 3개가 나오게 된다. 각각 다른 서버에 배치했다면 nginx가 배치된 서버에서는 1개 was 가 배치된 서버는 2개 (LISTEN과 요청 중인 소켓 총 2개)의 결과가 나올 것이다.
앞서 살펴본 것처럼 nginx 요청과 내부의 was 요청 + LISTEN 해서 총 41 개의 FD 가 생성된 것을 살펴볼 수 있다.
사진과 같이 NAME 오른쪽에 TCP/IP의 상태가 표시되는데 FD : 24U의 통신이 끝날 때쯤 서버의 TCP/IP CLOSE_WAIT 상태가 되는 것을 볼 수가 있었다.
TCP/IP 프로토콜은 다음 과 같은 순서로 동작하는 데 순서를 살펴보자(꼭 클라이언트가 먼저 통신을 요청/종료를 하는 것은 아니다)
Ref
https://tech.kakao.com/2016/04/21/closewait-timewait/
https://man7.org/linux/man-pages/man8/lsof.8.html
https://www.ncloud.com/guideCenter/guide/36