본문 바로가기

개발관련

Docker + ROR + Nginx 에 SSL 적용하기

기본적으로 이미 서비스를 도커를 이용해서 구성 했을 경우를 전제로 한다.




서버 구성

서버에는 nginx, 레일즈가 각각 도커로 구성되어 있다.


먼저 ssl을 구매후 pem 파일을 만들어둔다.


참고 : 

https://webisfree.com/2017-12-16/nginx에-ssl-사용하는-방법-comodo-ssl-인증서-설치하기

https://www.securesign.kr/guides/NGINX-SSL-Certificate-Install





파일 셋팅

위의 과정을 실행하면 SSL 구매 후 받은 파일을 합친 파일 1개와 private key 파일 하나가 있을것이다.

본인은 해당 파일을 레일스 프로젝트 폴더 config 안에 넣은 후 도커로 nginx를 셋팅시에 서버에 복사하는 방법을 썼다.


이유:

1. 인증서를 갈때마다 귀찮은 짓을 안해도 된다.

2. 한번 설정해 놓으면 따로 추가 수정을 안해도 된다


걱정되는점 :

파일들을 깃에 올려놔야 하는건데....보안에 문제가 있을지도 모르겠다.

있으면 나중에 수정할 예정




이렇게 해 놨으면 프로젝트의 config 폴더에 ssl 인증파일 2개가 추가되었을 것이다.


그럼 nginx 설정 파일을 수정한다.


upstream app_server {
server application:3000;
}


server {
listen 8080;
server_name localhost app_server;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name localhost app_server;

ssl_certificate /인증서가 있는 주소/unified.myssl.pem;
ssl_certificate_key /인증서가 있는 주소/yourdomanin.co.kr.key.pem;
ssl_prefer_server_ciphers on;

location @app_server {

proxy_set_header X-Forwarded-Proto https;

기타설정 블라블라

}

기타설정 블라블라블라~
}


간단하게 설명하면 8080포트 설정은 8080포트로 접속시 443포트로 토스해 주는 설정이다.

nginx 설정은 간단하다. 






나머지 작업

이렇게 수정을 했으면 프로젝트의 config/environments/production.rb를 수정해야 한다. 요걸 안해주면 디바이스 젬을 사용할때 리다이렉트 오류가 발생한다.


config.force_ssl = true


이때 위에 nginx 설정파일에 proxy_set_header X-Forwarded-Proto https; 설정을 했는지를 꼭 확인한다!

이것을 안하면 무한 리다이렉트가 발생한다.






자 이렇게 설정했으면 이제 nginx를 띄울때 포트 지정만 추가해 주면 된다.


docker run -d -p 8080:8080 -p 443:443 --name nginx nginx_img:$REVISION



뭐 대충 이렇게 하면 된다. 이렇게 설정하면 8080포트로 접속하면 443(https)로 연결 시켜준다.







추가 작업

이렇게 적용을 했는데도 브라우저에서 안전한 사이트로 안뜨는 문제가 발생했다. 이유를 찾던중, 외부에서 가져오는 이미지 주소에 문제가 있음을 알게 되었다.


간단하게 설명하면, 페이지를 구성하는 html 코드중에, 특히 url 이 http 가 있으면 해당 페이지 자체를 "안전하지 않은" 페이지로 인식하는 것이었다.

예를들어 내가 메인에 뿌려주는 이미지 중에서 외부에서 퍼오는 이미지의 주소가 http로 시작하면 해당 페이지에서 보안 경고가 뜬다. 아나..


하지만 이역시 해법은 매우 간단한다.



<img src="//some.domain.com/image/something.jpg" />



이미지 링크를 이와같이 구성해 주면 된다. 이해가 안갈거 같아서 추가 설명 들어간다.

만일 이미지 주소가


http://some.domain.com/image/something.jpg 라면 앞에 http:를 제거해도 이미지가 잘 나온다.


본인은 이미지를 불러오는 헬퍼를 하나 생성 후, 이미지 주소를 반환시에 http를 제거하는 방식을 사용했다.








끄읕