(상황)
AWS ALB 모니터링 지표에서 HTTP 5XX 다수의 버그가 확인되었습니다.
인스턴스의 nginx 로그에서 다음과 같은 오류가 많이 나타나는 것을 보았고, 포트 4001에 대한 연결이 실패한 것으로 나타났습니다.
127.0.0.1:4001 업스트림 연결 중 실패(99: 요청한 주소를 할당할 수 없음), ….
(원인)
1. timawait에서 소켓 수 확인
문제가 발생한 인스턴스에 접속 후,
소켓 상태 확인 명령 사용 약 26000개의 소켓이 timewait 상태인지 확인나는했다.
(ec2-user@ip-172-31-26-217~)$ss -s
합계: 1201TCP: 26809(설립 871, 폐쇄 25923, 고아 3, 대기 시간 25922)
…
TIME_WAIT 상태에서 요청을 확인했습니다.
netstat -nap | 그랩 TIME_WAIT
TIME_WAIT 소켓은 TIME_WAIT 상태가 해제된 후 재설정됩니다. 커널로 돌아갈 때까지 사용할 수 없습니다.
그리고 TIME_WAIT 소켓은 요청을 보내는 클라이언트에 의해 생성됩니다.
2. 소켓 정보
아래 이미지에서 볼 수 있는 내용은 다음과 같습니다.
- 소스 IP: 127.0.0.1
- 출발항: 56336
- 대상 IP: 127.0.0.1
- 대상 포트: 4001
- 소켓 상태: TIME_WAIT
(참조)
Elastic BeansTalk(linux2)로 서버 환경을 구축할 때 기본적으로 nginx가 설정되어 있는데,
nginx는 먼저 외부로부터 요청을 받아 익스프레스 서버로 요청을 보낸다.
(이 때 nginx와 express 서버의 IP는 127.0.0.1이 됩니다.)nginx가 클라이언트가 됨 nginx가 로컬 포트로 소켓을 생성한 후,
목적지의 익스프레스 서버(서버)로 요청을 보냅니다.
“Source IP:Source PORT -> Destination IP:Destination PORT”로 구성된 소켓 커널에만 존재하다.
3. 로컬 IP 포트 범위 확인
이미지의 설명에 따라 인스턴스의 ip_local_port_range를 확인했습니다.
고양이 /proc/sys/net/ipv4/ip_local_port_range
표준 32768~60999Dog로 설정되어 있음을 확인했습니다.
4. 결론
ip_local_port_range를 보십시오. 사용 가능한 IP는 28231개입니다.
서버 트래픽이 증가하는 시기 경우에 따라,
약 26000개의 소켓이 TIME_WAIT 상태에 있었고 바인드할 로컬 포트가 더 이상 없기 때문에 요청을 처리할 수 없었습니다.
(반응)
1. ip_local_port_range 범위 늘리기
echo “10240 65535” > /proc/sys/net/ipv4/ip_local_port_range
2. TIME_WAIT 소켓 재사용.
sudo sysctl -w “net.ipv4.tcp_timestamps=1”
sudo sysctl -w “net.ipv4.tcp_tw_reuse=1”(참조)
net.ipv4.tcp_tw_reuse는 항상 net.ipv4.tcp_timestamps와 함께 사용해야 합니다.
net.ipv4.tcp_timestamps는 1이어야 합니다.
두 작업 모두 ebextension과 함께 적용되었습니다.
files:
"/etc/security/limits.conf":
content: |
* soft nofile 200000
* hard nofile 200000
commands:
01:
command: "echo \"10240 65535\" > /proc/sys/net/ipv4/ip_local_port_range"
02:
command: "sysctl -w \"net.ipv4.tcp_timestamps=1\""
03:
command: "sysctl -w \"net.ipv4.tcp_tw_reuse=1\""
설정을 적용한 후 HTTP 5XX가 크게 감소했습니다.
(참조 페이지)
https://tech.kakao.com/2016/04/21/closewait-timewait/
https://iximiuz.com/en/posts/reverse-proxy-http-keep-alive-and-502s/