저번에 gitlab 설정값만 바꾸었을 때, 뭔가 이상함을 느끼셨을 겁니다. 7775로 접속은 잘 되는데, puma만 잔뜩 떴다는 것이요. 이는 이 글에서 언급을 했지만, default로 puma를 쓰기 때문입니다. 문서에 따르면 14.0 부터는 unicorn의 지원을 제외한다고 합니다. 사실, 이게 중요한 건 아니고, puma로 셋팅하려다가 삽질을 했고, 심지어 해당 글도 가장 중요한 셋팅값인 external_url을 누락시켜서, 이 글을 쓰면서 급하게 수정하였습니다.

 

 어떤 식으로 문제를 찾았는지에 대해서만 간단하게 메모로 남겨놓으려고 합니다. 사실 제일 좋은 방법은 log 파일을 보는 것이겠지만, 그 당시에는 당황해서 그대로 게임 끝났습니다.

 


 먼저, 제 spring boot 프로젝트는 8080번 포트를 씁니다.

 

 

 이것을 실행시켜 보겠습니다.

 

 

 그랬더니 왠걸. BindException이 뜨면서 주소가 이미 사용중이라고 뜹니다. 평소 같으면 프로퍼티 파일에서 port의 값을 다른 값으로 바꾸었겠지만, 오기가 생겼습니다. 왜 8080이 막혔는지 알아내고야 말겠습니다. 그래서, 하나씩 역추적을 해 보기로 하였습니다. unicorn을 따로 켜지 않았다면, 꺼져 있을 겁니다. 13.0부터 디폴트 서버가 puma이기 때문입니다.

 

 

 먼저 netstat -ntlp로 어떤 포트를 어떤 process가 물고 있는지 보겠습니다. 보면 제가 이 글에서 셋팅한 7775는 사실 nginx가 쓰고 있음을 알 수 있습니다. nginx는 웹 서버입니다. 따라서, 그림은 이렇게 그려질 겁니다.

 

 

 그런데, puma를 보면 2개를 쓰고 있음을 알 수 있습니다. 8080과 9168입니다.

 

 

 그리고, gitlab.rb에서 8080이라는 키워드로 찾아보았습니다. 그러면, workhorse랑 puma가 나오는데요. 이 중에서 puma['port']의 값을 바꿔야 함을 눈치를 챌 수 있습니다. 7775도 아니고, 8080도 아닌 다른 값 중 하나인 7776으로 바꿔 봅시다. 8080을 쳤을 때 나오는 다른 옵션인,workhorse는 건드리지 않겠습니다.

 

 

 그리고 listen은 127.0.0.1로 바꾸었습니다. 반영된 설정을 가지고, 다시 gitlab을 돌립니다. 그리고 나서, lsof 명령어로 파일이 어떤 프로세스에 의해서 열렸는지 보도록 하겠습니다. 저는 전체에서 특정 키워드들로 잘라버릴 겁니다. puma와 IP로 걸러봅시다.

 

 

 grep A | grep B로 필터링을 걸어버리면, 한 줄에 A와 B가 동시에 나와야 표시가 됩니다. 저렇게 끊은 이유는 간단합니다. 어떤 포트를 물고 있는지 볼 수 있기 때문입니다. 여기서 중요한 것은 1670이 9168을 물고 있고, 30668, 30670, 30672, 30674가 7776을 물고 있다는 겁니다.

 

 이를 그림으로 도식화 시키면 위와 같습니다.


 그러면 7775는 무엇일까요? lsof 명령어의 결과를 가지고, IP와 7775를 기준으로 filtering 해 봅시다.

 

 

 nginx가 나오고 www가 나오는데요. 여기까지 보면, 그냥 클라이언트와 웹 서버 (중개자)와 통신을 하기 위한 무언가임을 알 수 있습니다. 그래서, 사실 external_url에 localhost:7775 이렇게만 셋팅하고, 방화벽에서 7775번 포트를 열어놓으면 접속이 가능합니다. 이 글에서 unicorn을 셋팅한 건 아무 의미 없었다는 소리입니다. 만약에, unicorn을 쓰려고 했다면, enable로 바꿨어야 했고, port도 적당한 값으로 바꿨어야 겠지만, 글에는 그것도 없었습니다. 게다가 유니콘이나 퓨마나 내부 프로세스라 웹에서 접속하는 것과 영향을 미치지 않습니다. 한 마디로 허탕 쳤다가 적절하겠네요.

 

 

 다음에 ps -aux는 프로세스에 대한 정보를 출력하는 것입니다. 저는 이쁘게 표시하기 위해서, awk로 가공을 조금 하였는데요. 그냥 키워드로 필터링 걸어도 알아볼 수 있습니다. 위 그림에서 보면 알 수 있지만 30668, 30670, 30672, 30674는 cluster worker임을 알 수 있습니다.

 

 즉, 서버 내부에서 도는 무언가인 셈입니다. 내부 프로세스라고 보면 무난할까요?

 

 

 다음에 9168과 IP를 가지고 lsof의 결과를 필터링을 걸어봅시다. 그러면, gitlab-ex가 나오는데요. 이는 exporter를 의미합니다.

 

 

 그리고 프로메테우스가 나오는데요. 성능 수집과 관련된 프로세스입니다.

 

 

 여기까지 그림을 그려보면 위와 같습니다. 9168은 성능 수집을, 7776은 worker를 의미합니다. 만약에, puma['listen']을 7775로 설정했다면 어떨까요? 글쎄요. web server 역할을 하는 nginx와 충돌이 일어날 수도 있지 않을까요?

 


 추가로 external_url을 주석처리 한 경우에 어떻게 동작하는지 봅시다.

 

 

 80번 포트로 웹 서버가 클라이언트와 통신함을 알 수 있습니다. 정리하면, 클라이언트가 주소창에 localhost:7775로 접속이 가능하게 하고, 내부에 있는 puma가 8080이 아닌 다른 포트, 예를 들어 7776을 사용하게 하고 싶다면 아래와 같이 셋팅하시면 됩니다.

 

 

  external_url을 7775로 설정하고 puma['listen']을 127.0.0.1로, 'port'를 7776으로 설정하면 됩니다.

 

 

 그러면, Gitlab에 잘 접속이 되고, 8080번 포트를 쓰는 프로그램도 잘 돌아갑니다.

 

 

 포트 충돌이 일어나지 않기 때문입니다. 몇 일 동안 삽질을 하면서 배운 것은 lsof하고 netstat를 잘 써야 겠다는 것이였습니다.