nginx 웹서버 라우팅 설정하기 – 도메인 IP 연결, www 리다이렉팅

11

전 단계에 이어서 이번 글에서는 nginx(엔진엑스)를 사용하는 서버에 도메인을 구매해 연결하고 nginx 설정파일을 세팅해봅시다. 그런김에 www 서브도메인 리다이렉팅도 할겁니다. 이번 글을 잘 이해한다면 하나의 서버에 여러개의 도메인과 서브도메인을 연결해서 폴더별로 나눠려고 하는 일도 할 수 있을 겁니다.

 

이 글은  LEMP 스택에 WordPress 설치하기 시리즈 연재작의 일환으로 작성되었지만 nginx 설정은 공통사항이므로 서버구성은 딱히 상관없습니다.  아래내용 중 nginx 라우팅설정은 워드프레스를 쓰지 않는 서버인 경우에도 적용됩니다.

nginx가 아닌 아파치 서버를 사용하는 경우의 리다이렉팅 설정은 아래링크의 bitnami 워드프레스 시작 시리즈 연재글을 참고하시기 바랍니다.

 

 

이번 글에서는 아래와 같은 내용들을 살펴봅니다.

 

 

도메인 구매 및 nginx 서버에 연결

먼저 도메인을 구매해야하는데 도메인 구매하기에 대한내용은 아래 링크를 참고하세요.

DNS에서 도메인에 IP 연결하기는 아래 링크를 참고하여 자신의 도메인을 서버에 연결하세요.

고정IP를 연결하고 싶다면 위 링크에나온 것처럼 Static IP를 생성해서 연결하고 고정IP가 필요없다면 Public IP를 자신의 DNS에서 설정하면 됩니다. 모든 컴퓨터에서 새로운 DNS 설정이 제대로 동작하기위해서는 TTL로 설정한 시간만큼이 소요됩니다.

 

URL, URI 라우팅? 

도메인이 마련되고 DNS에서 자신의 서버IP로 연결시켰다면 이제 웹서버(여기서는 nginx)에서 나눠줘야합니다. 라우팅이라고 하는 건데요. 애초에 DNS(도메인 네임 서비스)와 자신의 서버는 별개라서 여러개의 도메인 및 서브도메인이 같은 서버를 향하게 네임서버에서 설정할 수 있습니다.

 

 심지어 내가 아닌 전혀 다른사람이 그사람이 사용하는 DNS에서 그 자신의 도메인을 제 서버로 향하도록 할 수도 있습니다. 이런경우 응답을 거부할 수는 있어도 애초에 들어오는 요청을 못하게 할 수 있는게 아닙니다.

웹서버는 그렇게 여러 형태로 요청을 받을 수 있고 그에 맞게 응답하게 되어있는데 그렇게 나눠서 응답하는게 라우팅 설정입니다. 라우팅 단계에서 리다이렉팅을 할 수도 있죠

  • swiftcoding.org 및 다른 모든 요청은 /var/www/html/ 폴더로 보내고,
  • www.swiftcoding.org로 들어온 사람은 swiftcoding으로 보내고,
  • http 로 들어온 사람은 https로 보내고
  • kr.swiftcoding.org로 들어온 사람은 /var/www/korean/ 폴더로 보내고
  • 서버기록을 보다 보니 이상한 도메인이 과부하를 일으키네? 알게되면 이 특정도메인, 주소에 대해선 응답을 거부하도록 설정하고
  • 특정파일에 대해서 거부하고…

이런 저런요청들을 나누고 돌려주는게 웹서버의 라우팅입니다.

 

그런데 이런 라우팅, 리다이렉팅을 웹서버 단계에서만 할 수 있는 건 아닙니다.  DB 테이블로 정리해둔 데이터기반으로 돌려줄수도 있고 특정페이지에 php코드로, 자바스크립트 코드로도 할 수 있죠.

예를 들어 웹서버에서는 요청을 전부 /var/www/html 로 보내고 그 폴더에있는 index.php 파일이 코드상으로 모든걸 처리해서 나누고 돌려주고 거부하고 할 수도 있습니다. 극적으로는 10만개의 URI 주소를 각기 다르게 처리한다고 하면 DB에 데이터를 넣어두고 요청과 데이터를 비교해서 그에 맞는 처리를 하게도 가능하겠죠. 웹서버 처리단계에서는 어떤 것까지 다룰것인가? 그건 여러분 마음입니다.

 

이걸 하나의 파일에만 몰아두면 문제를 찾기 쉬울 텐데 서버관리자 사정상 이 파일 저파일 또는 최종 웹페이지에서 나누다보니 설정이 중복되거나 하면 찾아내기 어려워지기도 합니다.

 

nginx 라우팅 설정파일 내용에 대한 이해

엔진엑스의 라우팅 설정파일은 LEMP 스택 구성하기 시리즈 연재작에서 다뤘던 default 라는 이름의 파일을 재수정할 건데요. 저를 따라 LEMP 스택을 구성한 서버라면 /etc/nginx/sites-available/default 위치에 있습니다.

default 파일 위치

 

참고로, 엔진엑스의 라우팅설정 파일이 항상 default  하나인 건 아닙니다. 누군가는 사이트별로 파일을 나누고 다른 이름으로 지을 수 도 있습니다. site-available 폴더내에 라우팅 설정파일을 여러개 마련해둘 수 있죠.

그런다음 해당 라우팅설정을 활성화하려면 그 아래에있는 /etc/nginx/sites-enabled 안에도 해당파일들의 심볼링 링크파일을 만들어야한다는 겁니다. 현재 sites-enabled 폴더내용물을 살펴보면 sites-available 폴더에있는 default 파일로 향하는 심볼릭링크파일(바로가기)이 있는 걸 알 수 있습니다.

 

sites-enabled에 파일이 없으면 라우팅 설정이 활성화 되지 않습니다. 다시말해서 nginx는 site-enabled 에있는 라우팅 설정파일을 읽어들여 동작할 뿐이니 여러분은 sites-available에 설정 파일들을 미리 작성만 해놨다가 sites-enabled에 바로가기 파일을 만들어서 활성화 시키는 것이죠.

참고: etc/nginx/snippets 폴더에는 다른 공통된 설정문을 담은 파일들을 담고 그 내용들을 라우팅설정파일에 include 하여 쓰게 됩니다.

 

현재로선 nginx를 처음 설치하면 나오는대로 default 파일만 있고 default 파일만 활성화 된상태입니다. 우린 사이트구조가 그리 복잡하지 않으므로 기존에있던 default 파일을 수정해서 사용하면 됩니다. 앞서 LEMP 스택을 구성하면서 저를 따라 수정했다면 default 파일 내용이 아래와 같을 겁니다.

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 
    root /var/www/html; 
    index  index.php index.html index.htm index.nginx-debian.html; 
    server_name _;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
       fastcgi_pass unix:/run/php/php7.2-fpm.sock;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params; 
       fastcgi_read_timeout 300;
    }

   location ~ /\.ht {
     deny all;
   }
}

 

이 파일내용은 일종의 프로그래밍 코드와 비슷해서 개인마다 여러가지 형태로 작성해 사용할 수 있습니다. 같은 동작을 하는 라우팅설정을 누군가는 장황하게(그렇지만 한번에 보고 이해하기 쉽게) 긴 내용을 작성할 테고, 누군가는 최대한 간결하게(하지만 사전지식없이 이해하기 어려게) 짧게 작성할테죠.

보통 설정문의 줄 끝은 중괄호 {, } 나 세미콜론;으로 끝나게 됩니다. #(샵, 해쉬) 뒤로는 주석문입니다. 

 

server 블록과 location 블록

nginx 라우팅 설정에서 서버 블록과 로케이션 블록을 구분할 줄 알면 이해하기 쉬워집니다. 위에서는 라우팅  설정이 딱 하나인데요. 처음 server { 로 시작해서 마지막 중괄호 } 로 끝나는 구문까지입니다. 이런 server{...} 구문을 여러개 만들 수 있습니다. 그리고 그 안에서 또다른 중괄호설정이 있는데요. location block( location ...{...}) 들은 좀더 상세한 리다이렉팅 설정들일 뿐입니다. 

예를 들어 아래의 문구는 요청된 상세 주소 위치에 웹페이지를 만드는 php,html등의 파일이 있는지 확인해보고 없다면 404 not found (페이지 없음) 에러를 응답한다는 설정이죠.

 location / {
    try_files $uri $uri/ =404; 
    # 워드프레스 고유주소(permalink)를 기본(plain)에서 글이름(post name)등 다른걸로 바꾸었을 때 기존 글들이 404페이지가 되는 것 우회
     if (!-e $request_filename) { 
         rewrite ^.*$ /index.php last; 
     }
 }

이런 location block 을 이용해서 응답을 거부하거나, www 서브도메인을 리다이렉팅할 수도 있겠습니다.

 

 

도큐먼트 루트(root) 폴더 및 server_name 지정

원래있던 server_name _;server_name 도메인이름 처럼 바꿔주게 되는데 방문자가 어떤 주소로 들어오냐에따라 해당 도메인 이름을 가진 server{...} 블록이 처리합니다. 요청된 도메인을 처리하는 server_name을 가진 블록이 없다면 잠시후 아래에서 설명할 디폴트 서버(default_server)로 지정된 블록이 처리합니다.

 

server블록 내의 내용에서 root /var/www/html; 라고 쓰여진 부분이 해당 도메인을 어디로 보낼까하는 설정입니다. 제경우 /var/www/html 위치에 첫번째 워드프레스 사이트의 index.php 파일이 있으므로 첫 번째 워드프레스 사이트가 보여지게 되죠.

 

여러분들이 여러 워드프레스, 도메인에 대해 라우팅 설정한다면 server 블록마다 root 구문에 폴더를 그에 맞게 지정해주면 됩니다. 두 개의 사이트를 설정할 때 저처럼  첫번째 사이트 파일은 /var/www/html에 두번째 사이트파일은 /var/www/두번째루트 폴더에 나누는 사람이 있겠고,  누군가는 /var/www/html 하위에 또 두개의 새로운 폴더를 넣어두고 각각의 사이트파일을 나누는 사람도 있을 겁니다.

그렇다면 두개의 server 블록을 아래와 같은 식으로 작성할테죠.

server { 
...
...
    root /var/www/html/첫번째사이트_루트폴더; 
    server_name 첫번째_사이트_도메인;
...
...
}



server {
...
... 
    root /var/www/html/두번째사이트_루트폴더; 
    server_name 두번째_사이트_도메인;
 ...
 ... 
}

 

server블록 포트설정과 디폴트 서버(default_server)

listen 80 default_server;
listen [::]:80 default_server; 

인터넷 통신엔 사용되는 서버는 포트번호가 존재하는데 우리가 흔히 사용하는 http 의 경우 80번 포트, https의 경우 443번 포트, ssh는 22번,  mySQL은 3306, 이런식으로 되어있습니다. 그래서 위내용은 이 서버블록이 http:// 통신 프로토콜로 들어오는 요청에대한 처리를 하는 설정입니다.

 

그리고 위 코드처럼 nginx의 server 블락중에는 default_server; 라는설정이 붙는게 하나 있는데요. 여러개의 server 블록을 작성할때 default_server는 프로토콜(http, https, ftp등) 별로 단 하나의 server 블록에만 존재해야합니다. 이 디폴트 설정은 여러분이 별도로 지정하지 않은 도메인으로 들어오는 다른 모든 요청에대해선 해당 server 블록이 처리합니다.

 현재의 default 파일 내용으로선 단하나의 server 블록만 있고 그것이 default_server 이므로 모든 요청이 /var/www/html 폴더를 가리키게 되어 메인도메인으로 접속하든 서브도메인으로 접속하든 모두 다 같은 사이트 내용을 보여주게 됩니다.

 

www 서브도메인 리다이렉팅

서브도메인에 대해서는 제 블로그 이전 글을 참고하시기 바랍니다. 그리고 이전에 아파치를 사용할 때의 리다이렉 방법 글도 단순히 참고할 수 있겠습니다.

 

이 글의 위 내용대로라면 현재의 default 파일 만으로도 메인도메인과 www 서브 도메인 모두를 처리할 수 있고 같은 워드프레스 블로그의 내용을 보여주게 됩니다. 그런데 저는 굳이 www 도메인으로 들어온걸 메인도메인으로 돌려줄까요?

그건 도메인 포워딩 때문입니다. 위 설정은 방문자가 http://www.swiftcoding.org 로 들어온대로 웹브라우저 주소표시줄에도 그대로 나타나게 되는데 같은 내용의 사이트를 보여준다고 해도  http://swiftcoding.org로 접속한 사람이나 http://www.swiftcoding.org 사람이나 웹주소가 최종적으로 http://swiftcoding.org 처럼 메인도메인으로 보이도록 하려면 www 를 메인도메인으로 돌려주는 리다이렉팅 설정을 해야하겠습니다.

 

최종도메인이 서브도메인과 메인도메인 중 어느쪽으로 할건지, 애초에 이런 포워딩 설정을 할건지 말건지는 모두 여러분의 선택입니다. 

 

 

FTP에서 편집을 위한 파일권한 변경

ubuntu 사용자로 접속한 FTP 프로그램을 통해서 /etc/nginx/sites-available/default 이파일을 읽을 수 없거나 편집, 수정, 저장할 수 없다면 리눅스 파일의 권한 문제입니다.

해당 파일의 사용자그룹으르 ubuntu 그룹으로 변경하는 chgrp 명령어와

sudo chgrp ubuntu /etc/nginx/sites-available/default

그룹 멤버들이 수정할 수 있는 권한인 664 또는 775 같은 권한으로 변경해주는 chmod 명령어를 사용해줍니다.

sudo chmod 664 /etc/nginx/sites-available/default

 

chgrp과 chmod 명령어를 사용함

 

그러면 FTP 프로그램을 이용해서도 해당파일을 열어 수정할 수 있을 겁니다.

 

 

NGiNX 설정파일로 www 도메인 리다이렉팅하기

  •  메인도메인인 http://swiftcoding.org로 요청이 들어오면 /var/www/html 폴더로 돌려줘서 그곳에 설치된 워드프레스 블로그 사이트를 볼 수 있습니다.
  • 그리고 서브도메인인 www (http://www.swiftcoding.org)로 요청이 들어오면 메인 도메인으로 리다이렉팅 해주겠습니다.

참고: 이번 연재작을 따라서 HTTPS 까지 계속해서 설정할거라면 거기서도 리다이렉팅을 위해 설정파일을 다시 수정할테니 굳이 리다이렉팅 안해줘도 됩니다만 따라해서 나쁠건 없겠죠.

 

첫번째 서버블록의 내용중에  server_name _; 이던 부분에 자신이 구매한 메인도메인 이름을 지정해줍시다. 저는 http://swiftcoding.org 라서 언더바(_) 대신 아래처럼 swiftcoding.org 라고 작성했습니다.default_server 인 서버블록은 server_name에 도메인주소를 꼭 적어줄 필욘없겠지만 적어줍시다.

    server_name swiftcoding.org;

 

그런다음 맨아래에 새로운 server{...} 블록을 아래처럼 추가합니다. 

################## HTTP www.
server {
    listen 80;
    listen [::]:80;
    server_name www.swiftcoding.org;
    location / {
        return 301 http://swiftcoding.org$request_uri;       ### http://swiftcoding.org 로 리다이렉팅
    }
}

참고: 같은줄에서 #기호 뒷부분은 주석문으로서, 아무런 영향을 미치지 않습니다.

 

그러면 /etc/nginx/sites-available/default 파일의 전체내용은 아래와 같습니다.

중요: 아래내용중 swiftcoding.org는 제  도메인이름이므로 여러분은 여러분의 도메인에 맞춰서 입력하시기 바랍니다. 주석문 제외 3군데 있습니다.

################## HTTP  swiftcoding.org
server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 
    root /var/www/html; 
    index index.php index.html index.htm index.nginx-debian.html; 
    server_name swiftcoding.org;

    location / { 
        try_files $uri $uri/ =404; 
        # 워드프레스 고유주소(permalink)를 기본(plain)에서 글이름(post name)등 다른걸로 바꾸었을 때 기존 글들이 404페이지가 되는 것 우회
       if (!-e $request_filename) { 
         rewrite ^.*$ /index.php last; 
       }
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params; 
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
   }
}


################## HTTP www.swiftcoding.org to swiftcoding.org
 server {
    listen 80;
    listen [::]:80; 
    server_name www.swiftcoding.org;

    location / { 
        return 301 http://swiftcoding.org$request_uri;     ### http://swiftcoding.org로 리다이렉팅 
    }
}

 

이제 www.swiftcoding.org로 들어오면 server_name 이 www.swiftcoding.org 인 server 블록이 담당하게 되고 그안에적힌 location 블록이 301응답코드와 함께 리다이렉팅으로 메인도메인인 http://swiftcoding.org + 하위 나머지 URL slug($request_uri) 인곳으로 보내게 됩니다.

그러면 윗쪽 server 블락이 root 폴더인 /var/www/html 로 보낼테고 html 폴더에 있는 index 파일(index, index.php, index.html 등)이 여러분의 웹사이트를 보여주게 될 겁니다.

 

 

위 내용대로 저장했다면 nginx를 재시작해줘야합니다. 

sudo nginx -t 

위 명령어로 설정파일 문법이 이상없는지 확인해봐서 …syntax is ok…test is successful 메시지가 나오는지 먼저 확인한다음 아래 재시작 명령어를 통해 재시작해주세요.

sudo service nginx restart

nginx 재시작 명령어 입력

 

 

 

 

워드프레스 사이트 주소 (홈페이지 URL ) 설정

참고: 이번 글처럼 도메인 연결을 먼저 하지 않고  서버IP만으로 접속해서 이전 글처럼 워드프레스 첫 설치화면을 통해 먼저 설치했다면 아래 작업이 필요할 것입니다.  이번글을 따라 먼저 도메인을 연결했을뿐 아직 첫 관리자 ID를 만들지 않았다면 이전 글을 따라 ID를 만든뒤 아래의 다음 단계로 이어가시면 됩니다.

 

이 설정은 매우 중요한 설정입니다. 나중에 워드프레스를 설치하고 관리자 페이지에 접속해서 설정 -> 일반 에 보면 아래그림처럼 워드프레스 주소와 사이트주소를 설정할 수 있게 되어있습니다. 

 

중요:  아래 값을 잘못 바꾸면 애석하게도 자신의 워드프레스 관리자 페이지로 영영 접속을 못하는 사태에 이르게 되곤 합니다. (왜 이런 위험한 물건을 여기 뒀어?)  아래 그림에 나온대로 자신의 도메인을 작성해주면 되는데요. 위에 nginx 라우팅설정 파일을 수정하면서 www 리다이렉팅을 했을 때의 최종 도메인과 맞춰줘야 겠습니다. 그렇지않으면 무한 리다이렉팅되어 접속할 수 없게 되거나 관리자화면에 재접속이 불가능하게 될 수도 있습니다. 

워드프레스 사이트 URL 세팅화면

 

이전단계에서 언급했듯이 이번 글처럼 도메인연결을 하지 않고 서버IP주소로 접속한채로 첫 워드프레스 설치화면에 접속해 ID를 만드는 것부터 했다면 워드프레스 주소(URL)사이트 주소(URL)에 위그림처럼 도메인대신 IP 주소가 작성되어있을 것입니다. 관리자ID 만들때 DB에 기록된 것이죠.

 

 

다음단계

이제 사용하시는 웹브라우저의 브라우저 캐시데이터 삭제 또는 인터넷 사용기록 삭제를 해가면서 의도한대로 도메인 리다이렉팅이 되는지 확인해보세요.

이렇게 nginx 라우팅 설정파일에 대해서 알아보고 http 도메인 리다이렉팅 방법을 알아봤습니다. 시리즈 연재작 다음에서 nginx에서의 HTTPS 사용하는 방법을 계속 알아보겠습니다. 자신의 사이트에서 HTTPS를 지원할 것인가는 자유지만 점점 필수가 되어가고 있습니다.

 

참고자료: nginx wiki 

11 댓글

  1. 안녕하세요.
    설정 후 24시간이 경과 했는데도 리다이렉팅이 안되고 있습니다.
    default 파일도 문제가 없고, DNS도 설정을 해놓았으며, 쿠키고 삭제했습니다.

    어디서 문제가 발생한 걸까요..?
    여기서 막혀서 HTTPS로 진도를 못나가고 있습니다..:)

  2. 좋은글 감사합니다.
    그런데 다 설치하고 잘 되는데 글을 쓰고 그 글에 들어가면
    404 not found 라는 에러가 뜹니다.
    혹시 어떻게 해결해야할까요?

    • 안녕하세요. 방금 글을 수정했는데요. nginx 라우팅 설정에서 아래부분을 찾아

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

      아래처럼 바꾸고 nginx를 재시작해보세요.

      location / { 
              try_files $uri $uri/ =404; 
              # 워드프레스 고유주소(permalink)를 기본(plain)에서 글이름(post name)등 다른걸로 바꾸었을 때 기존 글들이 404페이지가 되는 것 우회
             if (!-e $request_filename) { 
               rewrite ^.*$ /index.php last; 
             }
          }
      
  3. 저만 그런것인지 모르겠지만…
    여기까지하고나서 모든게 잘 됩니다.
    테마를 워프에서 선택해서 활성화하는것도 잘 되는데요.
    문제는 제가 복원을 위해 기존테마를 ftp로 업로드 한뒤 워프에서 활성화를 시키면 그때부터 워프가 먹통이됩니다.
    브라우저에 “페이지가 작동하지 않습니다”라는 메세지가 나오면서 관리자페이지로도 들어갈 수 없게 되는데 혹시 왜이럴까요??

      • 아 ftp로 차일드테마 만들었기 때문에 이러는건 아니겠죠..?
        새로 테마 적용해서 해보겠습니다.

        • 혹시 모르니 FTP로 업로드 후 아래링크를 따라 권한을 다시 설정해보시기 바랍니다.
          https://swiftcoding.org/downloading-wp#permission
          올렸던 테마의 폴더, 파일들의 소유자가 FTP로 올리면 ubuntu가 되니까요. www-data로 만들어주세요.

          그리고 다른 방법으로는 차일드테마를 zip 파일로 압축해서 관리자페이지를 통해 테마를 설치해보는 겁니다.
          https://swiftcoding.org/install-themes#zip
          이렇게 올리는건 워드프레스가 설치하기때문에 차일드테마 하위의 폴더 파일 소유자가 www-data가 됩니다.

          • 아, 네
            안그래도 ftp로 올리니까 ubuntu로 되어서 다시 www-data로 사용자 변경해서 수정했었거든요. zip파일로 테마설치해보겠습니다.
            감사합니다

댓글을 남겨주세요.(익명, 구글, wordpress,페이스북, 트위터 계정 로그인 지원) 마크다운 문법 사용가능