Nginx 에서 www 도메인을 루트 도메인으로 연결하기

2020. 07. 12 IT/컴퓨터 > 네트워크

image from thewantricks.com

 

이전 글에서 DigitalOcean 에 올린 프로젝트에 나의 도메인을 연결해 보았다.

DigitalOcean 에 나의 도메인 연결하기

 

원래 인터넷 초창기에는 world wide web, 즉 www. 가 붙은 도메인이 공식 주소인 경우가 많았는데, 요즘은 사이트 공식 주소에 www. 가 붙어 있으면 좀 촌스럽고 시대에 뒤떨어졌다고 생각하는 분위기인 듯하다. 대개 사람들이 사이트 이름을 기억할때 www. 를 붙여서 기억하지 않기 때문에 인터넷 주소 창에 windybay.net 과 같이 루트 도메인 (naked domain, root domain 또는 bare domain 등으로 부른다) 을 쳐서 접속하지 www.windybay.net 으로 들어오는 경우가 잘 없는 듯.

 

하지만 www.windybay.net 으로 접속하는 경우도 있을 수 있는데, 이때 리디렉션 설정을 따로 해 놓지 않았다면 페이지가 뜨지 않기 때문에 , 사용자들이 사이트가 다운된 것으로 잘못 생각할 수 있을 것이다. 이런 일은 사이트 홍보에 도움이 되지 않기 때문에 www. 로 들어오는 트래픽을 루트로 안내해 주는 설정을 해 주면 좋겠다.

 

다른 호스팅 업체들의 경우 잘 모르겠는데 godaddy에서는 기본적으로 루트 도메인이 기본으로 되어 있고 digitalOcean에서도 바로 루트로 연결이 가능하기 때문에 루트 도메인 사용에 문제는 없다 (다른 업체의 경우 www. 도메인이 기본이고 루트로 연결하는 것이 까다로워서 애를 먹기도 했었다). www 로 들어오는 연결을 루트로 연결해 주는 방법도 여러가지가 있는데, 일관성이나 사이트 홍보 (SEO, search engine optimization) 측면에서 권장되는 방법은 

 

서비스하고 싶은 도메인을 결정한 다음 (www. 에 컨텐츠를 둘 것인지 아니면 루트 도메인에 둘 것인지) 다른 쪽으로 들어오는 연결을 전부 내용이 들어 있는 도메인으로 돌려 주는 것

 

이 좋다고 한다. 즉 여기서는 루트 도메인에 모든 컨텐츠가 올라가 있고, www. 에는 아무 내용은 없고 www. 로 들어오면 자동으로 루트로 가도록 서버에서 설정해 주는 것이다 (반대로 www. 에 올려놓고 루트로 들어온 연결을 www. 로 돌려줄수도 있겠지만). 이를 영구 리디렉션 (permanent redirection) 또는 301 리디렉션 (301 redirection) 이라고 한다. 301은 요청된 리소스가 영구적으로 다른 곳으로 이동되었다는 HTTP 응답 상태 코드이다.

 

전반적인 내용은 다음 글을 참고했다.

https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-ubuntu-14-04

 

우선 DigitalOcean 계정의 Networking 패널에 들어가서 등록한 도메인을 누르면 DNS 레코드를 작성할 수 있는데, 이전 글에서 A 레코드에 @ 를 입력해서 루트 도메인이 Droplet 의 IP 로 연결되도록 해 주었다. 

이번에는 A 레코드에 www 를 입력해서 www.windybay.net 으로 들어오는 연결을 역시 droplet 의 IP 주소로 연결되도록 해 주자 (즉 A 레코드가 2개 생기는데, HOSTNAME을 하나는 @, 하나는 www 로 입력해주고 WILL DIRECT TO에는 똑같이 Droplet의 IP를 입력해주면 된다.)

아마 DigitalOcean 이 아닌 다른 호스팅 업체도 DNS 편집은 대동소이할 것으로 생각된다.

 

 

그리고 나서 이전에 작성했던 Nginx 서버 블록을 열어서 내용을 추가해 주어야 한다.

shell에 접속해 다음 명령어로 서버 블록을 추가해 주자.

(참고: 최초 서버 블록 설정은 DigitalOcean에 Django 프로젝트 배포하기 (3)

도메인 연결시 서버 블록 설정은 DigitalOcean 에 나의 도메인 연결하기)

$ sudo nano /etc/nginx/sites-available/windybay

 

기존의 설정이 

server {
    listen 80;
    server_name windybay.net;

...나머지 코드...

}

 

와 같이 되어 있을 것인데, 여기에 따로 www.windybay.net 으로 들어오는 연결에 대한 설정을 추가해 주는것이다.

기존의 내용은 건드리지 말고, 추가로 다음 블럭을 입력해준다.

server {
    server_name www.windybay.net;
    return 301 $scheme://windybay.net$request_uri;
}

(이하는 동일)

server {
    listen 80;
    server_name windybay.net;

...나머지 코드...

}

 

이렇게 하면 www.windybay.net 으로 들어오는 연결과 그 하위 url 들이 모두 windybay.net으로 돌려지게 된다. 참고로 위의 서버 블록에서 request_url 아니고 request_uri 이다. 처음에 request_url 로 했다가 안돼서 한참 삽질했으므로 정확히 입력하자.

 

이후 

$ sudo systemctl nginx restart

로 서버를 재시작시켜 주면 설정이 적용된다.

 

설정이 제대로 적용되었는지 확인해보려면

$ curl -I https://www.windybay.net

 

과 같이 www. 가 붙은 주소를 입력했을때 301 Moved Permanently 라는 응답이 오면 잘 된 것이다.

(참고로 위의 주소를 입력할때 아직 https 설정을 하지 않은 경우에는 http로)

 

이렇게 정상적으로 301 응답이 오는 경우 브라우저에서도 www.windybay.net 을 입력하면 정상적으로 컨텐츠가 보이며 주소는 www 가 없는 주소로 연결된 것을 확인할 수 있다.

 

만약 컨텐츠가 www.도메인 에 올라가 있고 루트 도메인으로 들어오는 연결을 www. 로 돌리고 싶은 경우에는 위 서버 블록의 내용에서 www와 루트 도메인의 자리만 서로 바꿔 주면 된다.



최근 글 목록