Nginx 의 버전을 체크하다가 배포에 대한 고민을 해봤습니다.

Nginx 에서 지원하는 Stable 한 버전은 1.4버전과 1.6버전이고

현재 개발은 1.9버전까지 진행중입니다.


yum 과 docker hub 에서 제공하는 버전은 1.1x.x 버전으로 제가 진행중인 예제와 같습니다.

 

Stable 버전을 갈지.. 배포를 쉽게갈 수 있는 1.1 버전으로 갈지 고민하다 결국 1.1버전으로 선택.

이번 예제에서는 Docker 를 이용하여 Nginx 를 세팅해보겠습니다.

 

 

우선 Docker Compose 를 다운받습니다.

 

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

 

다운이 끝났다면 해당 파일에 접근권한을 부여합시다.

 

$ sudo chmod +x /usr/local/bin/docker-compose

 

 

버전확인이 된다면 설치 완료.

 

$ docker-compose --version

 

버전이 확인되는군요.

 

Docker-compose 는 Docker 컨테이너들을 하나로 관리해서

컨테이너들이 따로 작동할 때 생길 수 있는 문제들을 방지해줍니다.

 

 

이제 docker-compose 를 구성할 폴더를 만들고 이미지를 다운받아봅시다.

 

$ mkdir docker-compose-nginx

$ sudo docker search nginx

 

 

$ sudo docker pull nginx

(위 처럼 다운받게 되면 1.17 버전이 다운로드 됩니다.

앞에서 예제로 사용했던 버전이 1.14.1 버전이라 1.14.1 버전으로 수정했습니다.)

 

$ sudo docker pull nginx:1.14.1

 

이제 docker-compose 에서 사용할 yml 파일을 작성해줍시다.

 

$ vi docker-compose.yml

version: '3'
services:
  nginx:
      container_name: nginx
      user: root
      image: "nginx:test"
      ports:
       - "80:80"
       - "443:443"
      network_mode: host

 

 

 

컨테이너 이름은 nginx 이며 nginx:test 라는 이미지를 사용합니다.

해당 이미지의 설정파일들을 변경하기위해 Dockerfile 을 만들어줍시다.

$vi Dockerfile

 

FROM nginx:1.14.1

User root

COPY ./nginx /etc/nginx
COPY ./ssl /etc/ssl
COPY ./html /usr/share/nginx/html
COPY ./nginx.pid /run/nginx.pid

CMD ["nginx", "-g", "daemon off;"]

 

FROM nginx:1.14.1 : nginx:1.14.1 이미지를 사용하며

User root : root 계정으로 실행한다.

COPY : 각 설정파일 위치에 해당파일들을 덮어쓴다.

(host 에 있는 파일들을 미리 옮겨서 사용합니다.)

 

CMD : 해당 container 가 실행될 때 실행되는 명령어 입니다.

 

./nginx : /etc/nginx (설정파일)
./ssl   : /etc/ssl   (ssl key 설정파일들. ssl/private ssl/certs)
실제 certs 폴더는 /etc/pki/tls 에 있었음. etc/ssl/certs 는 symbolic link
./html  : /usr/share/nginx/html Docker Image 와 yum 에서 다운받은 패키지의 html 파일이 달라서 바꿔줬음
./nginx.pid : 실제 pid 를 인식하지 못해서 docker-compose 를 종료해도 nginx 가 살아있는 케이스가 발생했었음.

 

 

이제 설정을 마쳤으면 Docker Image 를 빌드해줍시다.

 

$ sudo docker build -t nginx:test .

    option -t : tag 남기기
    . : 해당 위치에 있는 Dockerfile 기준으로 build

 

docker ip 확인
$ ip addr show docker0

docker0 에게 host ip port 접근권한 부여
$ iptables -A INPUT -i docker0 -j ACCEPT

 

 

build 된 이미지를 docker-compose 로 실행해봅시다.

$ docker-compose up

 

 

127.0.0.1 접속~

 

경고가 있지만 https 페이지로 접속이 되네요.

기본 포트로 접속했지만 443 포트로 redirect 된 페이지를 확인할 수 있습니다.

 

Load Balancing 기능을 확인해봅시다.

예전에 사용했던 플라스크 기본앱 2개를 각각 5000번, 5001번 포트로 실행시켜줍니다.

 

Load Balancing 기능 확인 완료.

 

 

 


설정에서 막혔던 부분을 공유합니다.

 

docker-compose 가 sudo 권한을 요청할 때가 많습니다.

그래서 저는 root 계정으로 예제를 진행했습니다.

root(sudo) 권한으로 사용하시려면 다음과 같은 설정을 해야합니다.

 

root 계정에서 다운받으신분은 넘기셔도 됩니다.

 

# 1

$ sudo vi /root/.bashrc

 

alias docker-compose="/usr/local/bin/docker-compose"

추가 후 root 계정으로

$ source /root/.bashrc

명령 실행

 

# 2

호스트 -> 컨테이너로 copy
$ docker cp [host 파일경로] [container name]:[container 내부경로]

컨테이너 -> 호스트로 copy
$ docker cp [container name]:[container 내부경로] [host 파일경로]

 

# 3

build 에 사용된 ssl 폴더에 certs 폴더가 symbolic link 로 저장되어 있음.
docker container 에서 실행된 nginx 가 해당 폴더 안에 데이터를 접근 못하는 상황

실제 certs 폴더는 /etc/pki/tls 에 있었음.
 - 확인방법
  - certs 파일이 존재하는 곳에서 ls -al 로 파일 권한을 확인하면 실제 경로가 나옴.
[root@solar ssl]# ls -al
total 12
drwxr-xr-x.   3 root root   34 Apr 14 13:54 .
drwxr-xr-x. 138 root root 8192 Apr 14 09:20 ..
lrwxrwxrwx.   1 root root   16 Dec 12 04:19 certs -> ../pki/tls/certs
drwx------.   2 root root   34 Apr 10 16:37 private

 

symbolic link 로 잡힌곳은

lrwxrwxrwx. 라는 권한으로 표기됨.

 

# 4

Cert Warning 제거하기


nginx    | 2020/04/14 06:50:01 [warn] 1#1: "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx    | nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"

 

nginx conf 파일에서 ssl_stapling 옵션을 off 로 바꿔주면 표기되지 않음.

제 예제를 따라오신분은

/etc/nginx/conf.d/ssl.conf 파일에서 수정하시면 됩니다.

 

 

# 5


80 포트와 443 포트를 사용중이라는 메세지가 나올 때
 - netstat -tnlp
  - 80 포드와 443 포트를 사용중인 pid 확인

 - kill -9 [pid]

 

docker-compose 에서 CMD 로 실행된 Nginx 가 정상적으로 종료되지 않을 때 발생했다.

해당 예제에서 언급된 nginx.pid 를 옮겨주면 해당 현상이 발생하지 않는다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기