728x90
반응형

쉘 스크립트의 return은 다른 언어와 다르게 작동한다는 것을 듣고 gpt의 도움을 받아 실습해보고자 했다! 

우선, 쉘 스크립트의 함수에서 return은 값을 반환하지 않고 상태코드 (0~255)을 반환한다.

함수가 성공적으로 실행되었는지 나타나는데 쓰인다. 일반적으로 0은 성공, 0이 아닌 값은 실패를 의미한다.

고로 쉘 스크립트에서 return은 숫자를 반환해서 그냥 문자열을 넣으면 에러가 발생한다. 

 

 

1. return 에 숫자를 넣을 경우 

my_function() {
  echo "Hello, World!"
  return 0  # 성공을 의미
}

my_function
echo $?  # 0이 출력됨

2. return 에 문자열을 넣을 경우 

my_function() {
  return "Hello, World!"
}

my_function

결과

./script.sh: line 2: return: Hello,: numeric argument required

 

그러나 쉘 스크립트로 무중단 배포를 구현할 때, nginx를 사용하여 새로운 버전의 애플리케이션을 배포하는 동안 문자열을 반환하고 싶을 수 있는 몇 가지 상황이 있을 수 있다.

예를 들어, 배포 과정에서 상태를 확인하고 싶다거나, 환경 설정 값을 반환한다거나 로그 메시지를 반환하는 등 !

이런 경우를 위해 문자열을 반환하는 방법이 몇가지 있다.

 

1. 명령 치환 (가장 흔하게 사용되는 방법)

my_function() {
  local result="Hello, World!"
  echo "$result"
}

result=$(my_function)
echo "$result"  # "Hello, World!" 출력됨

 

2. 백틱 사용(구식)

my_function() {
  local result="Hello, World!"
  echo "$result"
}

result=`my_function`
echo "$result"  # "Hello, World!" 출력됨

 

3. 전역 변수 사용

result=""

my_function() {
  result="Hello, World!"
}

my_function
echo "$result"  # "Hello, World!" 출력됨

코드가 간단할 때에는 가장 편할거같지만 함수가 좀만 복잡해지면,,, 안전하지 않을 것 같다.

728x90
반응형
728x90
반응형

Tools

  • Prometheus: v2.45.3
  • Grafana: v10.3.0
  • Node Exporter: v1.7.0

 

Prometheus, Node Exporter, Grafana 설치 작업

1. 패키지 업데이트

sudo apt update​
 

2. 디렉터리 생성

sudo mkdir /etc/prometheus sudo mkdir /opt/prometheus
 

3. Prometheus 설치

공식 홈페이지에서 최신 버전 확인하여 다운로드

https://prometheus.io/download/

 

Download | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

 

wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz
 
압축 해제
tar xvfz prometheus*
 
패키지 구성 파일 복사
cd prometheus-2.45.3.linux-amd64
sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/

sudo cp -r prometheus.yml /etc/prometheus
sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus

 

4. Prometheus 서비스 데몬 작성

sudo vi /etc/systemd/system/prometheus.service

# prometheus.service 파일 내에 아래 내용 작성
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /opt/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

5. Prometheus config 설정

 
sudo vi /etc/prometheus/prometheus.yml

# prometheus.yml 파일 내에 아래 내용 작성
# my global config
global:
  scrape_interval: 15s # 기본 수집 주기
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: node
    scrape_interval: 5s

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9100"] # node-exporter 주소
 

6. Prometheus 서비스 데몬 등록 및 실행

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

 

7. Node Exporter 설치

공식 홈페이지에서 최신 버전 확인하여 다운로드

https://github.com/prometheus/node_exporter/releases/

 

Releases · prometheus/node_exporter

Exporter for machine metrics. Contribute to prometheus/node_exporter development by creating an account on GitHub.

github.com

wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xzvf node_exporter-1.7.0.linux-amd64.tar.gz

# 폴더명 변경 로그아웃
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
 

8. Node Exporter 서비스 데몬 작성

sudo vi /etc/systemd/system/node_exporter.service

# node_exporter.service 파일 내에 아래 내용 작성
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Restart=on-failure
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
 

9. Node Exporter 서비스 데몬 등록 및 실행

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

sudo systemctl status node_exporter
 

10. Grafana 설치

공식 홈페이지에서 최신 버전 확인하여 다운로드

Download Grafana | Grafana Labs

sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/oss/release/grafana_10.3.0_amd64.deb
sudo dpkg -i grafana_10.3.0_amd64.deb
 

11. Grafana 포트 변경

기본 포트 3000. 포트 룰에 맞추어 9000으로 변경

sudo vi /etc/grafana/grafana.ini

# 포트 변경 내용 추가 
http_port = 9000
 
 

12. Grafana config 설정

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

sudo systemctl status grafana-server​

13. 모든 서비스 재시작

sudo systemctl restart prometheus
sudo systemctl restart node_exporter
sudo systemctl restart grafana-server

14. Grafana 접속

브라우저에서 {서버IP}:9000으로 접속

 

Grafana 대시보드 셋팅 작업

1. 데이터 소스 연결

  1. Grafana Home > Menu > Connections > Data sources > + Add new data source
  2. Prometheus 선택
  3. Connection에 Prometheus URL 입력 (예: http://localhost:9090)
  4. Save & Test 하여 성공 확인

2. 대시보드 템플릿 선택

  1. https://grafana.com/grafana/dashboards/ 접속
  2. 목적에 따라 원하는 대시보드 템플릿 선택하여 JSON 다운로드
  3. 서버 모니터링 목적일 경우, Node Exporter Full 템플릿 선택

3. 대시보드 셋팅

  1. Grafana Home > Menu > Dashboards > New dashboard
  2. 2. 대시보드 템플릿 선택에서 다운받은 대시보드 템플릿 사용을 위해 Import a dashboard 선택
  3. Upload dashboard JSON file에 다운받은 JSON 파일 드롭
  4. 데이터 소스 연결에서 추가한 Prometheus 데이터 소스 선택
  5. Import

4. 연결된 대시보드 확인

 

AWS 보안 그룹 설정 작업

1. 실행 포트 적용

  • 포트 현황
    • Prometheus: 9090
    • Grafana: 9000
    • Node Exporter: 9100

2. 서버 모니터링

  • 보안 그룹 생성
  • 9000, 9090, 9100 포트 인바운드 규칙 적용

참고 레퍼런스

728x90
반응형
728x90
반응형

현재 서버 환경을 간단히 정리해보았다. 우분투 서버에서 Node.js 백엔드 서버 6개와 Docker 기반 Django 서버 2개가 구동되고 있다. 인스턴스 유형은 m5.large로, 메모리는 8GB, 스토리지는 100GB다.

서버 환경

  • 운영체제: Ubuntu 서버
  • 백엔드 서버: Node.js 백엔드 서버 6개 + Docker 기반 Django 서버 2개
  • 인스턴스 유형: m5.large
  • 메모리: 8GB
  • 스토리지: 100GB

모니터링 툴 조건

  • 무료 오픈소스
  • 서버 내 구동되는 웹서버 모니터링 지원
  • 웹사이트로 모니터링 가능
  • 설치 및 셋팅이 간단
  • 자원을 많이 먹지 않음
  • 자원 임계치 도달 시 구글챗 API 발송 가능

 

조건에 부합하는 모니터링 툴

조건에 부합하는 모니터링 툴은 총 3가지로 다음과 같다:

  1. Prometheus(프로메테우스) + Grafana
    • 특징: CNCF(Cloud Native Computing Foundation)의 프로젝트로, 다양한 데이터 소스로부터 시계열 데이터를 수집 가능. 시각화 툴인 Grafana와 함께 사용하여 데이터를 시각화하고 대시보드를 구성할 수 있음.
    • 장점: 유연한 데이터 소스 지원, 강력한 시각화 및 대시보드 기능, 쉬운 설치 및 설정.
    • 단점: 초기 설정에 대한 학습이 필요할 수 있음.
  2. Zabbix
    • 특징: 다양한 네트워크 및 서버 모니터링 기능을 제공. 웹 기반 대시보드를 통해 모니터링 및 경고 기능을 제공. 설치 및 초기 설정이 다소 복잡.
    • 장점: 다양한 모니터링 기능 제공, 확장성이 높음, 웹 대시보드로 모니터링 가능.
    • 단점: 초기 설정이 복잡함, 자원 사용량이 높아 다소 무거움.
  3. Scouter
    • 특징: 경량화된 자바 애플리케이션 모니터링 도구. 단순하고 직관적인 웹 인터페이스를 제공. 자바 애플리케이션 중심의 모니터링에 특화되어 있음.
    • 장점: 경량화된 설치 및 사용, 자바 애플리케이션 중심의 모니터링에 특화됨, 쉬운 웹 인터페이스.
    • 단점: 다양한 기능이 제한될 수 있음.

 

모니터링 툴 비교

기능/특징 Prometheus + Grafana Zabbix Scouter
데이터 소스 지원 다양한 데이터 소스 지원 (Prometheus 등) 다양한 데이터 소스 지원 자바 애플리케이션 모니터링에 특화
시각화 및 대시보드 기능 Grafana에서 강력한 시각화 및 웹 대시보드 기능 지원 웹 기반 대시보드 제공 단순하고 직관적인 웹 인터페이스
설치 및 설정 비교적 간단한 설치 및 설정 초기 설정이 다소 복잡함 경량화된 설치 및 사용
모니터링 대상 다양한 환경에 적합함 (서버, 애플리케이션 등) 다양한 환경에 적합함 (서버, 네트워크 등) 주로 자바 애플리케이션 모니터링에 사용
자원 사용량 중간 높음 낮음
커뮤니티 및 지원 많음 많음 상대적으로 적은 편
구글 챗 API 훅 가능 가능 가능

 

결론

조건에 가장 부합하는 Prometheus + Grafana 조합으로 적용을 시도한다! 다양한 데이터 소스를 유연하게 지원하고, 강력한 시각화 및 대시보드 기능을 제공하므로 우리 서버 환경에 잘 맞을 것 같고 설치와 설정도 비교적 간단하여 빠르게 적용할 수 있을 것으로 기대된다~

참고 링크

728x90
반응형
728x90
반응형

개발서버에서 이미지가 404가 떠서 확인해보니 기존 s3마운트가 끊어진것을 확인했다.

권한이 d?????????, 소유자, 날짜가 ?로 보이며 연결이 정상적이지 않은 것을 볼 수 있다. 

umount로 마운트 해제한 뒤

mount -a 명령어를 입력해서 fstab 파일 정보대로 다시 마운트 되도록 했다.

정상적으로 다시 마운트 연결된것 확인!

 

728x90
반응형

'IT > 서버' 카테고리의 다른 글

서버 모니터링 툴 리서치  (0) 2024.06.13
Spring 배포용 AWS ec2 Linus 초기 설정하기  (0) 2021.02.15
서버 개발 계획서  (0) 2021.01.27
728x90
반응형

ec2로 생성한 linux 인스턴스를 처음 putty로 접속한 환경이다.

접속하는 방법은

imawish.tistory.com/entry/AWS-ec2-linux-%EC%84%9C%EB%B2%84-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95putty-filezilla?category=999386

 

AWS ec2 linux 서버 개발 환경 구축(putty, filezilla)

1) Putty로 ec2 접속하기(linux)  1. putty 설치한다. Host name(or IP address)에 주소나 ip 입력 2. 왼쪽 카테고리에 Connection - SSH - Auth 안에 Private key file 삽입하고 Open! 3. 어떤 창이 뜬다면 yes..

imawish.tistory.com

이 게시물에서 설명했다.

 

우선 처음 putty로 접속하면 아무 설정이 안되어있는 상태다.

 

1. 업데이트

sudo yum update -y

명령어로 업데이트를 한다. 아마 다 되어있을테지만 혹시모르니!

 

2.  자바 설치

그 다음은, 스프링부트를 배포하기 위한 서버이기 때문에 java를 설치. 처음엔 자바가 설치되어있지 않은 모습이다.

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

작업이 완료되면 자바가 설치된 것을 확인할 수 있다.

3. 타임존 변경

ec2서버의 기본 시간은 UTC로 한국의 시간대가 아님. 타임존을 변경하기 위해 다음 명령어들을 입력하고 시간을 확인하면 한국의 시간과 일치.

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

4. 깃 설치

springboot 프로젝트를 서버에서 배포하기 위해서는 깃허브에서 코드를 받아와야 한다. (파일질라로 해도됨, 그게더 편할수도? 파일질라 연결하는 법은 글 처음에서 언급한 게시물에 나와있음)

그러기 위해서 깃을 설치한다.

sudo yum install git

그리고 버전을 확인하면

끝!

728x90
반응형
728x90
반응형

서버 개발에 어떤 플랫폼을 사용할 지 논하기 전에 인규와 나는 "멀티접속"에 대해 가장 초점을 두었다는 것을 명시하고, 이에 따라 멀티플레이가 가능한 '발표'라는 게임 서버를 구현하는 것을 목표로 하였음을 알린다.

즉, 일반적으로 멀티플레이가 가능한 게임을 만들되 그 게임이 바로 우리가 목표하는 'presentation class'가 된다.

 

 

1. 유니티 UNet

유니티에서 UNet은 지원이 중단되었으며 향후 Unity에서 삭제될 예정이다. 현재 새로운 시스템이 개발 중이고 알파테스트를 진행하고 있다고 한다. 그러나 2022년 예정인 것이고, 그 전까지는 결국 사용할 수 있는 멀티플레이 서비스가 UNet이라는 이야기다. (본 공모전도 2020년이면 끝...)

UNet을 활용하여 만든 예제가 꽤 되어 보이기 때문에 활용하는데 그렇게 큰 어려움이 있을 것이라고 생각이 들지 않는다.

그리고 아래 링크는 UNet을 사용하는데 필요한 매뉴얼이다.

docs.unity3d.com/kr/2018.4/Manual/UNetClientServer.html

 

네트워크 클라이언트와 서버 - Unity 매뉴얼

많은 멀티플레이어 게임들이 Network Manager를 사용하여 연결을 관리할 수 있지만, 저수준 NetworkServer 및 NetworkClient 클래스를 직접 사용할 수도 있습니다.

docs.unity3d.com

 

2. 포톤 PUN2

PUN은 Photon Unity Networking의 약칭이며, Unity 상의 멀티플레이어 네트워크 리얼타임 온라인 기능을 강화한 키트로서 기존 Unity Networking과도 호환된다.  로우레벨부터 완전히 새로 제작되었으며 Photon Cloud/Server를 게임 백엔드로 사용했기 때문에 개발하기에 상당히 편리하다.

 

아래는 포톤을 활용하여 멀티플레이 서버를 만드는 매뉴얼이다.

https://paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

 

How to create an online multiplayer game with Unity - Paladin Studios

A step by step guide on how to create an online multiplayer game with Unity

paladinstudios.com

 

3. UNet vs PUN2

조사를 통해 알아보며 개인적으로 PUN2가 더 좋을 것 같다는 생각은 들었다. UNet은 지원을 중단하였기 때문에 버전마다 오류가 생긴다거나 등의 문제가 고려될 것 같다.

 

인규가 UNet과 PUN2의 차이점을 보여주는 유튜브 링크를 보내주었다.

www.youtube.com/watch?v=xLECRl1eyGk

아래는 인규가 정리한 것들이다.

일반적으로 photon이 unet보다 더 빠르다(통신방식의 차이)
가격 photon이 unet보다 싸다 (무료 이후 추가 가격이 훨씬 저렴함)
unet 20명까지 무료 / photon 20명까지 무료
-> 동영상에서는 photon을 추천한다.
photon : 전송하고 받는것을 구체적으로 설정 가능, 세세한 컨트롤이 가능하다.
unet : 좋은 UI 제공, 네트워크를 다루기 좀 더 쉽다.

 

 

4. 결론

포톤의 PUN2를 사용하는 것이 좋을 것 같다.

728x90
반응형

+ 최근 게시글