nginx의 설정을 변경하여 현재 도메인에 http:// 형태의 요청이 들어온다면 https:// 으로 요청을 리다이렉션 할 수 있다. 또한 www가 붙은 도메인으로 요청을 했을 때 www을 제거한 도메인으로 리다이렉션도 가능하다.

 

두 가지 모두 nginx의 설정 파일을 수정해서 적용할 수 있다. 우선 /etc/nginx/sites-available 디렉토리에 있는 default 파일을 열어야한다.

 

 

vi /etc/nginx/sites-available/default

 

 

초기에 있는 default을 유지하고 싶다면 default.old 라고 이름을 수정한 후 새로운 default 파일을 생성해서 작성해도 된다. 기존 파일을 default.old로 변경하고 touch 명령으로 default파일을 생성하는 방식으로 진행하면 다음과 같다.

 

cd /etc/nginx/sites-available/

mv default default.old

touch default

 

위의 코드를 입력하면 기존의 default는 .old 파일로 변경되고 비어있는 default 파일이 생성된다.

 

 

이제 default 파일에 원하는 설정을 입력해야한다. 각자 도메인이 다르기 때문에 아래 파일을 참조해서 작성하면 된다.

 

server {

    server_name 도메인 www.도메인;

    if ($host = www.도메인) {
        return 301 https://도메인$request_uri;
    }
    location / {
        proxy_pass http://127.0.0.1:원하는포트번호;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = www.도메인) {
        return 301 https://도메인$request_uri;
    } # managed by Certbot


    if ($host = 도메인) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;

    server_name 도메인 www.도메인;
    return 404; # managed by Certbot

}

 

이해를 돕기 위해 도메인명은 '도메인' 이라고 한글로 작성했다. 만약 서버의 도메인이 naver.com라면 위의 '도메인' 이라고 써있는 곳을 모두 naver.com으로 변경하면 된다.

 

우선 위의 파일은 두 개의 server 블록으로 나누어져 있다. 첫 번째 블록은 nodejs 서버의 앞단에서 nginx 프록시 서버가 nodejs가 있는 포트로 연결하는 설정이다. 아래는 첫 번째 블록만 뗴어놓은 코드이다.

 

server {

    server_name 도메인 www.도메인;

    if ($host = www.도메인) {
        return 301 https://도메인$request_uri;
    }
    location / {
        proxy_pass http://127.0.0.1:원하는포트번호;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

 

우선 처음에 server_name 이라고 되어있는 곳은 처리할 도메인을 의미한다. 현재 도메인, www.도메인 이라고 작성되어있다. 이는 도메인과 www.도메인 으로 들어오는 요청을 이 서버블록에서 처리하겠다는 의미이다. 그 아래를 보면 첫 번째 if문의 조건에 $host = www.도메인 이라고 되어있고 그 내용은 아래와 같이 작성되어있다.

 

return 301 https://도메인$request_uri;

 

www가 붙은 도메인인 경우 www가 제거된 도메인으로 301 리다이렉션을 하겠다는 의미이다. 그 다음으로 loation 블록이 나오는데 이는 프록시 서버를 앞단에 두고 뒤에 nodejs서버로 연결시키는 설정이다. 위의 내용에서 '원하는포트번호'라고 작성한 항목을 현재 nodejs 서버를 열어놓은 포트번호를 변경하면 된다.

 

그 다음은 listen 443 ssl; 이라고 되어있다. 443 포트는 https 포트번호이고 그 밑에 작성된 항목은 Certbot를 이용해서 만든 ssl 인증서의 위치를 지정한 부분이다. Let's Encrypt로 nginx에서 https인증서를 생성하면 자동으로 작성되는 항목이므로 따로 작성할 필요는 없다.

 

 

 

이제 두 번째 server 블록을 보자. 여기서는 http를 https로 리다이렉션하는 작업을 설정한다.

 

server {
    if ($host = www.도메인) {
        return 301 https://도메인$request_uri;
    } # managed by Certbot


    if ($host = 도메인) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;

    server_name 도메인 www.도메인;
    return 404; # managed by Certbot

}

 

첫 번째 블록보다 훨씬 단순하다. 우선 $host변수는 현재 host명을 의미한다. 예를 들어 naver.com 으로 접속했다면 host는 naver.com이 된다. 

 

첫 번째 if문을 보면 http://www.도메인으로 요청이 오면 https://도메인$request_uri 형태로 301 리다이렉션을 한다. 두 번째는 www가 없이 들어온 http 요청에 대해서 https로 리다이렉션을 하는 코드이다.

 

첫 번째 서버 블록과 마찬가지로 listen으로 어떤 포트에서 해당 명령을 수행할지 지정한다. http기본 포트는 80이므로 listen 80이라고 작성하고 , server_name에 적용시킬 도메인들을 입력한다. 

 

마지막으로 return 404는 위의 서버 블록에서 캐치하지 않는 명령일 때 404를 리턴하겠다는 의미이다.

+ Recent posts