📌 서버를 구성해보며 리눅스를 경험해봅니다. 처음 리눅스를 하는 분들은 리눅스 명령어 Zip 을 참고해보세요 🙏🏻

📌 Ubuntu 22.04 LTS 환경을 기준으로 작성하였습니다.

1. EC2 생성하기

A. AWS web console로 접속합니다.

B. EC2 메뉴로 접근하세요.

  • Ubuntu 선택 (실습 명령어 테스트는 Ubuntu Server 18.04 LTS 환경에서 진행해보았어요)

  • InstanceType : t3.medium 정도면 괜찮습니다.

  • 스토리지 : 서비스 운영할 것을 고려해서 설정해주세요. 일단 8GB로 설정하고 이후에 늘려도 괜찮습니다. 이 경우, 서버를 끄지 않고 어떻게 확장하면 될지 한번 고민해보세요 😎

  • 키 페어는 최초 생성한 것을 재사용해도 됩니다.

❗ 서버를 사용하지 않을 때는 중지(stop)해주세요. 중지만 해도 EC2 비용이 나가지 않아 상당히 비용절감이 됩니다. (스토리지 등의 비용만 나가는데, 스토리지 비용은 크지 않습니다.)

C. 서버에 접속하기

2. 서버간 ssh 연결 구성

  • systems manager를 활용하여 Bastion 구성을 하셔도 좋습니다. 해당 내용은 영상을 참조하세요~ 🙏🏻

  • Bastion Server로 사용할 별도의 EC2를 생성하고, Bastion Server에서 서비스용 서버에 ssh 연결을 설정해봅시다.

    ## Bastion Server에서 공개키를 생성합니다.
    bastion $ ssh-keygen -t rsa
    bastion $ cat ~/.ssh/id_rsa.pub
    
    ## 접속하려는 서비스용 서버에 키를 추가합니다.
    $ vi ~/.ssh/authorized_keys
    
    ## Bastion Server에서 접속을 해봅니다.
    bastion $ ssh ubuntu@[서비스용 서버 IP]
  • Bastion Server는 자신의 로컬 PC 공인 IP에서만 22번 포트로 접근이 가능하도록 Security Group을 설정합니다.

  • 서비스용 서버에 22번 포트로의 접근은 Bastion 서버에서만 가능하도록 Security Group을 설정합니다.

  • Bastion 서버에서 다른 서버에 접근이 용이하도록 별칭을 설정합니다.

    bastion $ vi /etc/hosts
    [서비스용IP]    [별칭]
    
    bastion $ ssh [별칭]

3. 서버 환경설정 해보기

A. 환경변수 적용하기

  • Session Timeout 설정을 하여 일정 시간 작업을 하지 않을 경우 터미널 연결을 해제할 수 있습니다.

    $ sudo vi ~/.profile
      HISTTIMEFORMAT="%F %T -- "    ## history 명령 결과에 시간값 추가
      export HISTTIMEFORMAT
      export TMOUT=600              ## 세션 타임아웃 설정 
        
    $ source ~/.profile
    $ env

B. Shell prompt 변경하기

  • Bastion 등 식별해야 하는 서버의 Shell Prompt를 설정하여 관리자의 인적 장애를 예방할 수 있습니다.

    $ sudo vi ~/.bashrc
      USERNAME=BASTION
      PS1='[\e[1;31m$USERNAME\e[0m][\e[1;32m\t\e[0m][\e[1;33m\u\e[0m@\e[1;36m\h\e[0m \w] \n\$ \[\033[00m\]'
    
    $ source ~/.bashrc

C. logger 를 사용하여 감사로그 남기기

  • 서버에 직접 접속하여 작업할 경우, 작업 이력 히스토리를 기록해두어야 장애 발생시 원인을 분석할 수 있습니다. 감사로그를 기록하고 수집해봅니다.

    $ sudo vi ~/.bashrc
      tty=`tty | awk -F"/dev/" '{print $2}'`
      IP=`w | grep "$tty" | awk '{print $3}'`
      export PROMPT_COMMAND='logger -p local0.debug "[USER]$(whoami) [IP]$IP [PID]$$ [PWD]`pwd` [COMMAND] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"'
    
    $ source  ~/.bashrc
    $ sudo vi /etc/rsyslog.d/50-default.conf
      local0.*                        /var/log/command.log
      # 원격지에 로그를 남기려면 어떻게 구성해야 할까요?
        
    $ sudo service rsyslog restart
    $ tail -f /var/log/command.log

4. 소스코드 배포, 빌드 및 실행해보기

A. 자바 설치

$ which java
$ sudo apt update
$ sudo apt install default-jre
$ sudo apt install default-jdk

B. 빌드

$ git clone [저장소]
$ cd [저장소]
$ ./gradlew clean build

# jar파일을 찾아본다.
$ find ./* -name "*jar"

C. 실행

$ java -jar [jar파일명] & 
  
# Application을 실행 후 정상적으로 동작하는지 확인해봅니다.
# 브라우저에서도 http://{서버 ip}:{port}로 접근해보세요.
$ curl http://localhost:8080
  • -Dserver.port=8000 옵션을 활용하여 port를 변경할 수 있어요.

  • 서버를 시작 시간이 너무 오래 걸리는 경우 -Djava.security.egd 옵션을 적용해보세요.

    $ java -Djava.security.egd=file:/dev/./urandom -jar [jar파일명] &
  • 터미널 세션이 끊어질 경우, background로 돌던 프로세스에 hang-up signal이 발생해 죽는 경우가 있는데요. 이 경우 nohup명령어를 활용합니다.

    $  nohup java -jar [jar파일명] 1> [로그파일명] 2>&1  &

D. 종료

# 프로세스 pid를 찾아봅니다.
$ ps -ef | grep java
$ pgrep -f java

# 프로세스를 종료합니다. 
$ kill -2 [PID]

5. DNS 구성하기

무료 도메인 사이트 등을 활용하여 DNS 설정을 합니다.