문제
EC2를 ssh로 접속을 하여 애플리케이션을 실행시키고 있었다. 그러나 자꾸 서버가 client_loop: send disconnect: Broken pipe와 같은 오류를 내며 접속이 안 되는 문제가 발생하였다.
이는 ssh 세션이 일정 시간 동안 비활성 상태일 때 서버 또는 클라이언트에서 연결을 강제로 종료할 때 발생하는 오류다.
해결 방안
해결 방법은 3가지 정도가 있다.
- 서버 설정 수정
- 클라이언트 설정 수정
- nohup 명령어 사용
나는 첫번째로 nohup 명령어를 사용하여 ssh 세션 접속이 끊어져도 백그라운드에서 애플리케이션이 계속 실행될 수 있도록 해결했었는데, 왜인지 잘 되다가도 cpu 사용률이 치솟아 100%에 달하며 끊어지곤 했다...
이것을 해결하기 위해 swap 메모리를 통해 하드 디스크의 용량을 확보해 메모리를 확보도 해봤는데 오래 가지 못하는 것 같았다.
그래서 1, 2의 방법도 추가해보려 한다.
원격 서버 설정 수정
1️⃣ text editor 접속
sudo vi /etc/ssh/sshd_config 입력하고 들어간다.
2️⃣ 설정 추가 또는 수정
ClientAliveInterval나 ClientAliveCountMax가 있는지 확인 후 이미 있다면 수정해준다. (insert 모드로 변경하려면 i를 눌러주면 된다.)
이미 설정이 있는 경우 중복되지 않도록 꼭 기존 값이 있는지 확인하기 ( / 누르고 검색어 입력하면 빠르게 찾기 가능!)
없다면 아래와 같이 파일 맨 아래에 추가해주면 된다.
# KeepAlive 설정
ClientAliveInterval 60
ClientAliveCountMax 3
나는 ClientAliveInterval 120 ClientAliveCountMax 3으로 수정해준 후 esc를 누르고 :wq를 입력해 저장해주었다.
3️⃣ 변경 후 적용
변경을 다 끝낸 뒤 SSH 데몬 설정을 위해
sudo systemctl restart sshd 명령어를 입력한다.
❗️ 나는 여기서 Failed to restart sshd.service: Unit sshd.service not found. 라는 오류를 만났다.
sshd.service라는 이름의 SSH 데몬 서비스가 없다는 뜻인데
sudo systemctl list-units --type=service | grep ssh 명령어로 SSH 데몬 이름을 확인했더니
ssh.service loaded active running OpenBSD Secure Shell server 역시나 이름이 달랐다.
sudo systemctl restart ssh.service 찾은 이름으로 다시 실행해주면 된다.
4️⃣ 설정 적용 여부 확인
sudo systemctl status ssh.service 명령어로 확인했을 때 아래와 같이 active (running)이 나오면 정상 적용된 것!!
다 확인했으면 q 누르고 나오면 된다.
클라이언트 설정 수정
터미널에 nano ~/.ssh/config 입력하여 text editor 실행
Host * ServerAliveInterval 120 TCPKeepAlive no를 차례대로 입력 후 저장해준다.
ServerAliveInterval : 일정 시간 마다 서버에게 어떤 실행을 하도록 요청을 하는 것이다. 여기서는 120으로 설정되어 있으므로 120초마다 서버에게 대답을 하라는 Alive 요청을 보내는 것이다.
ServerAliveCountMax : 3으로 설정했으니, 클라이언트가 3번 KeepAlive 메시지를 보내도 서버에서 응답이 없으면 연결을 종료한다.
이렇게 하면 설정 끝 !
'Cloud' 카테고리의 다른 글
[AWS] nohup으로 배포 시 로그 확인하기 + 리눅스 명령어 (0) | 2024.11.18 |
---|---|
[AWS] EC2 멈춤, 서버 연결 먹통, CPU 사용률 과부하 해결 (0) | 2024.11.13 |
[AWS] 로컬 시간과 AWS 서버 시간 차이 (0) | 2024.11.12 |
[AWS] 디비버(DBeaver) Public Key Retrieval is not allowed 에러 (1) | 2024.11.12 |