도메인 두개(domain1.com, domain2.com)를 가지고 있는데 웹서버는 하나에서 운영하고 싶다.

이럴 때 사용하라고 가상 호스트(Virtual Hosts) 기능이 NGINX에 있다.

* 아파치나 다른 웹서버에도 물론 있다.

1. 새 도메인의 웹 기본 디렉토리 설정

기본으로 우분투 16.04에 NGINX를 설치하면 웹 기본 디렉토리는

/var/www/html 이다.

사이트를 하나만 운영한다면 그대로 써도 무방한데, 여러 사이트를 운영한다면 설정된 기본 디렉토리(/var/www/html)를 멀티사이트 목록에 없는 페이지를 요청할 때 사용해도 좋겠다.

각자 좋아하는 스타일이 있겠지만, 나는 /var/www 아래 “도메인” 형식의 디렉토리를 생성하고 그 아래 html 디렉토리를 놓는 방식으로 하겠다.

sudo mkdir -p /var/www/domain1.com/html

sudo mkdir -p /var/www/domain2.com/html

mkdir의 -p 플래그는 종단까지 디렉토리를 쭈욱 만든다. 말단 디렉토리의 상위디렉토리까지 없으면 쭉 만든다.

만든 디렉토리의 소유권을 NGINX 기본 사용자인 www-data에게 넘기자.

sudo chown -R www-data:www-data /var/www/domain1.com/html

sudo chown -R www-data:www-data /var/www/domain2.com/html

파일권한을 확인하여 755가 아니라면 다음과 같이.(umask를 변경하지 않았다면 이미 755일 것이다.)

sudo chmod -R 755 /var/www

2. 각 도메인의 샘플 웹페이지 만들기

워드프레스를 설치할 거라 딱히 필요성을 못 느끼지만 그래도 워드프레스를 설치하기 전에 제대로 되나 확인차 함 해보자.

domain1.com

vi /var/www/domain1.com/html/index.html

/var/www/domain1.com/html/index.html

<html>

<head>

<title>domain1.com</title>

</head>

<body>

<h1>성공! 도메인1</h1>

</body>

</html>

domain2.com

cp /var/www/domain1.com/html/index.html /var/www/domain2.com/html/

vi /var/www/domain2.com/html/index.html

/var/www/domain2.com/html/index.html

<html>

<head>

<title>domain2.com</title>

</head>

<body>

<h1>성공! 도메인2</h1>

</body>

</html>

3. 각 도메인의 서버블록 파일을 만들자

NGINX가 기본적으로 만들어 놓은 서버블록 파일을 수정해서 domain1.com 서버블록 파일을 만들고 그걸 복사해서 사용하는 방식으로 진행하자.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/domain1.com

sudo vi /etc/nginx/sites-available/domain1.com

주석처리된 부분을 무시하고 대충 다음과 같을 것이다.

/etc/nginx/sites-available/domain1.com

server {

listen 80 default_server;

listen [::]:80 default_server;

root /var/www/html;

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

server_name _;

location / {

try_files $uri $uri/ =404;

}

}

처음으로 보이는 것이 listen 지시자다. 오직 하나의 서버블록 만이 default_server 옵션을 가질 수 있다. 이 옵션은 사용하는 서버블록에 매칭되지 않는 요청이 들어왔을 때 처리하는 옵션인데, 생각해보면 이런 경우가 실제 서비스에서 생길지는 모르겠다. 왜냐하면 사람들은 이미 내가 만들어 놓은 웹사이트를 도메인을 쳐서 들어오든가 검색을 해서 방문하던가 할 것이기 때문이다. (검색사이트에서 아이피주소를 링크시켜 놓는 걸 본적도 있는 것 같기도 한데.. 으음)

하여간, 설정하려는 서버블록에 default_server를 집어 넣던지, 제거하던지, 아니면 걍 냅둬서 요청된 호스트를 찾지 못했을 때 NGINX가 /var/www/html의 내용으로 응답하게 하자.

제거하자.

/etc/nginx/sites-available/domain1.com

server {

listen 80;

listen [::]:80;

. . .

}

다음과 같이 명령을 내려서 활성화된 파일 중 하나만 default_server 옵션이 활성화 되어있는지 확인하는 것도 좋다. (나중에 nginx -t 해도 된다)

grep -R default_server /etc/nginx/sites-enabled/

다음으로 document root 디렉토리를 설정하자. (위에서 만든 디렉토리)

/etc/nginx/sites-available/domain1.com

server {

listen 80;

listen [::]:80;

root /var/www/domain1.com/html;

}

server_name 지시자에 별칭을 추가할 수 있으니 적절히 추가해 보자.

보통 domain.com 과 거의 정형화 되어있는 서브도메인 www.domain.com (요즘은 따따따 www 를 않붙이는 추세인 듯.. 내 생각에도 굳이 월드와이드웹이란 단어를 쓰는 세상이 아닌 것 같다.)

domain1.com 서버블록 파일은 대충 다음과 유사할 것이고,

/etc/nginx/sites-available/example.com

server {

listen 80;

listen [::]:80;

root /var/www/domain1.com/html;

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

server_name domain1.com www.domain1.com;

location / {

try_files $uri $uri/ =404;

}

}

domain2.com 서버블록 파일

domain1.com 서버블록 파일을 복사해서 쓰자.

sudo cp /etc/nginx/sites-available/domain1.com /etc/nginx/sites-available/domain2.com

sudo vi /etc/nginx/sites-available/domain2.com

default_server 옵션이 있는지 확인하고(있으면 없애고) 루트 디렉토리를 알맞게 수정한다.

domain1.com 서버블록 파일에서 한 것을 고대로 적용, 수정한다.

/etc/nginx/sites-available/domain2.com

server {

listen 80;

listen [::]:80;

root /var/www/domain2.com/html;

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

server_name domain2.com www.domain2.com;

location / {

try_files $uri $uri/ =404;

}

}

4. 서버블록 활성화, NGINX 재시작

서버블록 파일을 만들었으니 활성화 시킨다.

/etc/nginx/sites-enabled 에 심볼릭 링크를 만들면 된다. 그러면 NGINX가 시작할 때 디렉토리에 있는 것들을 읽어들인다.

sudo ln -s /etc/nginx/sites-available/domain1.com /etc/nginx/sites-enabled/

sudo ln -s /etc/nginx/sites-available/domain2.com /etc/nginx/sites-enabled/

domain1.com은 domain1.com 과 www.domain1.com 에 대한 요청을 처리할 것이고,

domain2.com은 domain2.com 과 www.domain2.com 에 대한 요청을 처리한다.

default는 우리가 설정한 두개의 서버블록에 매치가 되지 않는 80포트로 들어요는 나머지 요청들을 처리할 것이다.

추가적인 서버 이름을 설정해서 생길 수 있는 hash bucket memory 문제를 예방하기 위해 다음과 같이 하자.

sudo vi /etc/nginx/nginx.conf

server_names_hash_bucket_size 지시자를 찾아서 주석처리 마크(#)를 제거한다.

/etc/nginx/nginx.conf

http {

. . .

server_names_hash_bucket_size 64;

. . .

}

NGINX 설정파일들이 제대로 되었는지 확인하고,

sudo nginx -t

OK” 메시지를 받았다면 NGINX를 재시작한다.

sudo systemctl restart nginx

자, 이제 NGINX가 이미 따 놓은 도메인에 대한 웹 서비스를 제공할 것이다.

5. 테스트

http://domain1.com

http://domain2.com

하드웨어가 받쳐주는 한 무제한의 서버블록을 설정할 수 있다.