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