웹사이트 검색

Ubuntu 14.04 LTS에서 Nginx 서버 블록(가상 호스트)을 설정하는 방법


소개

Nginx 웹 서버를 사용할 때 서버 블록(Apache의 가상 호스트와 유사)을 사용하여 구성 세부 정보를 캡슐화하고 단일 서버에서 둘 이상의 도메인을 호스트할 수 있습니다.

이 가이드에서는 Ubuntu 14.04 서버의 Nginx에서 서버 블록을 구성하는 방법에 대해 설명합니다.

전제 조건

이 튜토리얼 전체에서 sudo 권한이 있는 루트가 아닌 사용자를 사용할 것입니다. 이와 같이 구성된 사용자가 없는 경우 Ubuntu 14.04 초기 서버 설정 가이드의 1-4단계에 따라 사용자를 만들 수 있습니다.

또한 서버에 Nginx가 설치되어 있어야 합니다. 서버에 전체 LEMP(Linux, Nginx, MySQL 및 PHP) 스택을 원하는 경우 Ubuntu 14.04에서 LEMP 스택 설정에 대한 가이드를 따를 수 있습니다. Nginx만 필요한 경우 다음을 입력하여 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install nginx

이러한 요구 사항을 충족하면 이 가이드를 계속 진행할 수 있습니다.

데모 목적으로 Nginx 서버로 두 개의 도메인을 설정합니다. 이 가이드에서 사용할 도메인 이름은 example.comtest.com입니다.

여기에서 DigitalOcean으로 도메인 이름을 설정하는 방법에 대한 가이드를 찾을 수 있습니다. 사용할 여분의 도메인 이름이 두 개 없다면 지금은 더미 이름을 사용하세요. 구성을 테스트하기 위해 로컬 컴퓨터를 구성하는 방법은 나중에 알려드리겠습니다.

1단계 - 새 문서 루트 디렉토리 설정

기본적으로 Ubuntu 14.04의 Nginx에는 기본적으로 활성화된 하나의 서버 블록이 있습니다. 다음 디렉토리에서 문서를 제공하도록 구성됩니다.

/usr/share/nginx/html

/var/www 디렉토리에서 작업하는 것이 더 쉽기 때문에 기본값을 사용하지 않습니다. Ubuntu의 Nginx 패키지는 /var/www를 사용하는 패키지에 대한 데비안 정책으로 인해 기본적으로 문서 루트로 /var/www를 사용하지 않습니다.

우리는 패키지 관리자가 아니라 사용자이기 때문에 Nginx에게 문서 루트를 원하는 위치라고 말할 수 있습니다. 특히 /var/www 디렉토리 내에 각 사이트에 대한 디렉토리가 필요하며 실제 파일을 보관할 html이라는 디렉토리가 이 디렉토리 아래에 있을 것입니다.

먼저 필요한 디렉토리를 생성해야 합니다. 다음 명령으로 이를 수행할 수 있습니다. -p 플래그는 mkdir에게 필요한 상위 디렉토리를 생성하도록 지시합니다.

  1. sudo mkdir -p /var/www/example.com/html
  2. sudo mkdir -p /var/www/test.com/html

이제 디렉터리가 생성되었으므로 일반 사용자에게 소유권을 이전해야 합니다. $USER 환경 변수를 사용하여 현재 로그인한 사용자 계정을 대체할 수 있습니다. 이렇게 하면 방문자가 콘텐츠를 만들지 않고도 이 디렉토리에 파일을 만들 수 있습니다.

  1. sudo chown -R $USER:$USER /var/www/example.com/html
  2. sudo chown -R $USER:$USER /var/www/test.com/html

umask 값을 수정하지 않았다면 웹 루트의 권한이 이미 정확해야 하지만 다음을 입력하여 확인할 수 있습니다.

  1. sudo chmod -R 755 /var/www

이제 디렉토리 구조가 구성되었으며 계속 진행할 수 있습니다.

2단계 - 각 사이트에 대한 샘플 페이지 만들기

이제 디렉토리 구조가 설정되었으므로 표시할 항목이 있도록 각 사이트에 대한 기본 페이지를 생성하겠습니다.

첫 번째 도메인에 index.html 파일을 만듭니다.

  1. nano /var/www/example.com/html/index.html

파일 안에 현재 액세스하고 있는 사이트를 나타내는 기본 파일을 만듭니다. 다음과 같이 표시됩니다.

<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com server block is working!</h1>
    </body>
</html>

완료되면 파일을 저장하고 닫습니다.

두 번째 사이트의 파일은 기본적으로 동일하므로 다음과 같이 두 번째 문서 루트에 복사할 수 있습니다.

  1. cp /var/www/example.com/html/index.html /var/www/test.com/html/

이제 편집기에서 새 파일을 열고 두 번째 도메인을 참조하도록 수정할 수 있습니다.

  1. nano /var/www/test.com/html/index.html
<html>
    <head>
        <title>Welcome to Test.com!</title>
    </head>
    <body>
        <h1>Success!  The test.com server block is working!</h1>
    </body>
</html>

완료되면 이 파일을 저장하고 닫습니다. 이제 두 도메인의 방문자에게 표시할 페이지가 생겼습니다.

3단계 - 각 도메인에 대한 서버 블록 파일 생성

이제 서비스할 콘텐츠가 있으므로 Nginx에 이 작업을 수행하는 방법을 알려줄 서버 블록을 실제로 만들어야 합니다.

기본적으로 Nginx에는 자체 구성을 위한 템플릿으로 사용할 수 있는 default라는 하나의 서버 블록이 포함되어 있습니다. 첫 번째 도메인의 서버 블록을 설계하는 것으로 시작하여 두 번째 도메인에 복사하고 필요한 수정을 합니다.

첫 번째 서버 블록 파일 만들기

위에서 언급했듯이 기본 파일을 복사하여 첫 번째 서버 블록 구성 파일을 만듭니다.

  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

이제 루트 권한으로 텍스트 편집기에서 만든 새 파일을 엽니다.

  1. sudo nano /etc/nginx/sites-available/example.com

주석 처리된 줄을 무시하면 파일이 다음과 같이 표시됩니다.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name localhost;

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

먼저 listen 지시문을 살펴봐야 합니다. 서버 블록 중 하나만 default_server 사양을 가질 수 있습니다. 이것은 요청된 server_name이 사용 가능한 서버 블록과 일치하지 않는 경우 요청을 처리해야 하는 블록을 지정합니다.

결국 기본 서버 블록 구성을 비활성화할 예정이므로 이 서버 블록이나 다른 사이트의 블록에 default_server 옵션을 배치할 수 있습니다. 이 서버 블록에서 default_server 옵션을 활성화된 상태로 두겠지만 상황에 가장 적합한 옵션을 선택할 수 있습니다.

다음으로 조정해야 할 것은 root 지시문에 의해 지정된 문서 루트입니다. 만든 사이트의 문서 루트를 가리킵니다.

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

참고: 각 Nginx 문은 반드시 세미콜론(;)으로 끝나야 하므로 문제가 발생하면 각 행을 확인하십시오.

다음으로 첫 번째 도메인에 대한 요청과 일치하도록 server_name을 수정하려고 합니다. 일치시키려는 별칭을 추가로 추가할 수 있습니다. 다음을 시연하기 위해 www.example.com 별칭을 추가합니다.

server_name example.com www.example.com;

완료되면 파일은 다음과 같이 표시됩니다.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/example.com/html;
    index index.html index.htm;

    server_name example.com www.example.com;

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

이것이 기본 구성에 필요한 전부입니다. 종료하려면 파일을 저장하고 닫습니다.

두 번째 서버 블록 파일 만들기

이제 초기 서버 블록 구성이 있으므로 이를 두 번째 파일의 기초로 사용할 수 있습니다. 복사하여 새 파일을 만듭니다.

  1. sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

편집기에서 루트 권한으로 새 파일을 엽니다.

  1. sudo nano /etc/nginx/sites-available/test.com

이 새 파일에서 listen 지시문을 다시 살펴봐야 합니다. 마지막 파일에서 default_server 옵션을 활성화한 상태로 두었다면 이 파일에서 제거해야 합니다. 또한 주소/포트 조합당 한 번만 지정할 수 있으므로 ipv6only=on 옵션을 제거해야 합니다.

listen 80;
listen [::]:80;

두 번째 도메인의 문서 루트를 가리키도록 문서 루트 지시문을 조정합니다.

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

두 번째 도메인 및 별칭과 일치하도록 server_name을 조정합니다.

server_name test.com www.test.com;

파일은 다음과 같이 변경되어야 합니다.

server {
    listen 80;
    listen [::]:80;

    root /var/www/test.com/html;
    index index.html index.htm;

    server_name test.com www.test.com;

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

완료되면 파일을 저장하고 닫습니다.

4단계 - 서버 블록 활성화 및 Nginx 재시작

이제 서버 블록이 생성되었으므로 활성화해야 합니다.

이 파일에서 Nginx가 시작하는 동안 읽는 sites-enabled 디렉토리에 대한 심볼릭 링크를 생성하여 이를 수행할 수 있습니다.

다음을 입력하여 이러한 링크를 만들 수 있습니다.

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  2. sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

이러한 파일은 이제 enabled 디렉토리에 있습니다. 그러나 템플릿으로 사용한 기본 서버 블록 파일도 현재 활성화되어 있으며 default_server 매개변수가 설정된 파일과 충돌합니다.

단순히 심볼릭 링크를 제거하여 기본 서버 블록 파일을 비활성화할 수 있습니다. sites-available 디렉토리에서 계속 참조할 수 있지만 시작 시 Nginx에서 읽지 않습니다.

  1. sudo rm /etc/nginx/sites-enabled/default

또한 기본 Nginx 구성 파일에서 한 가지 설정을 정말 빠르게 조정해야 합니다. 다음을 입력하여 엽니다.

  1. sudo nano /etc/nginx/nginx.conf

한 줄만 주석 해제하면 됩니다. 다음에서 댓글을 찾아 제거합니다.

server_names_hash_bucket_size 64;

이제 Nginx를 다시 시작하여 변경 사항을 적용할 준비가 되었습니다. 다음을 입력하면 됩니다.

  1. sudo service nginx restart

Nginx는 이제 두 도메인 이름을 모두 제공해야 합니다.

5단계 - 로컬 호스트 파일 설정(선택 사항)

소유한 도메인 이름을 사용하지 않고 대신 더미 값을 사용하고 있는 경우 Nginx 서버 블록 구성을 임시로 테스트할 수 있도록 로컬 컴퓨터의 구성을 수정할 수 있습니다.

이렇게 하면 다른 방문자가 사이트를 올바르게 볼 수 없지만 각 사이트에 독립적으로 접근하고 구성을 테스트할 수 있습니다. 이것은 기본적으로 도메인 이름을 확인하기 위해 일반적으로 DNS로 가는 요청을 가로채는 방식으로 작동합니다. 대신 도메인 이름을 요청할 때 로컬 컴퓨터가 이동할 IP 주소를 설정할 수 있습니다.

이 단계 동안 VPS 서버가 아닌 로컬 컴퓨터에서 작업하고 있는지 확인하십시오. 이렇게 하려면 루트 액세스 권한이 있거나 관리 그룹의 구성원이거나 시스템 파일을 편집할 수 있어야 합니다.

집에서 Mac 또는 Linux 컴퓨터를 사용하는 경우 다음을 입력하여 필요한 파일을 편집할 수 있습니다.

  1. sudo nano /etc/hosts

Windows를 사용하는 경우 여기에서 호스트 파일 변경에 대한 지침을 찾을 수 있습니다.

서버의 공용 IP 주소와 서버로 라우팅하려는 도메인이 필요합니다. 내 서버의 공용 IP 주소가 111.111.111.111이라고 가정하면 내 파일에 추가할 행은 다음과 같습니다.

127.0.0.1   localhost
127.0.0.1   guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com

이렇게 하면 example.comtest.com에 대한 모든 요청을 가로채서 서버로 보냅니다. 사용하고 있습니다.

완료되면 파일을 저장하고 닫습니다.

6단계 — 결과 테스트

이제 모든 설정이 완료되었으므로 서버 블록이 올바르게 작동하는지 테스트해야 합니다. 웹 브라우저에서 도메인을 방문하면 됩니다.

http://example.com

다음과 같은 페이지가 표시됩니다.

두 번째 도메인 이름을 방문하면 약간 다른 사이트가 표시됩니다.

http://test.com

이 두 사이트가 모두 작동하면 Nginx로 두 개의 독립적인 서버 블록을 성공적으로 구성한 것입니다.

이 시점에서 테스트를 위해 로컬 컴퓨터에서 hosts 파일을 조정했다면 추가한 줄을 제거하고 싶을 것입니다.

공개 사이트를 위해 서버에 대한 도메인 이름 액세스가 필요한 경우 각 사이트에 대한 도메인 이름을 구매하고 싶을 것입니다. 여기에서 서버를 가리키도록 설정하는 방법을 배울 수 있습니다.

결론

이제 동일한 서버에서 호스트하려는 각 도메인에 대해 서버 블록을 생성할 수 있습니다. 하드웨어가 트래픽을 처리할 수 있는 한 생성할 수 있는 서버 블록 수에는 실제 제한이 없습니다.