42 Seoul

[Inception] NGINX TLS

jaewpark 2022. 10. 30. 19:51

Docker에 대해서는 대충 알았다 생각했는데, 뭐부터 시작해야 될 지를 몰라서

NGINX를 Debian 환경에서 설치를 하는 과정을 해보려고 합니다.

 

Docker Commands


Image Pull

 

Image Check

 

Make Container & apt update

: 80(http), 443(https) 포트 연결

 

NGINX install

-y : 설치할 때, 모든 응답을 yes로 답을 하는 옵션입니다.

 

NGINX start 

 

 


TLS install (참고)

표준화 기구인 IETF의 관리로 변경되면서 TLS라는 이름으로 바뀌었지만, SSL이라는 이름으로 많이 사용됩니다.

openssl (참고)

: req 명령을 통해서 인증서 요청 및 생성

  • -x509 : 인증서 요청 대신 자체 서명된 인증서를 출력
  • -nodes : 개인 키가 생성되더라도 암호화되지 않음
  • -newkey arg : 새 인증서 요청과 새 개인 키를 만듭니다. 본문에서는 인자로 rsa:nbits를 사용하려고 하며, rsa는 비트수에 맞게 키를 생성합니다.
  • -keyout filename : 새로 생성된 개인 키를 쓸 filename을 제공
  • -out filename : 기본적으로 쓸 출력 파일 이름 또는 표준 출력을 지정
  • -subj arg : 입력 요청의 제목 필드를 지정된 데이터로 교체하고 수정된 요청을 출력합니다. arg는 /type0=value0/type1=value1/... 형식이어야 합니다

chmod 600 localhost.crt localhost.key
mv localhost.crt etc/ssl/certs/
mv localhost.key etc/ssl/private/

 

nginx에서 ssl 적용을 위해 etc/nginx/sites-available/default 파일을 수정

apt install -y vim
vim으로 수정하기 위해서는 vim 설치
// etc/nginx/sites-available/default
server {
    listen 80;
    listen [::]:80;
    
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    
    ssl on;
    ssl_certificate /etc/ssl/certs/localhost.crt;
    ssl_certificate_key /etc/ssl/private/localhost.key;
    
    root /var/www/html;
    
    ...
}

 

service nginx reload

Dockerfile

FROM debian:buster

RUN apt update && apt install -y nginx openssl
    
RUN openssl req -newkey rsa:2048 -days 365 -x509 -nodes \
    -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Gam/CN=localhost" \
    -out /etc/ssl/certs/nginx.crt \
    -keyout /etc/ssl/private/nginx.key

COPY ./conf/default /etc/nginx/conf.d/default.conf

EXPOSE 443

CMD ["nginx", "-g", "daemon off;"]
docker build -t inception-nginx .
./conf/default 파일이 있어야 에러가 뜨지 않는다. 

 

▼ default.conf

더보기
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name jaewpark.42.fr;

    ssl_protocols TLSv1.2 TLSv1.3;

    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;

    root /var/www/wordpress;

    index index.php

    # root폴더 내에 uri에 따른 폴더가 있는지 찾아보고 없다면 404 에러 리턴
    location / {
		try_files $uri $uri/ =404;
	}

    # fastcgi_pass : php-fpm(wordpress) 의 ip 와 port 로 패스를 설정, 다른 컨테이너를 사용하기 때문에 tcp/ip통신을 이용해야함(ip와 port번호 필요)
    # include fastcgi_params : Nginx 빌드에서 미리 설정된 파라미터들을 사용
    # fastcgi_param : FastCGI 프로토콜을 사용할 때 사용할 파라미터를 설정, 사용자의 요청을 실행할 스크립트 경로 설정
	location ~ \.php$ {
		fastcgi_pass wordpress:9000;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
}