글쓴이 보관물: 나루

나루에 대하여

클린 코드를 지향하는 개발자입니닷~*

Nginx 로드 밸런싱 – https 서버 여러 대인 경우

처음엔 아래와 같은 방식으로 작성했는데, 이렇게 하는 경우 proxy_pass를 통해 https의 해당 도메인으로 정확히 연결되지 않는 현상을 발견하였다. 현재 사용할 서버는 PHP 아닌데, 왜 PHP가 뜨는 거지? 오잉? 싶었는데, 다른 서비스 용으로 PHP가 돌아가고 있었다. 즉, 엉뚱한 도메인으로 연결되고 응답으로 404 Not Found를 돌려받고 있었다. Oh my gosh! 왜 이런 현상이 생기는 것이지? 이건 분명 도메인으로 넘어가지 않고 IP로 넘어가서 발생한 현상일 듯한데 싶었다. 그렇다면 어떻게 이걸 명확하게 도메인으로 넘겨줄 수 있을지 고민이 되었다.

http {
  ...
  upstream servers {
    server first.myserver.com:443;
    server second.myserver.com:443;
  }

  server {
    listen 443 ssl;
    location / {
      proxy_pass https://servers;
    }
    ...
  }

}

그리고서 구글링을 하다가 힌트(https://stackoverflow.com/questions/29071168/nginx-upstream-with-http-https/65767299)를 발견한 후 아래와 같이 수정하였다.

http {
  ...
  upstream servers {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
  }

  server {
    listen 443 ssl;
    location / {
      proxy_pass http://servers;
    }
    ...
  }

  server {
    listen 8081;
    location / {
      proxy_pass https://first.myserver.com;
    }
  }

  server {
    listen 8082;
    location / {
      proxy_pass https://second.myserver.com;
    }
  }

}

드디어 로드 밸런싱이 원하는대로 작동하기 시작했다.

정리해보면, nginx의 소스코드를 까보지 않아서 왜 이런 현상이 발생하는지는 정확히 모르겠지만, 추론컨대 전자의 경우 domain으로 작성하지만 IP와 포트로만 처리하는 것으로 보인다. 왜냐하면 동일 머신에 필자가 운용중인 다른 서비스로 접근하는 것을 확인했으니 말이다. 후자의 경우는 각각의 proxy 서버가 명확하게 목적지를 가리키고 있으므로 문제가 발생하지 않았던 것으로 보인다.

단일 서비스만 운용하는 경우에는 별 문제가 되지 않을 수 있겠지만, https로 이용하는 서비스가 여러 개 있다면 필자와 같이 문제가 발생할 수 있다.

Jenkins – Publish over SSH 플러그인 키 설정

Publish over SSH는 Jenkins에서 빌드를 마치고, 특정 서버로 배포를 할 때 사용하는 플러그인이다.

SSH 접속을 위해서는 User ID와 비밀번호 또는 개인키/공개키가 필요하다. 우리는 개인키/공개키를 사용할 것이므로 비밀번호는 필요하지 않다.

혹여나 사용하는데 필요한 개인키/공개키 쌍이 준비되어 있지 않다면, 그림 1과 같이 ssh-keygen을 이용해서 키 쌍을 준비해야 한다.

그림 1. ssh-keygen 이용하여 개인키/공개키 쌍 만들기

* Publish over SSH 플러그인을 우선 설치한다.

* Jenkins 관리 > 시스템 설정 > SSH Servers로 이동한다.

* SSH Servers에 항목이 없다면, “추가” 버튼을 클릭한 후, 아래의 내용을 기입한다.

Name에는 식별할 수 있는 이름을 적어준다.
Hostname에 접속할 IP나 도메인을 적어준다.
Username에는 접속할 사용자 이름을 적어준다.
Remote Directory에는 접속하고자 하는 디렉토리를 입력한다.

그림 2. SSH Server 기본 정보 입력 예시

* 우측 하단에 있는 “고급” 버튼을 누르면 고급 항목들이 펼쳐진다.

그림 3. 고급 버튼 위치

* “Use password authentication, or use a different key” 여기에 체크를 해 준 후,
Key에 SSH에 사용할 개인키를 붙여넣어주면 Jenkins 상의 개인키 설정이 끝난다.

그림 4. 개인키 입력 화면

* 배포 대상인 서버로 접속한 후, 그림 5와 같이 사용하려는 공개키를 ssh-rsa부터 끝까지 모두 복사해서 ~/.ssh/authorized_keys 파일에 공개키를 한 줄 추가해 준다. authorized_keys 파일이 없다면 새로 작성하면 된다.

그림 5. 공개키 내용 열람

* Jenkins의 SSH Server 항목 우측 하단에 Test Configuration 버튼을 누른다.

그림 6. Test Configuration 버튼 위치

* 왼쪽에 Success라고 뜨는지 확인했다면 SSH 접속을 위한 개인키/공개키 설정이 끝난다.

그림 6. 성공 메시지

만약 성공하지 못한다면, Success 라는 내용 대신에 오류 메시지로 문제점을 알려줄 것이다. 해당 오류에 대해 구글링 후 문제를 해결하면 된다.

“길벗과 함께” 이용자 폭증 사태

이틀간 폭풍같이 이용자들이 “길벗과 함께”를 쓸고 지나갔다.

엄청 많은 사용자가 몰린 게 아님에도 불구하고, 서비스의 서버 성능 의존도가 발목을 잡아서 이용자들이 서비스를 제대로 이용하지 못하는 상황이 발생했다. 우선은 급한 불을 끈 상태다.

이번 경험을 통해 느낀점을 정리하면,

  1. 현재 “길벗과 함께”는 서버에 부하를 많이 주는 구조다. 즉, 현 상태를 지속하면 추후 다수의 접속이 발생했을 때 서비스 불가 상태가 또 발생할 수 있으므로 해결책을 찾아야 한다.
  2. 폭풍 같은 접속이 있다고 해서 사람들이 꾸준히 이용하는 것은 아니다. 특정 이벤트가 발생했을 때 이용자가 증가한다. 특히, 퀴어페스티벌 전후로도 버틸 수 있어야 할 것이다.
  3. 부하를 최대한 서버에서 클라이언트 단으로 옮겨야 한다고 잠정적으로 결론을 내렸다. 하지만 그걸 어떻게 할 것인가! 사실 대강의 청사진은 그려 놓은 상태다ㅎㅎ 과연 얼마나 잘 작동할지는 테스트 해 봐야 할 것 같다.

당장은 할 일이 있으니 조만간 다시 살펴보는 걸로!

퐁당

그녀가 돌을 던졌다.
잔잔한 연못에
잠시 물결이 일었다.

물결이 일렁이다
금세 사라질 줄
알았는데,

바람이 불어오더니
거친 파도가 되어
휘몰아치기 시작했다.

Oracle Cloud 인스턴스 Swap 메모리 설정

오라클 클라우드에서 OS를 Ubuntu로 선택했을 때, 필자의 경우 Swap 메모리가 기본으로 잡혀있지 않아서, Out of memory로 서버가 죽는 현상이 발생했다.

필자가 사용하는 Ubuntu 20.04에서는 과거의 swap 파티션을 사용하지 않고, /swapfile을 이용한다. 따라서 이에 대한 설정이 필요하다.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

차례대로,
1. /swapfile로 4GB를 할당하고
2. 퍼미션 설정
3. 해당 파일을 스왑 파일로 설정
4. 스왑파일 기능을 켜준다.

재부팅을 하면 스왑 설정은 날아가므로 /etc/fstab을 열어서 마지막 줄에 다음 내용을 적어준다.

/swapfile swap swap defaults 0 0

이제 재부팅 한다.

sudo reboot

스왑파일이 잘 설정되었는지 확인한다.

sudo free -m

아래와 같이 Swap 라인에 설정된 용량이 보이면 성공이다.

      total        used        free      shared  buff/cache   available
Mem:    972         399          72          38         499         390
Swap:  4095          30        4065

혹여나 스왑 용량을 변경해야 한다면, 우선 스왑을 꺼준후, 스왑 파일을 삭제한다.

sudo swapoff -v /swapfile
sudo rm /swapfile

이제 다시 위의 fallocate에서 원하는 용량으로 변경하여, 1~4의 과정을 다시 실행해 주면 된다.