배포 후, 갑작스러운 502 에러

2025. 3. 18. 20:45

기존에 배포한 프로젝트 도메인에 접속했는데, 갑자기 접속을 거부당했다.

502..?

이유가 뭘까? 분명 일주일 전에는 접속이 되었고, 아무것도 수정한 것이 없는데 왜?라는 생각이 들었다.

 

나는 Let's encrypt를 사용하였고 nginx를 리버스 프록시로 사용하고 있었다. 그래서 연결이 아예 거부되었기에 nginx 상태를 먼저 확인해 보았고..

ubuntu@ip-172-31-36-50:~$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-02-27 12:35:56 UTC; 2 weeks 4 days ago
       Docs: man:nginx(8)
   Main PID: 104667 (nginx)
      Tasks: 2 (limit: 1130)
     Memory: 10.4M (peak: 21.9M)
        CPU: 18.385s
     CGroup: /system.slice/nginx.service
             ├─104667 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─104668 "nginx: worker process"

Mar 18 11:35:58 nginx[104668]: 2025/03/18 11:35:58 [error] 104668#104668: *36511 connect() failed (111: Con>
Mar 18 11:35:58 nginx[104668]: 2025/03/18 11:35:58 [error] 104668#104668: *36511 connect() failed (111: Con>
Mar 18 11:35:59 nginx[104668]: 2025/03/18 11:35:59 [error] 104668#104668: *36511 connect() failed (111: Con>
Mar 18 11:35:59 nginx[104668]: 2025/03/18 11:35:59 [error] 104668#104668: *36511 connect() failed (111: Con>
Mar 18 11:38:12 nginx[104668]: 2025/03/18 11:38:12 [error] 104668#104668: *36556 connect() failed (111: Con>
Mar 18 11:38:12 nginx[104668]: 2025/03/18 11:38:12 [error] 104668#104668: *36556 connect() failed (111: Con>
Mar 18 11:39:04 nginx[104668]: 2025/03/18 11:39:04 [error] 104668#104668: *36560 connect() failed (111: Con>
Mar 18 11:43:44 nginx[104668]: 2025/03/18 11:43:44 [error] 104668#104668: *36563 connect() failed (111: Con>
Mar 18 11:43:44 nginx[104668]: 2025/03/18 11:43:44 [error] 104668#104668: *36563 connect() failed (111: Con>
0/favicon.ico", 
Mar 18 11:46:01 nginx[104668]: 2025/03/18 11:46:01 [error] 104668#104668: *36567 connect() failed (111: Con>
lines 1-23/23 (END)

nginx 의 active는 running이지만, Mar 18일 20시(시간 설정 안해서 로그에는 -9시간)에 접속 요청(By me..)할 때 error 가 찍혔다. 즉, nginx는 정상적으로 동작하고 있지만 내가 보낸 요청을 서버와 연결할 수 없다(connect fail)는 것이다. 그렇다면 서버는 잘 살아있나 ? 과거에 nohup으로 백그라운드에서 실행시켰던 서버의 상태를 확인해 보자.

 

ubuntu@ ~$ ps -ef | grep java
ubuntu    194936  194839  0 11:47 pts/1    00:00:00 grep --color=auto java

이럴수가, 내가 과거에 실행 시킨 java 프로세스가 나오지 않는다.
서버가 다운된 상태이다.

우선 원인 파악보다 제대로 동작하게 하는 것이 중요하니 먼저 서버를 살려보자.

 

ubuntu@ip-~/practice/build/libs$ nohup java -jar practice-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
[1] 195010
ubuntu@ip-~/practice/build/libs$ ps -ef | grep java
ubuntu    195010  194839 99 11:50 pts/1    00:00:09 java -jar practice-0.0.1-SNAPSHOT.jar
ubuntu    195031  194839  0 11:50 pts/1    00:00:00 grep --color=auto java

nohup 명령어로 서버를 실행시켰고, 접속이 성공하였다.

서버가 종료된 이유가 무엇일까?

나는 저번에 실행시킨 명령어와 이번에 찾아본 명령어를 비교해보았다.

과거 : nohup java -jar practice-0.0.1-SNAPSHOT.jar
현재 : nohup java -jar practice-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &

현재 명령어에서 >는 로그를 nohup.out에 저장한다는 의미이고 주요 차이는 마지막에 &이다.

 

먼저 nohup과 & 개념을 알아보자.

 nohup은 no hang up의 약자로,  프로그램을 데몬 형태로 실행시키는 것이라 한다.

여기서 데몬이란 백그라운드에서 실행되면서, 사용자가 직접 인터랙션(입력)하지 않아도 지속적으로 동작하는 프로그램을 말한다. nohup은 사용자와 세션 연결이 끊어져도 프로그램이 종료되지 않는다.

 &는 해당 프로그램을 백그라운드에서 실행시키는 명령어이다. 단순히 프로그램을 백그라운드로 돌리는 것이기 때문에 로그아웃으로 세션과 연결이 끊어지면 프로그램도 같이 종료된다. 하지만 언젠가부터 백그라운드로 돌려도 세션과 연결이 끊어져도 프로그램이 종료되지 않는 옵션이 디폴트로 설정되었기에 nohup과 유사한 역할을 하는 것으로 보인다.

 즉, 이제는 nohup과 & 명령어 모두 백그라운드에서 실행되며, 세션 연결이 끊어져도 프로그램이 종료되지 않는다. 그래서 둘 중 뭘 써도 프로그램은 동일하게 지속적으로 동작하겠지만 확실한 보장을 위해 둘 다 같이 쓰는게 좋다.

GPT는 이렇게 말한다.

 

하지만 나의 문제 원인은 이게 아닐 것이다. 비록 nohup만 사용했더라도 백그라운드에서 지속적으로 프로그램이 동작하고 있었어야 하지만, 나는 종료되었었다. 아무것도 건든 게 없는데 말이다. 원인은 지금은 못찾았지만 앞으로 찾아서 추가할 예정이다.

 

 

사실 나는 nohup이라는 명령어를 잘 모르고 사용했었다. 단순하게 터미널 세션을 종료해도 백그라운드에서도 실행시킬 수 있다고만 대강 알고 있었고 자세한 내용과 사용법은 모른 채 사용했다.

그렇다보니 이런 상황이 닥쳤을 때, 적잖이 당황했다. 지금은 소규모 프로젝트이고 단순하기에 원인은 비록 못찾았지만 디버깅을 통해 해결은 할 수 있었다. 하지만 만약 대규모 복잡한 프로젝트라면 어땠을까? 어디가 문제인지 한참 찾을 것이다. 기술이나 명령어 등을 사용하기 전에 무슨 역할을 하는지, 어떻게 쓰는건지 확실하게 찾아보고 쓰는 것이 매우 중요하단 것을 다시 한 번 깨달았다.