스프링

 

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

cs

 

 

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


yum 명령 CE 버전을 사용하여 CentOS 7에 Docker 설치

도커 서비스를 사용하는 방법

$ 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

cs

 

/usr/bin/docker.io 실행 파일을 직접 사용하기 보다는 링크를 만들어 사용하는 것이 좋다.

 

 

3. CentOS(RedHat, Fedora)

RedHat계열의 리눅스 OS에서 도커를 직접 설치하려면 아래 스크립트를 실행한다.

 

#Install

sudo yum install docker

 

#Docker 서비스 실행

sudo service docker start

 

#부팅시 자동 실행 설정

sudo chkconfig docker on

cs

 

 

도커 설치가 진행되고, 설치가 완료되면 아래처럼 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

설치가 완료되었다.

 

 

https://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220633836094&parentCategoryNo=7&categoryNo=&viewDate=&isShowPopularPosts=true&from=search

 

 

 

 

[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이 있어서 도메인 명을 통해서 접속하였습니다.

Welcome

 

완료된 현재 구조

현재 구조는 현재 아래처럼 웹 클라이언트가 현재 내 웹 서버에 Nginx를 통해서 접근하고 가장 기본 index.html을 띄워주는 구조로 되어있습니다.

  • Web Client <-> Web Server(Nginx)

 

 

 

 

LetsEncrypt 무료 SSL인증서 적용 및 자동 갱신하기

 

Certbot 로 발급 받은 것이지만 LetsEncrypt 이다.

 

 

1.  https://blog.naver.com/PostView.nhn?blogId=itperson&logNo=220853849351&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true

 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;
}

 

-----------------------------------------------------------------

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

동시대인들의 약점과 우행(愚行)을 보고서도 오염되지 않을 만큼 충분한 독립정신을 갖고 있는 사람들은 몇 사람 되지 않습니다. 그러나 이 몇 명 되지 않는 독립된 사람들도 인간의 냉혹함에 부딪치게 되면, 세상일을 올바르게 하겠다는 열성을 금방 잃어버리는 것이 보통입니다. 오로지 극소수의 사람들만이, 미묘한 유머와 우아한 재치로서 동시대인들을 매혹시키며, 예술

댓글 ( 16)

댓글 남기기

작성