안경잡이개발자

728x90
반응형

  Ubuntu 16.04에 Nginx를 설치하는 방법은 매우 간단합니다. 바로 다음과 같은 명령어를 이용하면 됩니다.

 

sudo apt-get install nginx

 

 

  nginx는 처음 설치했을 때 기본적인 환경 설정 파일의 경로가 /etc/nginx/sites-available/default입니다. 따라서 웹 서버의 루트 디렉토리 변경 등의 작업이 필요하다면, 이 경로에 들어가시면 됩니다. 저는 root 폴더의 디렉토리(Directory)를 변경해보겠습니다. 저는 /home/web으로 변경했습니다.

 

  설정하실 때 세미콜론(;)을 넣는 것을 잊지 말아주세요!

 

 

  이제 /home/web 디렉토리에 index.html라는 파일을 만들어서 Hello World라고 작성해보았습니다. 그리고 nginx를 재시작해주시면 됩니다.

 

  sudo service nginx restart

 

 

  접속 결과 매우 정상적으로 잘 동작합니다.

 

※ SSL 설치 ※

 

  Nginx의 설정 파일은 /etc/nginx에 위치합니다. 여기에서 nginx.conf 파일을 열어 보시면 다음과 같이 conf.d 폴더 안에 있는 .conf 확장자를 모두 설정 파일로 설정하는 것을 확인할 수 있습니다. 따라서 conf.d 폴더 안에 server.conf와 같은 파일을 만들어서 설정하는 방식도 가능합니다.

 

 

  하지만 우리는 아까 수정했던 /etc/nginx/sites-available/default 파일 하나만 작업하여, 모든 설정을 마치도록 할 것입니다. 일단 http로 접속한 경우 항상 https로 리다이렉트 될 수 있도록 할 것입니다. 또한 SSL 인증서의 공개키 및 개인키의 경로를 설정하여 (사전에 SSL 인증서를 발급 받아야 합니다.) 정상적으로 https로 접속했을 때 SSL이 적용된 페이지가 등장할 수 있도록 할 것입니다.

 

  따라서 /etc/nginx/site-available/default의 server 항목을 다시 수정합니다. 총 2개의 server 항목이 존재할 수 있도록 만듭니다. 아래 코드와 같이 기본적으로 443 포트를 사용하도록 하고, 추가적으로 80번 포트로의 접속은 https로 리다이렉트 시키도록 작업하면 됩니다.

 

server {
        listen                  443;
        server_name             {도메인 주소 1} {도메인 주소 2};
        ssl                     on;
        ssl_certificate         {공개키 경로};
        ssl_certificate_key     {개인키 경로};
        ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;

        root {웹 루트 경로};

        index index.html index.htm index.nginx-debian.html;


        location / {
                try_files $uri $uri/ =404;
        }

}

server {
    listen 80;
    server_name {도메인 주소 1} {도메인 주소 2};
    return 301 https://{도메인 주소};
}

 

  저는 다음과 같이 /etc/nginx/sites-available/default 파일을 수정했습니다.

 

 

  다시 Nginx 서버를 재구동 시켜 보니, 다음과 같이 정상적으로 동작하는 것을 확인할 수 있었습니다.

 

 

※ 인증서 갱신 관련 문제 ※

 

  다만 Let's Encrypt 등의 서비스를 이용할 때 인증서를 갱신해야 한다면, 80번 포트를 무조건 HTTPS로 리다이렉트 하는 경우 인증서 갱신이 안 될 수도 있습니다. 인증서 갱신은 기본적으로 80번 포트로 Challenge를 수행하여 진행하기 때문입니다. 따라서 인증서 갱신을 해야 할 때는 다음과 같이 80번 포트 부분을 아래 코드처럼 일반적으로 사용이 가능하도록 할 수 있습니다. (사실은 인증을 위해 사용되는 .well-known 폴더만 80번 포트를 그대로 이용하도록 하고, 나머지 폴더에 대하여 443번 포트로 Redirection 하도록 처리하는 것이 가장 깔끔합니다.)

 

server {
        listen                  80;
        server_name             {도메인 주소 1} {도메인 주소 2};
        root {웹 루트 경로};

        index index.html index.htm index.nginx-debian.html;


        location / {
                try_files $uri $uri/ =404;
        }

}

 

728x90
반응형

728x90
반응형

  Let's Encrypt를 이용하면 무료 SSL 인증서를 매우 손쉽게 설치할 수 있습니다. 가장 기본적으로 다음의 명령어를 이용해 Let's Encrypt를 설치합니다.

 

apt-get install letsencrypt

 

  또한 도메인이 필요하다면 무료 도메인 서비스 Freenom을 이용할 수 있습니다.

 

  ▶ Freenom 공식 사이트: https://www.freenom.com

 

Freenom - A Name for Everyone

Cost Price Free Special

www.freenom.com

 

  저는 dongbin.tk라는 도메인을 무료로 구매(12개월)했으며, 제 사설 IP 주소와 연동했습니다. (기본 도메인, www 도메인 두 개) 이처럼 도메인을 등록하여 자신의 사설 IP 주소와 연결한 뒤에는 이제 Let's Encrypt를 통해서 인증서를 발급받을 수 있습니다.

 

letencrypt certonly --manual

 

  위 명령어를 입력하면, 가장 먼저 도메인(Domain) 주소에 대해서 물어봅니다. 도메인 주소를 원하는 대로 입력하시면 됩니다. 예를 들어 dongbin.tk라고 입력을 할 수 있습니다.

 

 

  이후에는 해당 도메인의 소유권을 확인합니다. 현재 예시에서는 정말 dongbin.tk의 소유자인지 확인하기 위하여 dongbin.tk에 특정한 URL에 하나의 파일을 만들어 보라고 지시합니다. 해당 파일의 내용 또한 Let's Encrypt가 제시해 준 대로 작성해야 합니다. 그냥 하라는 대로 하면 되므로 간단합니다.

 

  이 때는 Nginx나 Apache 등의 웹 서버를 이용하여 해당 경로에 파일을 만들어 제공하면 됩니다. 간단하게는 그냥 Python의 SimpleHTTPServer와 같은 라이브러리를 이용해도 되기 때문에 매우 간단합니다.

 

  이 때 만약 Connection Refused와 같은 문제가 발생한다면, 해당 도메인에 일단 접속이 잘 되는지 확인해야 합니다. 예를 들어 본인의 스마트 폰으로 자신의 웹 사이트가 잘 들어가지는지 확인해야 한답니다. (저는 학교 서버를 개방하려고 하는데, 80번 포트의 개방을 학교 방화벽 단에서 막고 있어서 이러한 문제가 발생했었네요.)

 

  혹은 다음의 명령어를 이용해서 www와 기본 도메인을 모두 포괄하는 인증서를 만들 수도 있습니다.

 

letsencrypt certonly --webroot -w={웹 루트 폴더} --expand -d {도메인 1,도메인 2,...}

 

 

※ 발급 받은 인증서 이용하기 ※

 

  인증서를 발급 받은 이후에는 이를 자신의 서비스에 적용할 수 있습니다. 일반적으로 인증서 파일은 다음과 같은 경로에 저장됩니다. 키 파일은 안전한 공간에 저장하고, 유출되지 않도록 합니다.

 

  공개키: /etc/letsencrypt/live/{도메인 주소}/fullchain.pem

  개인키: /etc/letsencrypt/live/{도메인 주소}/privkey.pem

 

 

  또한 서비스에 따라서 인증서를 등록하는 방법이 다릅니다. 예를 들어 주피터(Jupyter) 서버의 경우에는 다음과 같이 환경 설정 파일을 열어서 인증서가 위치한 경로를 적어주면 끝입니다. (이후에 Jupyter Server를 다시 실행하면 됩니다.)

 

sudo vi {주피터 환경설정 파일 경로}
# 다음의 내용 입력하기
c.NotebookApp.certfile = u'{공개키 경로}'
c.NotebookApp.keyfile = u'{개인키 경로}'

 

  또한 Let's Encrypt는 갱신 기간이 정해져 있기 때문에 자동 갱신을 위해서 별도의 작업이 필요합니다. 일반적으로는 letsencrypt renew 명령을 사용하여 인증서를 간단하게 자동적으로 갱신할 수 있습니다.

 

letsencrypt renew

 

  다만 이 때 유의할 점이 있습니다. 기본적으로 인증서 갱신은 80번 포트로 이루어지기 때문에 웹 서버단에서 80번 포트로의 접속을 443 포트(HTTPS)로 리다이렉트 설정을 해놓거나 하면 정상적으로 처리가 안 될 수 있습니다. 따라서 renew를 위해 필요한 .well-known 폴더는 80번 포트로 접속이 가능하도록 설정할 필요가 있습니다.

 

  더불어 테스트를 해보고 싶다면 --dry-run 옵션을 붙여서 테스트할 수 있습니다.

 

letsencrypt renew --dry-run

 

  

  따라서 crontab을 활용하여 이러한 명령을 특정한 시간대에 주기적으로 실행할 수 있도록 하면 될 것입니다. crontab -e를 입력하면 크론탭 입력 창이 등장하고, 수정을 완료하면 자동으로 인스톨이 진행됩니다. 매월 1일 1시에 인증서 갱신을 요청하는 명령어는 다음과 같습니다.

 

0 1 1 * * letsencrypt renew --renew-hook "service nginx restart"

 

 

  저장하고 밖으로 나오면 자동으로 적용됩니다.

728x90
반응형