EC2 환경 설정 (1)
EC2 환경 설정 (1)
SSAFY 프로젝트를 진행하기 위해 EC2 환경 설정 과정을 정리하였다
초기설정
- pemKey로 ssh 연결
- vscode ssh, mobaXterm 등등..
- vscode ssh 연결을 하면 copilot을 사용할 수 있어서 편리하다
기본 패키지 설치
1 2 3
sudo apt update sudo apt upgrade -y sudo apt install -y build-essential
한국으로 시간 설정
1 2 3 4
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime # 시간 확인 date
서버 IP 확인
1
curl ifconfig.me
방화벽(UFW) 설정
Ubuntu의 방화벽인 UFW(Uncomplicated Firewall)를 설정하여 필요한 포트만 열어준다
UFW 상태 확인
1
sudo ufw status
- 기본적으로 웹 서비스를 위해 다음 포트들을 허용
- 22번: SSH 접속용
- 80번: HTTP 웹 서비스용
- 443번: HTTPS 보안 웹 서비스용
- 8080번: Jenkins와 같은 개발 서비스용 -> 추후 서브 도메인으로 설정할 예정
1 2 3 4
sudo ufw allow 22 sudo ufw allow 80 sudo ufw allow 443 sudo ufw allow 8080
UFW 활성화
1
sudo ufw enable
UFW를 활성화(Enable)하기 전에 반드시 SSH 접속을 위한 22번 포트를 허용(allow)해야 한다
작업 중에는 안전을 위해 여러 개의 터미널을 열어두는 것이 좋다
UFW 상태 및 등록된 규칙 확인
1
sudo ufw status numbered
Docker 설치
- 기본 패키지 설치
apt-transport-https
: HTTPS 프로토콜을 통해 패키지 저장소에 접근할 수 있게 해주는 패키지ca-certificates
: 인증서 관련 패키지로, HTTPS 통신 시 필요한 신뢰할 수 있는 인증서 제공curl
: 명령줄에서 데이터를 다운로드하거나 서버와 통신할 수 있는 도구software-properties-common
: 저장소(Repository) 관리 명령어(add-apt-repository 등)를 사용할 수 있게 해주는 패키지
1
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
- 자동 설치 스크립트 활용
- 리눅스 배포판 종류를 자동으로 인식하여 Docker 패키지를 설치해주는 스크립트를 제공
1
sudo wget -qO- https://get.docker.com/ | sh
Docker 서비스 실행하기 및 부팅 시 자동 실행 설정
1 2 3
sudo systemctl start docker sudo systemctl enable docker sudo systemctl restart docker
현재 사용자한테 권한부여 및 서버 재시작
1 2
sudo usermod -aG docker $(whoami) sudo reboot
권한 확인
1
docker -v
Docker Hub 로그인
Nginx 설치
설치
1
sudo apt install -y nginx
활성화 및 시작
1 2
sudo systemctl enable nginx sudo systemctl start nginx
상태 확인
1
sudo systemctl status nginx
기본 페이지 확인
- http://<서버IP> 주소로 접속하면 nginx 화면을 확인할 수 있다서버IP>
DuckDNS
- domain 만들기
current ip에 확인했던 EC2 ip를 입력하고 update ip
Let’s Encrypt 무료 SSL 인증서를 발급받아 Nginx 웹서버에 적용
1
sudo certbot --nginx -d gaemibot.duckdns.org
- gaemibot.duckdns.org 접속하면 nginx 화면을 확인할 수 있다
Jenkins 설치
Docker 네트워크 만들기
1
docker network create jenkins
Docker-in-Docker(dind) 컨테이너 띄우기
- dind를 사용하여 Jenkins에서 Docker를 사용할 수 있도록 설정한다
1 2 3 4 5 6 7
docker run --name jenkins-docker --rm --detach \ --privileged --network jenkins --network-alias docker \ --env DOCKER_TLS_CERTDIR=/certs \ --volume jenkins-docker-certs:/certs/client \ --volume jenkins-data:/var/jenkins_home \ --publish 2376:2376 \ docker:dind
Jenkins Dockerfile 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 1. Jenkins 공식 이미지 기반 FROM jenkins/jenkins:lts # 2. root 권한으로 전환 USER root # 3. Docker CLI 설치 RUN apt-get update && apt-get install -y \ lsb-release \ curl \ gnupg2 \ software-properties-common # Docker GPG 키 추가 RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # Docker 레포지토리 등록 RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \ https://download.docker.com/linux/debian $(lsb_release -cs) stable" \ > /etc/apt/sources.list.d/docker.list # Docker CLI만 설치 RUN apt-get update && apt-get install -y docker-ce-cli # 4. 다시 jenkins 유저로 변경 USER jenkins
Jenkins 컨테이너 띄우기
1
docker build -t myjenkins:lts .
1 2 3 4 5 6 7 8
docker run --name jenkins --restart=on-failure --detach \ --network jenkins \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \ -v jenkins-data:/var/jenkins_home \ -v jenkins-docker-certs:/certs/client:ro \ -p 8080:8080 -p 50000:50000 \ myjenkins:lts
Nginx Jenkins 설정
서브 도메인 방식으로 Jenkins에 접근하기 위해 Nginx 설정을 추가한다
- Jenkins용 Nginx 설정 만들기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
sudo tee /etc/nginx/sites-available/jenkins <<EOF server { listen 80; server_name jenkins.gaemibot.duckdns.org; return 301 https://\$host\$request_uri; } server { listen 443 ssl http2; # HTTP/2 server_name jenkins.gaemibot.duckdns.org; ssl_certificate /etc/letsencrypt/live/gaemibot.duckdns.org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/gaemibot.duckdns.org/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 압축 설정 gzip on; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 연결 매개변수 최적화 client_max_body_size 100M; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; location / { proxy_pass http://localhost:8080; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; # 추가 성능 최적화 proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 8 32k; proxy_busy_buffers_size 64k; # Jenkins 특화 설정 - 웹소켓 성능 튜닝 proxy_set_header Connection "upgrade"; proxy_set_header Upgrade \$http_upgrade; } # 정적 콘텐츠 캐싱 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)\$ { proxy_pass http://localhost:8080; expires 1d; add_header Cache-Control "public"; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; } } EOF
sites-enabled 심볼릭 링크 생성
1
sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
Nginx 설정 테스트 및 재시작
1
sudo nginx -t && sudo systemctl reload nginx
Certbot으로 SSL 인증서 발급
1
sudo certbot --nginx -d gaemibot.duckdns.org -d jenkins.gaemibot.duckdns.org
nginx 재시작
1
sudo systemctl reload nginx
서브 도메인 접근 확인
https://jenkins.gaemibot.duckdns.org/ 경로로 접속이 가능하다
Jenkins에서도 Location URL을 설정한다
Reference
This post is licensed under CC BY 4.0 by the author.