Lightsail 에서 NGINX에 SSL 적용하기 (2)

제대로 접속이 된다면 Lightsail 관리자페이지에서 HTTPS 접속을 위한 환경을 추가한다. ssl.83rpm.com 도메인을 추가한 다음, 443 포트를 연다.

이제 SSL 설정을 시작한다.

내가 수정해야될 사이트의 가상호스트 설정 파일을 연다. 내 경우에는, /opt/bitnami/apps/ssl.83rpm.com/conf/nginx-vhost.conf 파일.

기존의 파일 내용은 다음과 같다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

이 파일 내용을 다음과 같이 변경한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

수정이 완료되었다면 lightsail 재시작 명령어로 모두 재시작한다.

sudo /opt/bitnami/ctlscript.sh restart

재시작하고 난 뒤 웹브라우저를 열고 https://ssl.83rpm.com 으로 접속이 잘 되는지 확인해본다.

구글 크롬과 인터넷 익스플로러의 경우 다음과 같이 표시된다.

내가 임의로 생성한 인증서이므로 안전하지 않기에 경고가 표시되지만 경고를 무시하면 어찌됐든 잘 표시된다.

만약, HTTP로 접속하더래도 무조건 HTTPS로 강제로 접속시키고 싶다면, nginx-vhost.conf 파일을 열고 다음과 같은 설정을 추가한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
        rewrite ^ https://$server_name:443?request_uri? permanent;
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

엔진엑스를 재실행하면 이제부터는 http로 접속하더라도 https 로 자동전환된다.

테스트하려면 http://ssl.83rpm.com 혹은 https://ssl.83rpm.com 으로 접속해보시길. (언제 닫을지는 모릅니다.)

참고자료

Lightsail 에서 NGINX에 SSL 적용하기 (1)

Lightsail을 사용하며 SSL을 적용하는 방법에 대한 포스팅이다. SSL을 써본적도 없고 앞으로도 내가 이런걸 쓸일이 있을지는 모르겠으나 한번 시도해본다. (사실은 푸우시로님의 요청으로)

나는 상용인증서를 구매할 생각이 없으므로 셀프로 생성해서 테스트해보기로 했다.

이제부터 쓸 내용은 AWS Lightsail NGINX 스택에서 설정한 것이며 운영체제는 우분투 리눅스, 웹서버는 nginx 이다. 굳이 lightsail에만 국한된 것은 아니고 어떤 리눅스라도 같은 과정을 거치면 HTTPS 설정이 가능하다. 상용인증서를 사용한다해도 인증서 공급업체의 인증서를 쓸뿐이지 다른 과정은 똑같다.

https://goo.gl/gBSf5b

을 참고하여 인증서를 생성한다.

아래부터의 내용은 위 URL에 있는 개인인증서 생성을 직접 실행해본 것이다.

bitnami@ip-172-26-10-176:~$ openssl version
OpenSSL 1.0.2l  25 May 2017
bitnami@ip-172-26-10-176:~$

명령으로 openssl이 설치되어 있는지 확인한다. 설치가 되어있지 않다면 apt-get install openssl로 openssl 패키지를 설치한다.

개인키를 생성한다.

bitnami@ip-172-26-10-176:~$ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
....................................+++
............................+++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
bitnami@ip-172-26-10-176:~$

인증요청서를 생성한다. 몇가지 입력을 요구하는데 자기 상황에 맞도록 알아서 입력한다. 챌린지패스워드와 옵셔널 컴패니 네임은 입력하지 말라고 해서 그냥 엔터쳐서 넘기면 된다.

bitnami@ip-172-26-10-176:~$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seadaemoon-gu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:83RPM.com
Organizational Unit Name (eg, section) []:83RPM.com
Common Name (e.g. server FQDN or YOUR name) []:83rpm.com
Email Address []:YOUR_EMAIL@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
bitnami@ip-172-26-10-176:~$

개인키에서 패스워드 제거하기

bitnami@ip-172-26-10-176:~$ cp server.key server.key.origin
bitnami@ip-172-26-10-176:~$ openssl rsa -in server.key.origin -out server.key
Enter pass phrase for server.key.origin:
writing RSA key
bitnami@ip-172-26-10-176:~$

인증서 생성

bitnami@ip-172-26-10-176:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=KR/ST=Seoul/L=Seadaemoon-gu/O=83RPM.com/OU=83RPM.com/CN=83rpm.com/emailAddress=YOUR_EMAIL@gmail.com
Getting Private key
unable to write 'random state'
bitnami@ip-172-26-10-176:~$

여기까지 하고 나면, server.crt / server.csr / server.key / server.key.origin 이렇게 4개의 파일이 생긴다.

인증서 파일들을 넣을 폴더를 생성한다. 나는 /opt/bitnami/nginx/ssl 로 지정했다. 이걸로 할 필요는 없으니 자기 마음대로 결정한다. (예를 들면, 사이트마다 설정할 사람은 apps 디렉토리의 자기사이트 디렉토리 밑에 만드는게 더 나을 것이다.)

bitnami@ip-172-26-10-176:~$ sudo mkdir /opt/bitnami/nginx/ssl

생성된 3개의 파일을 인증서 관리용 디렉토리로 복사한다.

bitnami@ip-172-26-10-176:~$ sudo cp server.crt /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.csr /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.key /opt/bitnami/nginx/ssl/

SSL을 적용할 사이트에 설정을 시작한다.

난 SSL 테스트를 위한 것이므로 따로 SSL을 위한 사이트 설정을 하나 만들었다. 주소는 ssl.83rpm.com 으로 하기로 했다. 사이트 설정을 한다. vhost 등등….

일단 http://ssl.83rpm.com 으로 접속해본다. 만약 여기서 제대로 접속이 안된다면 nginx 가상호스트 설정이 제대로 안되었으니 제대로 나올 떄까지 수정해야된다.

 

글의 내용이 너무 길어져 두 포스팅으로 나눠서 써야겠다.

Lightsail 로 서버 이전 후기

계속 사용해오던 cloudv의 가상서버에서 aws의 새로운 서비스인 lightsail로 이전했다.

굳이 웹호스팅을 쓰지 않고 가상서버로 구성해서 사용하는 것은 git 저장소도 한몫했는데 일단 혼자서 사용하다보니 뭐하러 이런걸 해야하나…라는 회의감과 그럴거면 차라리 github에서 사람들과 같이 코드를 만들고 올리고 하는게 더 낫겠다는 생각이 들었기 때문이었다. 그래서 차라리 웹데이터들은 더 저렴한 lightsail로 이전하고 git 데이터들은 github.com 으로 이전하기로 했다.

lightsail은 사용해보니 그냥 흔히 알고있는 가상서버다. 우리나라에서는 이미 많이 서비스하고 있는.

그런데 가격이 생각보다 싸다. 내 경우에는 월 5달러의 제일 저렴한 리눅스 서버로 골랐다. 메모리 512MB에 20GB의 디스크다. 디스크야 어차피 git 데이터가 github로 넘어간 이상 많이 필요치 않았지만, 너무 적은 메모리와 알 수 없는 cpu 성능 때문에 고민을 했다. 고민 끝에 최대한 메모리를 적게 쓰도록 아파치를 쓰지 않고 nginx로 쓰기로 했다.

그리고 어차피 방문객이 많지도 않고 방문객이 많으면 인스턴스를 늘리면 끝이니까.

bitnami의 여러 스택이 있었는데 사용하기 편하게 wordpress 스택을 선택하려 했지만 이 경우에는 멀티사이트를 만들기에 불편할 것 같아서 그냥 nginx 스택을 선택하고 직접 설정해서 아내의 홈페이지와 내 블로그 두개를 설치했다. nginx 설정 파일이 익숙치 않아서 약간 헤매었지만 금방 적응했다. bitnami류의 패키지 시스템이 마음에 들지 않았지만 직접 써보니 생각보다 괜찮았다. 멀티앱/멀티사이트간 여러 설정 파일들이 서로 꼬이지 않게 잘 정리되어 있었다. (물론 그런 이유로 인해 뭔가 하나 고치려면 한참 경로를 타고 들어가야 한다는건 불편하다.)

여튼 그렇게 설치하고 아파치에서 nginx로 변경했는데 와우… 속도가 생각보다 괜찮았다. 내가 아파치로 혼자 가상서버를 쓰는 것보다 훨씬 빨랐다.

접속방법에서 약간의 불편함은 있지만 어차피 접속할 일도 별로 없고… 게다가 1TB의 트래픽은 트래픽 걱정할 필요는 아예 없을만큼 정말 여유로웠다.

며칠간 여러 데이터들을 이전해본 후기

  1. 생각보다 속도가 빠름.
    도쿄 리전이고 가상서버에다가 메모리도 겨우 512MB라서 느릴 것으로 예상했지만 기존 서버보다 훨씬 빠른 느낌. 아파치와 엔진엑스의 차이인지도…
  2. 시간대 재설정 필요함.
    설치하게 되면 서버 시간을 한국에 맞춰야한다. ( https://gist.github.com/dongbum/1673616e33fb331ff8e876ee62216988 으로 저장해둔다.)
  3. 설정파일 트리구조를 잘 파악해둘 것.
    엔진엑스에 익숙치 않거니와 구조가 좀 복잡하긴하다.
  4. DNS 응답 속도가 아주 빨라짐.
    BIND나 PowerDNS로 네임서버를 직접 구성해서 썼었는데 그렇게 쓰는것보다 lightsail에서 제공하는 DNS의 응답속도가 훨씬 속도가 빨랐다. 거의 100배 정도.
  5. lightsail의 DNS는 Route 53과 약간 다름.
    lightsail에서도 300만 쿼리까지는 무료로 DNS를 제공해주는데 사용하기는 너무 편하게 되어있지만 기능적인 면에서는 Route 53 보다는 떨어진다.
  6. 512MB의 메모리로도 충분함.
    가장 저렴한 512MB 메모리의 인스턴스로도 블로그와 몇가지 개인서비스를 운영하는데에는 차고 넘치는 느낌이다.
  7. 사용상 몇가지 불편함이 있음.
    bitnami 패키지의 특성인지 보안을 위해 암호 같은게 어렵게 설정되어 있어서 약간 불편함. 암호를 일일히 바꾸고 쓰기보다는 그냥 쓰기로 결정했다.

 

2018년 5월 17일 추가

얼마전 Lightsail 에도 서울 리전이 생겼다. 한국 사람들은 서울 리전 쓰면 될듯. 난 그냥 귀찮아서 계속 도쿄에 내버려두는 중.

2018년 6월 27일 추가

스냅샷을 생성하여 서울 리전으로 옮기려 했지만 스냅샷으로 인스턴스 생성은 같은 리전으로 밖에 되지 않았다. 리전간 스냅샷 전송기능이 생길 때까지 기다려야 할듯하다.