안녕하세요. 이번 포스트에서는 Rocky Linux 서버에서 NTP 동기화 문제를 해결하고 JWT 토큰 오류를 해결한 과정을 공유하려고 합니다. 시간 동기화 문제는 JWT 토큰 생성 및 사용 시 중요한 요소이기 때문에, NTP 동기화 설정이 제대로 되어 있지 않으면 다양한 문제가 발생할 수 있습니다.

 

* NTP(Network Time Protocol) 서버는 네트워크 상에서 시간을 정확히 맞춰주는 서버입니다. 시스템 시간의 정확한 동기화는 보안, 로그 기록, 일정한 작업 수행을 위해 중요합니다. 정확한 시간 동기화가 없으면 인증 오류, 로그 불일치 등 문제가 발생할 수 있습니다.

문제 발생

서버 로그에서 JWT 토큰 생성 시 다음과 같은 오류가 발생했습니다:

Error: "invalid_grant", Description: "Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe"

timedatectl status 명령어를 통해 시간 동기화 상태를 확인한 결과, System clock synchronized: no로 표시되었고, NTP 서버와 동기화되지 않는 문제가 발견되었습니다.

문제 해결 과정

1. chrony 설치 및 설정

Rocky Linux에서는 chrony를 사용하여 NTP 동기화를 설정합니다.

chrony 설치

sudo yum install chrony

chrony.conf 파일 설정

/etc/chrony.conf 파일을 열어 NTP 서버 설정을 추가합니다.

sudo vi /etc/chrony.conf

 

다음과 같은 설정을 추가합니다:

# Use public servers from the pool.ntp.org project.
pool pool.ntp.org iburst
server time.google.com iburst
server time.cloudflare.com iburst
server ntp.ubuntu.com iburst

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Specify directory for log files.
logdir /var/log/chrony

2. chrony 서비스 재시작 및 동기화 강제 업데이트

chrony 서비스를 재시작하고 시간 동기화를 강제 업데이트합니다.

sudo systemctl restart chronyd
sudo chronyc -a makestep

3. timedatectl 상태 확인

시간 동기화 상태를 확인합니다.

 
timedatectl status

 

출력 예시:

Local time: Mon 2024-07-29 10:32:29 KST
Universal time: Mon 2024-07-29 01:32:29 UTC
RTC time: Mon 2024-07-29 01:32:29
Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

4. 방화벽 설정 확인

서버의 방화벽 설정을 확인하여 NTP 트래픽이 차단되지 않도록 설정합니다.

sudo iptables -A INPUT -p udp --dport 123 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
sudo service iptables save

5. 수동 NTP 동기화

ntpdate를 사용하여 수동으로 NTP 서버와 동기화를 시도합니다.

sudo yum install ntpdate
sudo ntpdate pool.ntp.org

6. 시스템 재부팅

모든 설정을 완료한 후, 시스템을 재부팅하여 설정이 제대로 적용되도록 합니다.

sudo reboot

7. 최종 확인

시스템 재부팅 후, timedatectl status 명령어를 실행하여 시스템 시간 동기화 상태를 다시 확인합니다.

결론

이 단계를 통해 시스템 시간이 NTP 서버와 올바르게 동기화되었으며, JWT 토큰 생성 및 사용 시 발생하는 시간 관련 오류가 해결되었습니다. 시스템 시간이 정확하게 동기화됨으로써 시간에 민감한 작업이 정상적으로 수행될 수 있게 되었습니다.

이와 같은 문제를 해결할 때는 NTP 서버와의 시간 동기화 상태를 항상 확인하고, 필요한 경우 방화벽 설정 및 네트워크 설정을 점검하여 원활한 동기화가 이루어지도록 해야 합니다.

centos 서버 자체에 jenkins 설치 하는 방법에 이어 docker로 jenkins를 띄우는 방법에 대해서 알아보겠습니다.

 

1. EC2 인스터스 시작 및 설정

1) 보안 그룹 설정 시 테스트를 위해 로컬 ip에 8080(기본 Jenkins 포트) 22(SSH)를 열어 둡니다.

2. EC2 인스턴스 연결

1) SSH로 인스턴스 연결

3. Docker 설치

sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user

4. Jenkins Docker 이미지 실행

docker run -d -p 8080:8080 -p 50000:50000 --restart=always jenkins/jenkins:lts

5. Jenkins 초기 설정

docker exec [컨테이너 ID] cat /var/jenkins_home/secrets/initialAdminPassword

6. Jenkins 접속 확인

http://[EC2 인스턴스의 퍼블릭 IP]:8080

'Server > Docker' 카테고리의 다른 글

[Ubuntu] Docker 설치하기  (0) 2023.10.23
.net core React docker image 만드는 법  (0) 2023.04.03
Docker 명령어  (0) 2023.01.29
Docker 설치 - linux편  (0) 2023.01.29
Docker 설치 - windows편  (0) 2023.01.29

[linux] MongoDB 설치하기 (tistory.com)

 

[linux] MongoDB 설치하기

저번 시간에는 aws ec2 centos linux에 MongoDB를 설치하기 위해 드라이브 공간을 추가해보는 작업을 진행하였습니다. [linux] AWS Centos EBS Volume 추가하기 (tistory.com) [linux] AWS Centos EBS Volume 추가하기 AWS Cento

nitpick92.tistory.com

서버의 문제 혹은 접속이 불가능한 상황을 대응하기 위해 주 1회 mongodb 데이터를 S3로 백업할 수 있는 방법에 대해서 정리를 해보았습니다.

 

1. s3 인입 권한을 가진 계정 생성하여 Access Token 발급

1) AWS Console IAM 접속

2) 사용자 추가
3) 직접 정책 연결
4) 정책 생성 클릭
5) JSON 인입

- 삭제 권한은 제거하고 인입 권한만 부여

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        },
        {
            "Effect": "Deny",
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}

6) 권한 정책 창에서 정책 세로고침 후 연결

7) 보안 자격 증명 창에서 엑세스 키 발급

 

2. aws cli 설치 및 연동

# AWS CLI 설치
sudo yum install awscli

# AWS CLI 구성
aws configure

3. mongodb_backup_to_s3.sh 생성

nano mongodb_backup_to_s3.sh
#!/bin/bash

# MongoDB 설정
DB_NAME="your-db"             # 백업할 MongoDB 데이터베이스 이름
COLLECTION_NAME="your-collection"  # 백업할 MongoDB 컬렉션 이름
OUTPUT_DIR="/path/to/backup/folder" # 백업 파일을 저장할 경로

# S3 설정
S3_BUCKET="your-bucket"
TODAY_DATE=$(date '+%Y-%m-%d')
S3_PATH="s3://${S3_BUCKET}/${TODAY_DATE}" # 원하는 경로

# MongoDB에서 지정된 collection 백업
mongodump --db=${DB_NAME} --collection=${COLLECTION_NAME} --out=${OUTPUT_DIR}

# 백업된 데이터를 tarball로 압축
tar -czvf ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz -C ${OUTPUT_DIR} ${DB_NAME}

# 백업된 tarball을 S3로 업로드
aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz ${S3_PATH}/

# JSON 형식으로 백업 데이터를 변환
mongoexport --db=${DB_NAME} --collection=${COLLECTION_NAME} --out=${OUTPUT_DIR}/${COLLECTION_NAME}.json

# 백업된 JSON 데이터를 S3로 업로드
aws s3 cp ${OUTPUT_DIR}/${COLLECTION_NAME}.json ${S3_PATH}/

# (선택적) 로컬에 저장된 백업 파일 및 tarball, json 삭제
rm -rf ${OUTPUT_DIR}/${DB_NAME}
rm ${OUTPUT_DIR}/${COLLECTION_NAME}.tar.gz
rm ${OUTPUT_DIR}/${COLLECTION_NAME}.json

echo "Backup for ${COLLECTION_NAME} completed!"

4. 백업 테스트

./mongodb_backup_to_s3.sh

 

5. 자동 스케줄러(cron)

crontab -e
# 월요일 새벽 2시에 실행
0 2 * * 1 /path/to/script/mongodb_backup_to_s3.sh

 

'Server > AWS' 카테고리의 다른 글

[CentOS] Aws CloudWatch Memory 및 용량 확인  (0) 2023.04.13
[Windows] Aws CloudWatch Memory 및 용량 확인  (0) 2023.04.12
AWS Global Accelerator란?  (0) 2023.03.24

저번 시간에는 aws ec2 centos linux에 MongoDB를 설치하기 위해

드라이브 공간을 추가해보는 작업을 진행하였습니다.
[linux] AWS Centos EBS Volume 추가하기 (tistory.com)

 

[linux] AWS Centos EBS Volume 추가하기

AWS Centos ec2 서버에 드라이브를 추가 세팅하여 MongoDB를 설치해보려고 합니다. 이에 앞서 EBS Volumn을 추가해보려고 합니다. 1. EBS 볼륨 생성 볼륨 생성을 클릭 해줍니다. 연결 시킬 인스턴스 가용 영

nitpick92.tistory.com

 

이어서 mongodb를 설치하는 방법을 알아보겠습니다.

https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/ 참고 하였습니다.

 

1. MongoDB 설치

# 파일 생성 후 내용 저장
https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-amazon/
# 해당 텍스트 붙혀넣기 후 저장
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
# 설치 시작
sudo yum install -y mongodb-org

2. MongoDB 데이터 삽입 공간 변경

# 빈 폴더 생성
sudo mkdir -p /xvdb/mongodb/data/mongo

# 추가 된 스토리지 경로로 설치된 mongo 폴더 카피
cp -ra /var/lib/mongo /xvdb/mongodb/data/mongo

# conf파일 열기
sudo vi /etc/mongod.conf

# 추가 된 스토리지 경로로 dbPath 변경
storage:
	dbPath: /xvdb/mongodb/data/mongo

# 외부에서 접속할 수 있도록 net 변경
net:
	port: 27017
    bindIp: 0.0.0.0

# 권한 부여
sudo chown mongod:mongod /xvdb/mongodb/data/mongo

3. MongoDB 시작

# MongoDB 실행 확인 (없는 거 확인)
ps -ef | grep mongo

# 몽고 디비 실행
sudo systemctl start mongod

# 몽고 디비 상태 확인
sudo systemctl status mongod

# 접속 확인
mongo 혹은 netstat -ano | grep mongo

 

4. 서버 방화벽 오픈

linux 서버 방화벽 오픈

linux CentOS 외부 접속(방화벽 오픈) 허용 (tistory.com)

 

linux CentOS 외부 접속(방화벽 오픈) 허용

# firewalld 설치 sudo yum install firewalld # firewalld 시작 sudo systemctl start firewalld sudo systemctl enable firewalld # port 추가 sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp # firewalld 재로드 sudo firewall-cmd --reload #

nitpick92.tistory.com

aws ec2 보안 그룹 설정 > 인바운드 규칙 > 27017

5. 외부 접속 확인

 

DB Enterprise Server Download | MongoDB

접속 확인

 

 

AWS Centos ec2 서버에 드라이브를 추가 세팅하여 MongoDB를 설치해보려고 합니다.

이에 앞서 EBS Volumn을 추가해보려고 합니다.

 

1. EBS 볼륨 생성

볼륨 생성을 클릭 해줍니다.

연결 시킬 인스턴스 가용 영역을 선택해주세요.

2. 인스턴스 연결

볼륨 상태가 사용 가능으로 변하면 원하는 인스턴스에 볼륨 연결을 해줍니다.
EC2 > 스토리지에서 연결이 확인 되면
인스턴스 재부팅을 진행해주세요.

3. EBS 볼륨 연결 확인하기

$ lsblk # 파일 시스템 조회

lsblk 명령어로 새로 추가된 ebs 볼륨을 확인합니다.
* Linux 커널로 인해 디바이스 이름이 변경이 될 수 있습니다.

4. EBS 볼륨을 파일시스탬 포맷하기

/dev/nvme1n1은 디렉토리가 아니여서 파일 시스템으로 포맷을 해주어야 쓸 수 있습니다.

# file -s <장치명>
$ file -s /dev/nvme1n1
# /dev/nvme1n1: data <- 파일시스템이 존재하지 않는다.
/dev/nvme1n1: data 확인
# 루트 권한 획득
$ sudo -s
# mkfs -t <볼륨타입> <볼륨장치명> -> 해당 볼륨을 파일시스템으로 포맷
$ mkfs -t ext4 /dev/nvme1n1

/dev/nvme1n1:  Linux rev 1.0 ext4 filesystem data 확인

5. EBS 볼륨 마운트 설정하기

마운트 작업이란 운영체제에 파일 시스템을 연결하는 것입니다.

(윈도우 E: 드라이브 처럼)

# 현재 파일시스템들의 UUID와 TYPE을 확인
$ blkid
UUID와 TYPE을 저장해줍니다.
$ vi /etc/fstab

UUID= "aaaaaaaa" /xvdb ext4 defaults,nofail 0 2 한 줄 추가해줍니다.
# /etc/fstab에 있는 파일시스템 전체를 mount
$ mount -a
# 리눅스 시스템 디스크 사용량 확인
$ df -h

연결 확인 완료

https://nitpick92.tistory.com/17

 

[linux] centos nginx Reverse-Proxy 서버 만들기

https://nitpick92.tistory.com/11 [linux] centos7 yum nginx 삭제 및 설치 방법 centos 7 환경에서 nginx 삭제 후 재설치하는 방법에 대해서 알아보려고 합니다. 1. nginx 삭제 # 설치 여부 확인 yum list installed nginx # 삭

nitpick92.tistory.com

지난 시간에는 nginx를 Reverse-Proxy 서버로 사용하는 법을 알아보았습니다.

이어서 하나의 서버에서 여러 도메인을 관리할 수 있는 방법을 알아보겠습니다.

 

nginx multi port

1. nginx conf 파일 수정

# server1
server {
      # 들어오는 port
      listen       8080;
      server_name  localhost;

      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /usr/share/nginx/html;
      }

      # 실제로 바라볼 port
      location / {
        proxy_pass http://127.0.0.1:9090;
      }
}

# server2
server {
      # 들어오는 port
      listen       8081;
      server_name  localhost;

      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /usr/share/nginx/html;
      }

      # 실제로 바라볼 port
      location / {
        proxy_pass http://127.0.0.1:9091;
      }
}

2. nginx 서버를 재시작 해줍니다.

sudo systemctl restart nginx

https://nitpick92.tistory.com/11

 

[linux] centos7 yum nginx 삭제 및 설치 방법

centos 7 환경에서 nginx 삭제 후 재설치하는 방법에 대해서 알아보려고 합니다. 1. nginx 삭제 # 설치 여부 확인 yum list installed nginx # 삭제 yum remove {your_pakage_name} 2. nginx 설치 # 기본적으로 nginx를 제공

nitpick92.tistory.com

지난 시간에는 nginx를 설치하는 방법을 알아보았습니다.

 

docker green-blue 무중단 배포를 시도 하던 중 

Reverse-Proxy 서버 역할을 할 수 있는 그 무언가 필요하였습니다.

 

nginx를 Reverse-Proxy 서버로 사용할 수 있도록 세팅하는 방법에 대해 알아보겠습니다.

프록시 서버 이미지

ClientProxy Server에 요청을 하고
Proxy Server는 각 웹서버에 요청 후 받은 응답을
Client에 전달하는 구조 입니다.

1. nginx conf 파일 수정

  • 처음 세팅 시 default.conf를 바라보고 있는데  주석 처리를 해줍니다.
#include /etc/nginx/conf.d/*.conf;
  • server 관련 정보를 입력해줍니다.
server {
      # 들어오는 port
      listen       8080;
      server_name  localhost;

      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /usr/share/nginx/html;
      }

      # 실제로 바라볼 port
      location / {
        proxy_pass http://127.0.0.1:9090;
      }
}

2. nginx 서버를 재시작 해줍니다.

sudo systemctl restart nginx
8080 포트로 들어오면 실제로는 9090포트를
바라보는 역할을 하도록 세팅을 완료하였습니다.

 

# firewalld 설치
sudo yum install firewalld

# firewalld 시작
sudo systemctl start firewalld
sudo systemctl enable firewalld

# port 추가
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp

#  firewalld  재로드
sudo firewall-cmd --reload

# firewalld 방화벽 리스트 확인
sudo firewall-cmd --list-all

 

외부에서 8080 포트로 접근할 수 있도록 방화벽을 열어주는 작업입니다.

 

배포 자동화에 앞서 Linux CentOS7 환경에
Jenkins를 설치해보고자 합니다.
Jenkins란 배포 자동화를 도와주는 서버입니다.

 

1. 초기 세팅

  • 한국 시간으로 변경
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
  • java 설치
sudo yum list "java-11-openjdk-devel*"
sudo yum install java-11-openjdk-devel.x86_64
which javac
readlink -f /usr/bin/javac
sudo vim /etc/profile
// 맨 하단에 추가
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-devel.x86_64/bin/javac
PATH=$PATH:$JAVA_HOME/bin
export PATH

source /etc/profile
echo $JAVA_HOME

 

2. Jenkins 설치

# 젠킨스 stable 버전 설치파일 다운로드
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

# 젠킨스 설치 key import
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

# 젠킨스 패키지 설치
sudo yum install jenkins -y

# 젠킨스 설치확인
rpm -qa | grep jenkins

 

3. Jenkins port 변경

  • jenkins port 변경
# jenkins 설정파일 여기 -> 파일권한이 없으면 상황에 맞게 chmod 설정
vi /etc/sysconfig/jenkins

# port 변경

// AS - IS
JENKINS_PORT="8080"

// TO - BE
JENKINS_PORT="9090"
  • jeknins 방화벽 설정
# firewalld 설치
sudo yum install firewalld

# firewalld 시작
sudo systemctl start firewalld
sudo systemctl enable firewalld

# port 추가
sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp

# firewalld 재로드
sudo firewall-cmd --reload

 

  • jenkins 시작
# 젠킨스 시작
sudo systemctl start jenkins.service

# 젠킨스 프로세스 확인
ps -ef | grep jenkins

# 젠킨스 동작 확인
sudo systemctl status jenkins.service

 

4. Jenkins 접속

  • 웹 브라우저 접속(공인ip:port번호) 합니다.
  • pw 확인 합니다.
  • 접속 확인 합니다.
# 패스워드 출력
cat /var/lib/jenkins/secrets/initialAdminPassword

5. Jenkins 세팅

  • install suggested plugins를 클릭하고 계정 생성을 진행합니다.

로그인 화면

  • 해당 플러그인을 설치해줍니다.
1. github integration
2. post build task
3. publish over ssh

Plugin 설치하는 곳

'Server > 배포 자동화' 카테고리의 다른 글

.net core + Jenkins + Docker CI/CD 구성하기  (0) 2023.02.10

centos 7 환경에서 nginx 삭제 후 재설치하는 방법에 대해서 알아보려고 합니다.

 

1. nginx 삭제

# 설치 여부 확인
yum list installed nginx

# 삭제
yum remove {your_pakage_name}

2. nginx 설치

# 기본적으로 nginx를 제공하지 않기 떄문에 저장소 설정필요
vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# nginx 설치
yum install nginx -y

3. port 변경

# 방화벽 포트 열기
firewall-cmd --permanent --zone=public --add-port=9090/tcp

# 재부팅
firewall-cmd --reload

# 포트 확인
firewall-cmd --list-ports

# nginx 포트 설정
vi /etc/nginx/conf.d/default.conf
listen       9090;

# systemctl enable nginx
# systemctl start nginx

4. 동작 확인

+ Recent posts