본문 바로가기

실무로부터/prj 내꺼

[docker] Nginx 설치 및 포트포워딩 : SSL무료인증서 포함

 

1. docker을 설치한다

https://helena90-study.tistory.com/23

 

[리눅스] docker 설치하기

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

helena90-study.tistory.com

 

 

 

2. 무료인증서 설치 ( https 이용을 위함 )

https는 http의 보안프로토콜이다. https를 이용하기 위해 SSL인증서를 유료구매하여 사용한다. 

단 무료인증서의 유효기간은 90일이다.  ( https://nhj12311.tistory.com/250

사용하지 https를 사용하지 않는다면 이 과정은 건너뛰기 해도 된다.

 

2-1) docker-compose-certbot.yml을 작성한다

docker-compose-certbot.yml 파일을 열고

$ sudo vi docker-compose-certbot.yml

yml 파일을 작성한다

version: '3.3'
services:
  certbot:
    image: certbot/certbot
    restart: on-failure:1
    container_name: "home-certbot"
    volumes:
      - ./certbot/etc:/etc/letsencrypt
      - ./certbot/var:/var/lib/letsencrypt
      - ./certbot/log:/var/log
      - ./docroot/certbot:/var/www/certbot
    ports:
      - 80:80
      - 443:443
    command: certonly --standalone --email 사용자이메일주소 --agree-tos --no-eff-email --force-renewal -d ${DOMAIN}

 

2-2) 실행

-참고 : 실행 전 nginx가 실행중이라면 종료해야한다. ( nginx와 동일하게 80포트를 사용해야하기 때문 )

$ docker-compose -f docker-compose-nginx.yml down

 

- 종료되었거나 미설치인 상태라면 아래의 명령어로 docker-compose-certbot.yml 파일을 실행하여 인증서를 다운받는다.

만약 여러개의 도메인에 대한 인증이 필요하다면 domainURL마다 실행해주어 인증서를 발급받아야 한다.

#{domainURL}추가 : www.solena.kr
DOMAIN={domainURL} docker-compose -f docker-compose-certbot.yml up

실행 후 종료될 때 까지 기다리면 인증키가 저장된 위치가 나타난다.

인증키는 주기적으로 갱신해주어야한다는 안내문구가 나타난다.

 

 

 

 

3. nginx설치

- docker-compose로 설치하기 위해 아래 4가지의 파일을 추가한다.

 

3-1) Dockerfile 작성 ( 파일 이름은 반드시 Dockerfile 이어야 함)

sudo vi Dockerfile
FROM nginx:latest

USER root

RUN mkdir -p /var/www/www
RUN mkdir -p /var/www/blog
RUN mkdir -p /var/www/certbot
RUN mkdir -p /etc/letsencrypt

RUN chown nginx:nginx /var/www
RUN chown nginx:nginx /var/www/www
RUN chown nginx:nginx /var/www/blog
RUN chown nginx:nginx /var/www/certbot
RUN chown nginx:nginx /etc/letsencrypt

ADD ./nginx/nginx.conf /etc/nginx/nginx.conf
:wq!

 

3-2) docker-compose.yml을 작성

sudo vi docker-compose-nginx.yml
version: '3.3'
services:
  nginx:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: "home-nginx"
    restart: unless-stopped
    volumes:
      - ./certbot/etc:/etc/letsencrypt
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/log:/var/log/nginx
      - ./docroot/www:/var/www/www
      - ./docroot/blog:/var/www/blog
    ports:
      - 80:80
      - 443:443
:wq!

 

3-3) nginx.conf를 작성

$ mkdir ./nginx

 

$ sudo vi ./nginx/nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    client_max_body_size 0;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
:wq!

 

3-4) default.conf 를 작성

- 디렉토리 생성

$ mkdir ./nginx/conf.d

 파일생성

$ sudo vi ./nginx/conf.d/default.conf

! 도메인주소 변경후 사용해야함

server {
    listen      80;
    listen      [::]:80;
    listen      443 ssl http2;
    listen      [::]:443 ssl http2;
    server_name 사용자의도메인;
    root   /var/www/html;

    access_log /var/log/nginx/사용자의도메인_access.log;
    error_log /var/log/nginx/사용자의도메인_error.log error;

    ssl_certificate /etc/letsencrypt/live/사용자의도메인/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/사용자의도메인/privkey.pem;

    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_set_header Connection "upgrade";
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
    proxy_http_version 1.1;

    location / {
        proxy_pass http://내부아이피주소:포트번호;
    }
}
# www.solena.kr
server {
    listen 80;
    listen [::]:80;
    server_name www.solena.kr;
    charset utf-8;
    root /var/www/www;

    access_log /var/log/nginx/www.solena.kr_access.log;
    error_log /var/log/nginx/www.solena.kr_error.log error;
    
    location / {
        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_set_header Connection "upgrade";
        proxy_http_version 1.1;
        return 301 https://www.$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name www.solena.kr;
    server_tokens off;
    charset utf-8;
    root /var/www/www;

    access_log /var/log/nginx/www.solena.kr_access.log;
    error_log /var/log/nginx/www.solena.kr_error.log error;

    ssl_certificate /etc/letsencrypt/live/www.solena.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.solena.kr/privkey.pem;

    location / {
        return 301 https://www.$host$request_uri;
    }
}

또는

 

upstream 지정서버 {
   keepalive 20;
   server 아이피주소:포트번호 max_fails=1 fail_timeout=10s;
}


# 사용자의도메인 ${"main.domain.com"};
server {
    listen 80;
    listen [::]:80;
    server_name ${"main.domain.com"};
    charset utf-8;
    root /var/www/${main};

    access_log /var/log/nginx/${"main.domain.com"}_access.log;
    error_log /var/log/nginx/${"main.domain.com"}_error.log error;

    location / {
        return 301 https://$host$request_uri;
    }
}

#https 처리
server {
    listen 443 ssl;
    server_name ${"main.domain.com"};
    server_tokens off;
    charset utf-8;
    root /var/www/${main};

 	access_log /var/log/nginx/${"main.domain.com"}_access.log;
    error_log /var/log/nginx/${"main.domain.com"}_error.log error;

    ssl_certificate /etc/letsencrypt/live/${"main.domain.com"}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${"main.domain.com"}/privkey.pem;

    client_max_body_size 0;
    chunked_transfer_encoding on;

    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_set_header Connection "upgrade";
    proxy_http_version 1.1;
    add_header Pragma "no-cache";
    add_header X-Frame-Options sameorigin;

    client_body_buffer_size 1m;
    proxy_redirect off;
    proxy_next_upstream error timeout invalid_header http_502 http_503;
    proxy_connect_timeout 2;
    proxy_intercept_errors on;
    proxy_buffering on;
    proxy_buffer_size 128k;
    proxy_buffers 256 16k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    proxy_max_temp_file_size 0;
    proxy_read_timeout 300;

    location / { #proxy pass를 통해 지정된 server로 보낸다
        proxy_pass http://지정서버;
    }
}
:wq!

 

 

 

 

4. docker 실행

docker을 실행하여 

docker-compose -f docker-compose-nginx.yml up -d

 

docker-compose -f docker-compose-nginx.yml up restart

docker-compose -f docker-compose-nginx.yml up down

 

# docker log 보기

docker logs -f --tail 10 home-nginx

 

#인증서 발생

nginx down

certbot docker-compose 실행

nginx 다시 실행

 

# home certbot

DOMAIN={domainURL} docker-compose -f docker-compose-certbot.yml up

 

#clean

docker rm -f ${docker ps -a -q}

'실무로부터 > prj 내꺼' 카테고리의 다른 글

[리눅스] ifconfig : 네트워크 관리  (0) 2023.05.17