독서/📚

[Next Step] 3.3 원격 서버에 배포 (p84) 정리

leejinwoo1126 2023. 7. 11. 21:38
반응형

 


    요구사항

     로컬 개발 환경에 설치한 HTTP 웹 서버를 물리적으로 떨어져 있는 원격 서버에 배포해 정상적으로 동작하는지 테스트한다. 

    이때 HTTP 웹 서버 배포 작업은 root 계정이 아닌 배포를 담당할 새로운 계정을 만들어 진행한다.

     

    ① 계정 추가 및 sudo 권한 할당

    ② 각 계정별 UTF-8 인코딩 설정해 한글 이슈 해결

    ③ JDK, 메이븐 설치

    ④ Git설치, clone 및 빌드

    ⑤ 방화벽 설정(ufw)

    ⑥ 소스 코드 재배포

     

    참고. AWS 사용할 경우 아래 링크 참고 (p83)

    https://opentutorials.org/module/1946

     

    참고. 영상 자료

    https://www.youtube.com/watch?v=dWGzApCuF9M
    https://www.youtube.com/watch?v=N8iLAuAo-Qw

    https://www.youtube.com/watch?v=5hjYe_PggJI 


    Docker로 로컬 개발 환경을 구축하고 있어서, Ubuntu Image에 요구사항 처리 진행함

     

    1. 계정 추가 및 sudo 권한 할당 

    Ubuntu 최신 이미지를 사용했을 때 minimize 되어 있고, sudo가 설치되어 있지 않았다

     

    sudo 설치

    $ apt-get install -y sudo vim

    sudo(superuser do) : 특정 계정에 대해 root 권한 전체 또는 지정한 일부만 사용 가능하도록 권한 부여/관리/제어/실행을 담당

     

    아래 3개의 파일 통해 유저 생성, 그룹 할당, sudo 권한 부여 정보 관리한다

    # 유저 정보
    $ cat /etc/passwd
    
    # 그룹 정보
    $ cat /etc/group
    
    # sudo 권한 부여 관리
    $ sudo vim /etc/sudoers

     

     

    신규 그룹/유저 생성, 비밀번호 수정

    $ groupadd -g 777 ubuntu
    
    $ useradd -mru 777 -g ubuntu ubuntu
    
    $ echo 'ubuntu:ubuntu' | chpasswd

     

     

    신규 아이디를 sudo 그룹 추가

    # sudo 그룹에 ubuntu 추가
    $ usermod -aG sudo ubuntu 
    
    # 확인
    $ cat /etc/group | grep ubuntu
    $ group ubuntu

     

    sudo 그룹 추가 전/후

     

    sudo 권한 부여

    - sudo 그룹에 추가했다고 sudo 를 사용할 수 없고, /etc/sudoers 파일에 설정 해야 비로서 sudo 사용가능

    - 내부 테스트이므로 전부 ALL을 주지만 실제 운영 환경에서는 적절히 할당하기

     

    방법1. Vim 편집

    $ vim /etc/sudoers
    
    #편집 후 저장
    root ALL=(ALL:ALL) ALL
    ubuntu ALL=(ALL:ALL) ALL

     

    방법2. append 명령어로 추가

    $ echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
    $ cat /etc/sudoers

     

     

    ubuntu 계정 sudo 동작 확인

    정상 설정 되지 않았을 경우 /root 디렉토리 조회시 아래와 같이 에러 메시지 확인 가능하다
    ls : '/root' 디렉터리를 열 수 없습니다: 허가 거부

    정상 확인

     


    2. 각 계정별 UTF-8 인코딩 설정 (한글 이슈 해결)

    방법1.

    vim으로 ~/.bashrc 하단에 아래 내용을 추가한다

    export LANG=ko_KR.UTF-8
    export LC_ALL=ko_KR.UTF-8
    export LANGUAGE=ko_KR:ko:en_US:en

     

     

    date, locale, env 명령어 통해 설정 적용 확인 가능

    ssh 재접속시에도 유지

     

    방법2. 

    시스템 전체 적용

    $ sudo locale-gen ko_KR.EUC-KR ko_KR.UTF-8
    $ sudo dpkg-reconfigure locales

     

    내 계정에 대한 로컬 설정 

    $ vi .bashrc
    LANG="ko_KR.UTF-8"
    LANGUAGE="ko_KR:ko:en_US:en"
    
    $ source .bash_profile   // 설정 반영
    $ env        // 설정 확인

     


    3. JDK, Maven 설치

    영상에서는 wget으로 직접 다운받아서 압축 해제 후 심볼릭 링크를 걸어 사용하는 방식을 취하고 있다(넘어가요)

     

    설치

    # Ubuntu Image에 원하지 않는 jdk가 설치되어 있는 경우, 삭제 후 설치
    $ apt remove openjdk*
    
    
    # jdk11, maven 설치
    $ apt-get install -y openjdk-11-jdk maven

     

     

    패키지 설치 경로 확인

    # jdk 설치 경로
    $ ls -al /usr/lib/jvm
    lrwxrwxrwx 1 root root   21 May 10 06:03 java-1.11.0-openjdk-amd64 -> java-11-openjdk-amd64
    drwxr-xr-x 9 root root 4096 Jul 11 22:09 java-11-openjdk-amd64
    drwxr-xr-x 2 root root 4096 Jul 11 22:09 openjdk-11
    
    # maven 설치 경로
    $ ls -al /usr/share/maven

     

     

    JAVA_HOME, MAVEN_HOME 환경 변수 설정

    -환경 변수의 경우 .bashrc .zshrc .bash_profile .profile 등과 같은 파일에 사용자 설정하여 시스템 접속시 적용되게 된다

    -이번에는 .bashrc 에 환경변수 설정한다

    # .bashrc 에 환경 변수 추가
    $ vim ~/.bashrc 
    
    export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
    export MAVEN_HOME=/usr/share/maven
    export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    
    # 바로 반영
    $ source ~/.bashrc

    재접속시 .bashrc 환경 변수를 적용하게 되는데, source 명령어 통해 재접속 하지 않고 바로 환경 변수 적용 가능

     

     

    설정 확인

    $ java -version
    openjdk version "11.0.19" 2023-04-18
    OpenJDK Runtime Environment (build 11.0.19+7-post-Ubuntu-0ubuntu122.04.1)
    OpenJDK 64-Bit Server VM (build 11.0.19+7-post-Ubuntu-0ubuntu122.04.1, mixed mode, sharing)
    
    $ mvn -version
    Apache Maven 3.6.3
    Maven home: /usr/share/maven
    Java version: 11.0.19, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
    Default locale: ko_KR, platform encoding: UTF-8
    OS name: "linux", version: "6.2.0-36-generic", arch: "amd64", family: "unix"
    
    $ echo $JAVA_HOME
    /usr/lib/jvm/java-1.11.0-openjdk-amd64
    
    $ echo $MAVEN_HOME
    /usr/share/maven

     


    4. Git설치 및 clone

    git 설치

    $ apt-get install -y git
    $ git --version

     

     

    프로젝트 소스 내려 받기

    아래 web-application-server 저장소를 clone한다

     

    https://github.com/slipp/web-application-server

     

    GitHub - slipp/web-application-server: 웹 애플리케이션 서버 실습을 위한 뼈대

    웹 애플리케이션 서버 실습을 위한 뼈대. Contribute to slipp/web-application-server development by creating an account on GitHub.

    github.com

     

    home 디렉토리에 repositories 디렉토리를 만들고 주어진 저장소를 clone 한다

    $ cd ~
    $ mkdir repositories
    $ cd repositories 
    $ git clone https://github.com/slipp/web-application-server.git

     

     

    Maven Build 후 실행

    $ cd web-application-server
    $ mvn clean package -DskipTests
    $ ll
    $ java -cp target/classes:target/dependency/* webserver.WebServer 8090 &

    *형식 : java -cp <classpath> <MainClass>

    -cp : classpath 지정

    <classpath> : class 파일이나 jar, war 파일이 위치한 경로, 여러개 인 경우 : 으로 연결

    <Mainclass> : 실행하려는 자바 어플리케이션의 메인 클래스 나타냄, 패키지.클래스명 

    8090 : 실행 포트 번호 

    & : 백그라운드 실행


    5. ufw 방화벽 설정

    ufw란 ?
    - Uncomplicated Firewall 약어 (Uncomplicated : 복잡하지 않은)
    - 일반적인 방화벽 설정을 간소화하여 사용자가 쉽게 설정하고 관리할 수 있도록 도와준다
    - 주로 Debian 및 Ubuntu와 같은 Debian 계열의 리눅스 배포판에서 사용되며, 이러한 시스템에서는 기본적으로 설치되어 있을 수 있습니다. 사용자는 명령어 라인을 통해 ufw를 구성하고 관리할 수 있습니다.

     

     

    ufw 설치

    $ sudo apt-get install -y ufw

     

    기본 방화벽 설정

    sudo ufw enable 
    sudo ufw allow ssh
    sudo ufw allow 80/tcp
    sudo ufw allow 8090/tcp
    sudo ufw status

    - ssh의 경우 22번 포트 tcp 통신을 허용

    - 80/tcp의 경우 웹서버(nginx) 추가시 필요하므로 사전에 추가

    - docker container 에서 8090 port forwarding을 하고 있어 허용

     

    참고. 

    https://webdir.tistory.com/206

     

    [Ubuntu] 우분투 방화벽(UFW) 설정

    우분투의 기본적인 방화벽은 UFW입니다. 이는 iptables를 좀 더 쉽게 설정할 수 있도록 한 것인데 간단한 방화벽 구성에는 문제가 없지만 수준 높은 방화벽 구성에는 iptables 룰을 직접 사용해야 합

    webdir.tistory.com

     

     

    서버 아이피와 포트(8090) 접속

    정상 동작 확인

     

     

     

    반응형