NGINX 가상 호스트(Virtual Host) 설정 (Ubuntu 16.04에서)
도메인 두개(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
하드웨어가 받쳐주는 한 무제한의 서버블록을 설정할 수 있다.
※ 위 포스팅이 문제있을 시 삭제처리 하겠습니다.
댓글 없음:
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.