AWS Docker 로 서버 구축
설치
ubuntu:latest , java8 , maven, mariadb, git
1. Dockerfile
-----------------------------------------------------------------------------------------------
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
# 필요한것들 install
RUN apt-get install -y systemd
RUN apt-get install -y net-tools
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y vim
RUN apt-get install -y nmap
RUN apt-get install -y unzip
# java 8 설치
RUN wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
RUN tar xzvf jdk-8u141-linux-x64.tar.gz
RUN ln -s jdk1.8.0_141/ java
ENV PATH /java/bin:$PATH
#tomcat8.5 install 설치 위치는 /
RUN wget http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
RUN tar xzvf apache-tomcat-8.5.34.tar.gz
RUN ln -s apache-tomcat-8.5.34 tomcat8.5
#메이븐 설치 및 환경
RUN wget http://mirrors.koehn.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip
RUN unzip apache-maven-3.5.4-bin.zip
RUN ln -s apache-maven-3.5.4 maven
ENV PATH /maven/bin:$PATH
#mariadb 설치
RUN apt-get install software-properties-common -y
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
RUN sh -c "echo 'deb https://mirrors.evowise.com/mariadb/repo/10.2/ubuntu '$(lsb_release -cs)' main' > /etc/apt/sources.list.d/MariaDB.list"
RUN apt-get install mariadb-server mariadb-client -y
RUN systemctl enable mariadb.service
EXPOSE 8079
EXPOSE 8080
EXPOSE 3306
CMD /bin/bash
-----------------------------------------------------------------------------------------------
위 다커 파일에서는 로컬로 maria db 접속 가능하나 외부 연결 방법을 모르겠다.
이유는 maridb 를 설치 할 때 root 비밀번호를 여부를 물어보는데 이 동작을 DockerFile 파일에서 설정 방법을 못하기 때문에
maridb가 제대로 설치가 안 되기 때문이다.
2. Dockerfile
----------------------------------------------------------------------------------------------------------------------------------------
FROM ubuntu:latest
FROM mariadb:latest
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
# 필요한것들 install
RUN apt-get install -y systemd
RUN apt-get install -y net-tools
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y vim
RUN apt-get install -y nmap
RUN apt-get install -y unzip
# java 8 설치
RUN wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
RUN tar xzvf jdk-8u141-linux-x64.tar.gz
RUN ln -s jdk1.8.0_141/ java
ENV PATH /java/bin:$PATH
#tomcat8.5 install 설치 위치는 /
RUN wget http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
RUN tar xzvf apache-tomcat-8.5.34.tar.gz
RUN ln -s apache-tomcat-8.5.34 tomcat8.5
#메이븐 설치 및 환경
RUN wget http://mirrors.koehn.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip
RUN unzip apache-maven-3.5.4-bin.zip
RUN ln -s apache-maven-3.5.4 maven
ENV PATH /maven/bin:$PATH
EXPOSE 8079
EXPOSE 8080
EXPOSE 3306
CMD /bin/bash
#docker build -t jh .
#docker run -dit --name jh -p 8080:8080 -p 3306:3306 jh
#docker exec -it jh bin/bash
#설치 확인
#grep . /etc/*-release
#java -version
#git --version
#mvn --version
#mariadb --version
#루트디렉토리에 톰켓 확인
#ls -al
#RUN apt-get install -y maven
#RUN apt-get remove openjdk* -y
#RUN apt-get autoremove --purge -y
#RUN apt-get autoclean
#RUN apt install oracle-java8-installer -y
#mariadb 설치
#RUN apt-get install software-properties-common -y
#RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
#RUN sh -c "echo 'deb https://mirrors.evowise.com/mariadb/repo/10.2/ubuntu '$(lsb_release -cs)' main' > /etc/apt/sources.list.d/MariaDB.list"
#RUN apt-get install mariadb-server mariadb-client -y
#RUN systemctl enable mariadb.service
#docker run -d --name mysqltest -p (열려있는 포트):3306 -e MYSQL_ROOT_PASSWORD=(원하는 비밀번호) mysql
#docker run -d --name mysqltest -p (열려있는 포트):3306 -e MYSQL_ROOT_PASSWORD=(원하는 비밀번호) mysql
#docker run --name some-app --link some-mariadb:mysql -d application-that-uses-mysql
#docker run -it --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
#docker run -dit --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"3307" -P "3307" -uroot -p "1111"'
#docker run -dit --name jh -p 8080:8080 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1111 mariadb
----------------------------------------------------------------------------------------------------------------------------------------------------------
위 다커파일로 변경해서 만들어 보았다.
FROM ubuntu:latest
FROM mariadb:latest
우분트 최신버전과 mariadb 가 설치 될 것이다. 그러나 mariadb 설정 변경이 안된다.
1.AWS docker 설치
1. 공통 스크립트
도커는 다양한 리눅스 배포판에 대해 배포판 종류를 자동으로 인식해서 도커 패키지를 설치해 주는 스크립트를 제공한다. 아래 스크립트를 배포판 종류에 상관 없이 실행하면 도커 설치가 진행된다.
sudo wget -qO- http://get.docker.com/ | sh
Ubuntu에서 스크립트를 실행한 모습이다. 도커에서 자동으로 배포판 버전을 감지해서 알맞는 도커를 설치해 준다.
설치가 완료되면 docker version 명령어를 실행해 도커가 정상적으로 설치 되었는지 확인한다.
centos7.5 위 방법이 안될 경우
Docker CE를 CentOS 7 (방법 2)에 설치하는 방법
에러
[ec2-user@ip-172-31-31-217 ~]$ sudo yum install docker
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
No package docker available.
Error: Nothing to do
sudo yum install yum-utils
sudo yum-config-manager --enable rhui-REGION-rhel-server-extras
sudo yum install docker
먼저 이전 버전의 docker를 제거합니다 (있는 경우).
$ sudo yum remove docker docker-common docker-selinux docker-engine-selinux docker-engine docker-ce
다음은 필요한 패키지를 설치합니다.
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
docker-ce repo를 구성합니다.
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
로드 된 플러그인 : fastestmirror repo 추가 : https://download.docker.com/linux/centos/docker-ce.repo 파일을 가져 오는 중 https://download.docker.com/linux/centos/docker-ce.repo /etc/yum.repos.d/docker-ce.repo repo가 /etc/yum.repos.d/docker-ce.repo에 저장되었습니다.
마지막으로 docker-ce 설치 :
$ sudo yum install docker-ce
도커 서비스를 사용하는 방법
$ sudo systemctl enable docker.service
샘플 출력 :
/etc/systemd/system/multi-user.target.wants/docker.service에서 /usr/lib/systemd/system/docker.service로 심볼릭 링크가 생성되었습니다.
CentOS7 / RHEL7에서 도커 서비스를 시작 / 중지 / 재시작하는 방법
$ sudo systemctl start docker.service ## <-- Start docker ##
$ sudo systemctl stop docker.service ## <-- Stop docker ##
$ sudo systemctl restart docker.service ## <-- Restart docker ##
$ sudo systemctl status docker.service ## <-- Get status of docker ##
2. Ubuntu Linux 설치 방법
자동 설치 스크립트를 사용하지 않고, 우분투에서 직접 설치하려면 아래 스크립트를 실행한다.
sudo apt-get update
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
/usr/bin/docker.io 실행 파일을 직접 사용하기 보다는 링크를 만들어 사용하는 것이 좋다.
3. CentOS(RedHat, Fedora)
RedHat계열의 리눅스 OS에서 도커를 직접 설치하려면 아래 스크립트를 실행한다.
#Install
sudo yum install docker
#Docker 서비스 실행
sudo service docker start
#부팅시 자동 실행 설정
sudo chkconfig docker on
도커 설치가 진행되고, 설치가 완료되면 아래처럼 docker version 명령어를 입력하여 제대로 설치 되었는지 확인한다.
2. Dockerfile 설치
home 디렉토리에 docker 디렉토리 생성 한다.
디렉토리 권한 chmod -R 775 docker
docker 디렉토리에 다음 아래 dockerfile 을 vi 편집기로 붙여 생성 한다.
3. Dockerfile 생성 및 실행
1번dockerfile 과 같으나 RUN apt install mariadb-server -y 주석 처리를 했다. 즉 mariadb는 직접 설치 해서 root 비밀번호를
변경 한 후 외부접속 설정 및 utf8 설정 등을 직접 하는 방법이다.
# vi Dockerfile
---------------------------------------------------------------------------------------------------------
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
# 필요한것들 install
RUN apt-get install -y systemd
RUN apt-get install -y net-tools
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y vim
RUN apt-get install -y nmap
RUN apt-get install -y unzip
# java 8 설치
RUN wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
RUN tar xzvf jdk-8u141-linux-x64.tar.gz
RUN ln -s jdk1.8.0_141/ java
ENV PATH /java/bin:$PATH
#tomcat8.5 install 설치 위치는 /
RUN wget http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
RUN tar xzvf apache-tomcat-8.5.34.tar.gz
RUN ln -s apache-tomcat-8.5.34 tomcat8.5
#메이븐 설치 및 환경
RUN wget http://mirrors.koehn.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip
RUN unzip apache-maven-3.5.4-bin.zip
RUN ln -s apache-maven-3.5.4 maven
ENV PATH /maven/bin:$PATH
#mariadb 설치
RUN apt-get install software-properties-common -y
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
RUN add-apt-repository 'deb [arch=amd64,i386,ppc64el] https://ftp.harukasan.org/mariadb/repo/10.2/ubuntu xenial main'
RUN apt update
RUN apt install mariadb-server -y
RUN systemctl enable mariadb.service
RUN service mysql start
#톰캣 실행
RUN tomcat8.5/bin/startup.sh
EXPOSE 8079
EXPOSE 8080
EXPOSE 3306
CMD /bin/bash
----------------------------------------------------------------------------------------------------
빌드
#docker build -t jh .
#docker run -dit --name jh -p 80:8080 -p 3306:3306 jh
컨테이너로 들어가기
#docker exec -it jh bin/bash
설치 확인
#grep . /etc/*-release
#java -version
#git --version
#mvn --version
#mariadb --version
#루트디렉토리에 톰켓 확인
#ls -al
mariadb 설정 변경
#RUN apt install mariadb-server -y
#RUN systemctl enable mariadb.service
다커 파일이 위와 같이 주석 처리로 실행 하였다면
기본 설치 파일들은 이미 Dockerfile 에서 설치가 되어 있어서 다음 명령만 입력하면 된다.
apt install mariadb-server -y
위 설치 시 만약 root 비밀 번호 설정이 없이 설치되었으면 아래 root 비밀번호 분실부터 먼저 할것.
설치가 완료 되면, /etc/mysql/my.cnf
파일로 들어가 주석 처리 해준다.
#bind-address=127.0.0.1
#bind-address=0.0.0.0
한글 깨짐 처리를 위해 다음과 같이 입력한다.
-----------------------------------------------------------------------------------
[client]
default-character-set = utf8
[mysqld]
init_connect = SET collation_connection = utf8_general_ci
init_connect = SET NAMES utf8
character-set-server = utf8
collation-server = utf8_general_ci
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
-----------------------------------------------------------------------------------
mariadb 재 시작
#service mysql restart
mysql 접속해서 확인해 본다. mysql -u root -p
show variables like 'c%';
mysql_secure_installation 이것으로 설정하지 않는다.
root 비밀번호 분실시
마리아디 root 비밀번호 재설정
# service mysql stop
# mysqld_safe --skip-grant-tables --skip-networking &
# mysql -u root
# use mysql;
# update user set password=PASSWORD("new_password_here") where User='root';
-- update user set password=PASSWORD("1111") where User='root';
flush privileges;
원격으로 접속 가능한가 테스트 해본다
Db생성, user 생성 권한 부여 % 로 로컬이 아닌 지역 상권없이 접속 설정
1. create user `test`@`%` identified by 'test';
2. create database test character set=utf8;
3. grant all privileges on test.* to `test`@`%` ;
4. FLUSH PRIVILEGES;
#docker-machine ip
개인 pc 경우 다음과 같이 192.168.99.100
나온다.
그러나 AWS 에는 제공된 도메인 혹은 ip 로 접속 하면 된다.
ec2-54-180-91-219.ap-northeast-2.compute.amazonaws.com
4. 셀 스크리트 작성 으로 자동 배포 테스트
home 디렉토리에 디렉토리 생성
#adduser macaronics
클론
vi depoly.sh
권한 변경
chmod 775 depoly.sh
#!/bin/bash
/tomcat8.5/bin/shutdown.sh
rm -rf www/
git clone https://github.com/braverokmc79/springboot_myslipp2.git www
chmod -R 775 www
cd www
mvn clean package
rm -rf /tomcat8.5/webapps/ROOT
mv target/my-slipp-1-1.0 /tomcat8.5/webapps/ROOT
/tomcat8.5/bin/startup.sh
실행
# ./depoly.sh
5 .[docker] 컨테이너 백업 및 복원
● 컨테이너 백업
도커 이미지는 OS 를 담고 있으며, 하나 이상의 이미지를 가질수 있다. 도커 컨테이너는 이미지로부터 생성되는 실행중인 인스턴스이다. 도커 컨테이너 백업을 위해서는 commit 을 해야한다. commit 을 하면 현재 상태가 도커 이미지로 저장된다.
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78727078a04b debian:8 "/bin/bash" 13 seconds ago Up 11 seconds container1
위의 docker ps 명령의 결과로 하나의 컨테이너가 up 상태임을 확인 할 수 있다. 컨테이너 아이디는 78727078a04b 이고, 컨테이너 이름은 container1 이다. 이제, commit 명령을 사용하여 현재 실행 상태를 스냅샷 떠보자.
# docker commit -p 78727078a04b container1 e09f9ac65c8b3095927c14ca0594868f73831bde0800ce66415afeb91aea93cf
-p 옵션은 커밋하기 위해 컨테이너를 일시 중지 시키는 옵션이다. 커밋 명령을 통해 container1 이란 이름의 이미지가 하나 생성되었음을 아래와 같이 확인 할 수 있다.
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE container1 latest e09f9ac65c8b 39 seconds ago 125.1 MB
이제 재배포 할 수 있는 컨테이너 백업 이미지 하나를 얻게 되었다. 다른 도커 호스트 시스템에 우리의 container1 이미지를 재배포(redeploy)하려면 개인 도커 레포지토리에 이미지를 푸쉬해야 한다.
# docker login # docker push container1
또는 tar 로 묶어서 자유롭게 원하는 도커 호스트 시스템에 배포할 수도 있다.
# docker save -o ~/container1.tar container1 [root@localhost lubos]# ls -l ~/container1.tar -rw-r--r--. 1 root root 131017216 Jun 14 20:31 /root/container1.tar
● 컨테이너 복원
앞서 도커 컨테이너를 백업하는 방법에 대해 알아보았다. 이번 섹션에서는 백업을 어떻게 복원하는지 알아보기로 한다. 개인 도커 레포지토리에 백업본을 push 한 경우에는 간단히 run 명령을 사용하여 container1 이미지로부터 새로운 인스턴스를 시작하면 된다. tar 로 묶어서 백업한 경우 load 명령을 사용하여 도커의 로컬 이미지 레포지토리에 넣어주어야 한다. -i 옵션은 --input 임.
# docker load -i /root/container1.tar
확인을 위해 아래 명령을 입력해보자.
# docker images
이미지 목록에 복원된 container1 이 나오면, run 명령을 이용하여 container1 이미지로부터 새로운 인스턴스를 시작할 수 있다.
기타 참고
#docker build -t jh .
#docker run -dit --name jh -p 8080:8080 -p 3306:3306 jh
#docker exec -it jh bin/bash
#설치 확인
#grep . /etc/*-release
#java -version
#git --version
#mvn --version
#mariadb --version
#루트디렉토리에 톰켓 확인
#ls -al
#RUN apt-get install -y maven
#RUN apt-get remove openjdk* -y
#RUN apt-get autoremove --purge -y
#RUN apt-get autoclean
#RUN apt install oracle-java8-installer -y
#docker run -d --name mysqltest -p (열려있는 포트):3306 -e MYSQL_ROOT_PASSWORD=(원하는 비밀번호) mysql
#docker run -d --name mysqltest -p (열려있는 포트):3306 -e MYSQL_ROOT_PASSWORD=(원하는 비밀번호) mysql
#docker run --name some-app --link some-mariadb:mysql -d application-that-uses-mysql
#docker run -it --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
#docker run -dit --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"3307" -P "3307" -uroot -p "1111"'
#docker run -dit --name jh -p 8080:8080 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1111 mariadb
#docker run --name mariadbtest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1111 default-character-set = utf8 -d mariadb
#[CentOS 7] 톰캣8.0.52에 SSL 적용 ( Let's Encrypt ) - http://victorydntmd.tistory.com/246
Docker-compose 설치
curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
[출처] 64. [Docker] Docker Compose 간단 사용 후기|작성자 alice
다운로드
# root로 로그인해야한다. $ curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
실행 권한 부여
$ chmod +x /usr/local/bin/docker-compose # 설치 확인 $ docker-compose --version docker-compose version 1.14.0, build 1719ceb
설치가 완료되었다.
[Nginx] Ubuntu에서 apt-get을 통해 Nginx 설치하기 및 간단한 정리
package를 통한 nginx 설치
nginx를 설치하는 방법에는 apt-get을 통한 방식과 직접 소스코드를 내려받아서 컴파일하는 2가지 방식이 있습니다. 더 편하고 빠른 방식은 package를 통한 방식이라 apt-get을 이용해서 설치하겠습니다.
$ sudo apt-get install nginx
다음 명령어를 통해서 버전도 확인하고 설치가 되었는지 확인해봅시다.
$ nginx -v nginx version: nginx/1.4.6 (Ubuntu)
코드를 직접 받아서 make를 통한 직접 컴파일을 해서 설치하는 부분은 현재 진행하는 프로젝트가 끝나고 해보도록 하겠습니다.:)
Nginx에 대해서 간략하게
Nginx?
Apache처럼 웹서버 환경을 만들어주는 소프트웨어입니다.
웹서버?
웹서버란 전체 서버 아키텍처의 앞단에서 HTTP 요청에 따라서 그 요청을 넘기고 그에 해당하는 file 혹은 리소스를 넘겨주는 역할을 하는 부분입니다.
시장 점유율
현재 2018년 기준 w3techs에 따르면 38.0%의 사이트들이 사용하고 있다고 함니다.(해당링크)
Apache와의 차이점 및 장점
구조적인면에 있어서 Apache의 경우에는 요청마다 스레드 혹은 프로세스 기반으로 처리하는데, Nginx의 경우에는 이러한 구조 대신에 요청을 비동기 이벤트 구조로 구동됩니다. 그래서 구글에 있는 글들에 의하면 더 적은 리소스를 효율적으로 사용 할 수 있다고 나와 있습니다.
- Apache : 요청마다 스레드 혹은 프로세스 생성 및 처리
- Nginx : 요청마다 비동기 이벤트를 발생시켜 처리
nginx 사용 명령어
// 시작 $ sudo service nginx start $ sudo systemctl start nginx $ sudo /etc/init.d/nginx start // 재시작 $ sudo service nginx restart $ sudo systemctl restart nginx $ sudo /etc/init.d/nginx restart // 중지 $ sudo service nginx stop $ sudo systemctl stop nginx $ sudo /etc/init.d/nginx stop // 상태 $ sudo service nginx status $ sudo systemctl status nginx // 설정 reload $ sudo service nginx reload $ sudo systemctl reload nginx $ sudo nginx -s reload // configuration file syntax check $ sudo nginx -t
nginx 설정
설정 파일들 경로
nginx 설치 방법에는 2가지 방법이 있다고 했다. 각 설치법에 따라서 환경설정 파일의 위치가 다르다.
- package(apt-get을 통한 설치)의 경우 : /etc/nginx에 위치
- 직접 compile한 경우 : /usr/local/nginx/conf, /usr/local/etc/nginx
위에 3개의 폴더중에는 한 곳에 위치하게 되어있지만 다음 명령어를 통해서도 찾을 수 있다고 합니다.
$ sudo find / -name nginx.conf
설정 파일들
모든 설정파일들을 건드려보지 않았기에 설정 할 때 필요한 몇가지 파일 및 폴더들만 보겠습니다.
nginx.conf : nginx와 그 모듈들이 작동하는 방식에 대한 설정 파일입니다. sites-enabled안에 각각 서버에 대한 conf파일들을 만들고 이 안에 첨부하여 웹서버를 운영할 수 있습니다. conf 파일안을 보시면 http, server, location, upstream과 같이 나누어져 있는데 이를 블록이라 하며 server는 가상 서버 혹은 일반 서버를 호스팅 할 때 사용되며 location의 경우 특정 폴더 밑 파일에 대한 경로를 지정해주고 upstream의 경우 Reverse Proxy 설정을 위해서 사용됩니다.
sites-enabled : 위에서 말한 nginx.conf에 첨부해서 실제로 서버를 운영할 설정 파일들이 들어있는 폴더입니다. 실제로 코드를 보면 nginx.conf에서 여기 폴더에 있는 모든 파일들을 불러옵니다.
fastcgi_params, scgi_params, uwsgi_params : uwsgi와 같이 웹 서버와 애플리케이션 서버 사이에서 인터페이스 역할을 해줄 때 필요한 파일들입니다.
파일을 어떻게 사용하는지에 대한 간단한 설명은 다음 포스팅에서 Nginx-uWSGI-Django 연결 편에서 사용해볼 예정입니다.
접속을 통한 확인
이제 설치가 모두 되었다면 자신의 컴퓨터의 IP주소를 브라우저 창에 치면 아래와 같이 “Welcome to nginx”가 나와야합니다.
제 경우에는 Domain이 있어서 도메인 명을 통해서 접속하였습니다.
완료된 현재 구조
현재 구조는 현재 아래처럼 웹 클라이언트가 현재 내 웹 서버에 Nginx를 통해서 접근하고 가장 기본 index.html을 띄워주는 구조로 되어있습니다.
- Web Client <-> Web Server(Nginx)
LetsEncrypt 무료 SSL인증서 적용 및 자동 갱신하기
Certbot 로 발급 받은 것이지만 LetsEncrypt 이다.
2. https://blog.perfectacle.com/2017/10/05/letsencrypt-with-certbot-feat-aws/
Nginx 서비스 정지
현재 서버를 구동중이라면 인증서 생성 시 문제가 발생할 수 있으므로 nginx 서비스를 중단한다.
systemctl stop nginx
위 두사이트를 보고 진행하였다.
aws 도메인을 사용했는데 , 안되었다. 그래서 freenom.com 무료 도메인 구입후 진행하였다.
myssl.ml
1번에서 apt-get install letsencrypt -y 설치하였으나 우분트 버전차이인지 설치가 안되었다
그래서 2번링크에서 다음과 같이 진행하였다.
curl -O https://dl.eff.org/certbot-auto
chmod +x certbot-auto
mv certbot-auto /usr/bin/certbot-auto
그리고 실제 SSL 인증서를 발급받아보도록 하자.
현재 AWS Linux는 아직 정식 지원이 아닌지 –debug를 붙여줘야한다.
certbot-auto certonly --standalone -d 발급받을도메인
certbot-auto certonly --standalone --webroot-path=/home/ubuntu -d myssl.ml
SSL 인증서 생성
위와 같이 했더니, ls -al /etc/letsencrypt/archive/
ls -al /etc/letsencrypt/archive/
myssl.ml 폴더가 설치 되었고. myssl.ml 폴더에는 다음과 같은 파일들이 설치 되었다.
root@ip-172-31-21-231:/etc/nginx/conf.d# ls -al /etc/letsencrypt/archive/myssl.ml/
total 24
drwxr-xr-x 2 root root 4096 Oct 19 15:01 .
drwx------ 3 root root 4096 Oct 19 15:01 ..
-rw-r--r-- 1 root root 2130 Oct 19 15:01 cert1.pem
-rw-r--r-- 1 root root 1647 Oct 19 15:01 chain1.pem
-rw-r--r-- 1 root root 3777 Oct 19 15:01 fullchain1.pem
-rw-r--r-- 1 root root 1704 Oct 19 15:01 privkey1.pem
Strong Diffie-Hellman Group 생성
더 강력한 보안을 위해 아래 명령어를 통해 2048 비트나 4096 비트 암호화를 적용시켜 줄 수 있다.
높은 비트의 암호화를 적용시키다보니 생성하는데 몇 분 이상의 시간이 소요될 수 있고,
결과 파일은 명령어에서 지정한 대로 dhparam 파일에 저장된다.
여기서는 2048 비트를 적용하였다.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Nginx 설정에 적용할 파일 생성
차후 설정을 쉽게 적용, 변경할 수 있도록 /etc/nginx/snippets 디렉토리에 아래와 같은 2개의 파일을 만든다. example.com 부분은 자신의 도메인명을 적어주면 된다.
sudo vi /etc/nginx/snippets/ssl-example.com.conf
sudo vi /etc/nginx/snippets/ssl-params.conf
ssl-example.com.conf 파일 내용
이 파일은 아까 설정한 SSL 인증서 경로를 지정해주는 역할을 한다.
아래 2줄을 입력한 뒤 저장하고 빠져나오자.
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
=> 도메인
ssl_certificate /etc/letsencrypt/live/myssl.ml/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myssl.ml/privkey.pem;
/etc/nginx/snippets/ssl-params.conf
이 파일은 SSL 보안에 관한 설정을 해주기 위한 것으로, 물론 필수는 아니지만 설정해주는 것이 좋다.
아래 설정정보는 여기를 참고하였으며, 위에서 생성해두었던 dhparam 암호화 파일은 최하단 부분에서
불러오고 있다는 점을 확인하고 넘어가자.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
#resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Nginx 설정 파일 수정
이제 sites-available의 nginx 파일을 수정해줄 차례다.
default 파일을 그대로 사용해도 되고 다른 파일을 만들어줘도 되는데, default 파일을 사용한다면 미리 백업을 해두는 것이 좋겠다.
sudo vi /etc/nginx/sites-available/default
만약을 대비해 default 카피로 백업해 두자
일단 파일을 열고 아래 내용을 작성한다.
이것은 example.com 과 www.example.com 에 http, 80번 포트로 들어오는 모든 요청을
https 로 받아들이겠다는 내용이다.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
그리고 동일한 파일 내에 또 다른 서버블록을 만들어 다음 내용을 입력한다.
추가로 필요한 설정이 있다면 이 곳에 같이 입력한다.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
}
=>
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name myssl.ml www.myssl.ml;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
}
위와 같이 입력했을 경우 80번 포트는 사용하지 않고 443 포트로만 사용하겠다는 것인데,
굳이 두 포트를 모두 사용하겠다면 두 개로 나눈 서버 블록을 한 곳에 같이 입력해주면 된다.
그리고 위 설정을 default 파일에 했다면 상관없지만, 다른 파일을 생성했다면 /etc/nginx/enables 디렉토리에 심볼릭 링크를 걸어주어야 한다. example 부분을 자신이 만든 파일이름으로 바꿔주자
sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled
이제 nginx 설정에 이상이 없는지 체크해본다.
nginx -t 명령을 입력하고 아래와 같이 나오면 성공이다.
root@ip-172-31-21-231:/etc/nginx/sites-available# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
서버환경에 따라 서버환경에 맞게
HTTPS 방화벽 설정
sudo ufw allow 'Nginx Full'
만약 https 로 암호화 통신만 하고 HTTP 를 사용하지 않겠다면 아래 설정을 추가한다.
sudo ufw delete allow 'Nginx HTTP'
status 명령으로 제대로 설정되었는지 확인해본다.
sudo ufw status
nginx 구동
service nginx start
ssl 검증 사이트
https://www.ssllabs.com/ssltest/analyze.html
자동 갱신하기
Certbot으로 발급 받았다 하더라도 Let’s Encrypt의 SSL 인증서를 발급받은 것이기 때문에 유효기간은 90일이다.
따라서 수동으로 갱신할 때 명령어는 다음과 같다.
certbot-auto renew
하지만 갱신일이 30일 이상 남은 경우에는 아래와 같은 오류를 보게될 것이다.
Cert not yet due for renewal
따라서 테스트를 위해서는 –dry-run 옵션을 추가해야한다.
certbot-auto renew --dry-run
하지만 이번에는 아래와 같은 오류가 나게 된다.
produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.
All renewal attempts failed. The following certs could not be renewed
갱신하려는 인증서를 이미 nginx 서버에서 사용중이기 때문에 갱신이 불가능하다는 내용이다.
따라서 nginx를 스탑하고 갱신하고 다시 start 해야하는데 귀찮으므로 hook 옵션을 제공해서 아래와 같이 사용하면 된다.
certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start" --dry-run
드디어 아래와 같은 성공 메시지를 보게 될 것이다.
Congratulations, all renewals succeeded. The following certs have been renewed:
하지만 아직 테스트 단계이므로 실제로 갱신이 이루어지지는 않는다.
갱신일이 궁금하다면 아래 커맨드를 입력하면 된다.
echo | openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -dates
30일 남았는지 일일이 체크해서 갱신하기란 매우 귀찮다.
따라서 매달 1일에 갱신하는 커맨드를 실행하게 끔 crontab을 사용하자.
# 잡을 등록
crontab -e
# 그리고 아래 잡을 추가하고 저장하자.
0 0 1 * * certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"
# 등록된 잡 목록 보기
crontab -l
crontab 규칙은 crontab.guru에서 확인할 수 있고, 직접 만들거나 결과를 예측해볼 수도 있다.
Docker 톰캣 nginx ssl 연동
#/etc/nginx/sites-available
default
vi default
127.0.0.1:8888 포트번호는 docker run 에서 -p 8888:8080 으로 개방한 포트 번호이다.
tomcat 은 임의 이름이며 proxy_pass http://tomcat; 일치해 줘야 한다.
변경할 부분은 도메인과 포트 및 임의 이름 tomcat 으로 색깔 이 있는 부분인다.
------------------------------------------------------
upstream tomcat{
ip_hash;
server 127.0.0.1:8888;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name myssl.ml www.myssl.ml;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
location / {
proxy_set_header Host $http_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_set_header X-NginX-Proxy true;
#위에서 설정해준 upstream경로 복사
proxy_pass http://tomcat;
proxy_redirect off;
charset utf-8;
#
#
#
}
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
}
-----------------------------------------------------------------
댓글 ( 16)
댓글 남기기