우분투 Nginx 웹서버 설치와 멀티 도메인 설정 - Ubuntu Nginx

엔진엑스로 불리는 웹서버입니다. 가볍고 빠른 웹서버를 목표로 개발된 오픈소스 프로젝트입니다. 아파치 만큼이나 각광을 받고 있는 멀티 플랫폼 지원 웹서버로 아파치만큼 다양한 서비스 기능을 지원합니다.

강력한 성능으로 인해 웹 서버 기능뿐만 아니라 프록시 서버, 로드 밸런서, 캐시 서버 등 다양한 서버 서비스 용도로 사용됩니다.

아파치 웹서버에서 구성하는 가상 호스트, 또는 멀티 호스트를 엔진엑스에서는 서버 블록이라는 단어로 사용하며, 서버 블록을 설정해서 단일 서버에서 여러 개의 웹 사이트를 운영할 수 있습니다.

Nginx 설치

기본적으로 우분투 22.04 LTS에서 Nginx를 설치하는 과정을 소개합니다. apt 패키지 매니터를 사용해서 빠르고 간편하게 설치할 수 있습니다.

sudo apt update
sudo apt install nginx

설치는 별다른 설정 과정 없이 빠르고 간편하게 진행됩니다. Nginx 데몬까지 자동으로 설정되어 설치 후 서비스까지 자동으로 시작됩니다.

Nginx 서비스가 실행중인지 다음 커맨드로 확인할 수 있습니다. "Active: active" 라고 표시되면 Nginx 웹서버 서비스가 실행중인 것입니다.

ubuntu@ubuntu:~$ sudo systemctl status nginx

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-03-23 00:04:50 UTC; 1min 14s ago
       Docs: man:nginx(8)
    Process: 56730 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 56731 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 56828 (nginx)
      Tasks: 5 (limit: 4421)
     Memory: 5.8M
        CPU: 139ms
     CGroup: /system.slice/nginx.service
             ├─56828 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─56830 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">
             ├─56831 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">

...

Nginx 웹서버 관리

Nginx 웹서버 환경 설정 파일을 수정했거나, 여러 변경 사항으로 인해 Nginx 웹서비스를 자시 시작하려면 다음 커맨드를 사용합니다.

sudo systemctl restart nginx

웹서비스 점검이나 웹사이트 이전 등 웹서비스를 내려놓을 필요가 있을 때 Nginx 웹서비스를 다음 커맨드로 정지할 수 있습니다.

sudo systemctl stop nginx

정지한 Nginx 웹서비스는 다음 커맨드로 실행합니다.

sudo systemctl start nginx

또는 service 커맨드를 사용해 같은 기능을 실행할 수도 있습니다.

sudo service nginx start
sudo service nginx stop
sudo service nginx restart

UFW 방화벽 설정

외부에서 Nginx 웹서버에 80포트, 또는 443포트로 연결하려면 해당 포트가 방화벽에서 접근허용되어 있어야 합니다.

우분투에서 주로 사용하는 UFW는 기본 설정이 모두 차단이기 때문에 꼭 방화벽 룰을 추가해서 포트 개방을 해야 합니다.

Nginx 웹서버는 설치 과정에서 UFW가 인식할 수 있는 앱 등록을 함께 하기 때문에 UFW에서 각각 80, 443 포트를 개방하는 설정을 할 필요 없이 앱 이름으로 방화벽 설정을 할 수 있습니다.

먼저 Nginx 설치 후 프로그램 이름으로 UFW 설정을 할 수 있는지 확인합니다. "ufw app list" 커맨드로 UFW에 등록된 프로그램 목록을 확인해서 Nginx Full, Nginx HTTP, Nginx HTTPS가 있으면 됩니다.

ubuntu@ubuntu:~$ sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS

각 이름이 허용하는 포트는 다음과 같습니다.

  • 80포트: Nginx HTTP
  • 443포트: Nginx HTTPS
  • 80&443포트: Nginx Full

다음 커맨드로 80&443 포트 모두를 개방합니다.

sudo ufw allow 'Nginx Full'

룰 추가 후 룰이 적용되었는지 확인합니다. status 옵션으로 UFW 룰 목록을 출력해여 Nginx 항목들이 추가되어 있는지 확인합니다.

ubuntu@ubuntu:~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Nginx Full                 ALLOW       Anywhere
Nginx Full (v6)            ALLOW       Anywhere (v6)

Nginx 서버 블록 생성

디렉토리 생성

Nginx는 설치 후 기본 웹사이트가 하나 생성됩니다. 기본 웹 사이트의 위치는 "/var/www/" 디렉토리 밑에 새로 생성되는 "html" 디렉토리가 됩니다.

그 안의 "index.nginx-debian.html" 파일이 "http://IP주소"로 접근하면 표시됩니다.

Nginx 기본 페이지
Nginx 기본 페이지

새 웹 사이트용 디렉토리를 하나 만듭니다. 사용할 도메인이나 호스트 이름으로 만드는 것을 추천합니다.

sudo mkdir -p /var/www/mydomain.com

그리고 텍스트 편집기를 사용해 "mydomain.com" 폴더 안에 다음처럼 간단한 성공 메시지를 표시해주는 index.html 파일을 생성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Nginix 서버 블록 for mydomain.com</title>
</head>
<body>
    <h1>mydomain.com 웹사이트 설정 성공!</h1>
</body>
</html>

디렉토리 소유권 변경

"mydomain.com" 디렉토리의 소유권을 Nginx 사용자인 "www-data"로 변경해야 합니다. 그래야 Nginx 웹서버가 웹 서비스용 디렉토리를 핸들링 할 수 있게 됩니다.

"-R" 옵션은 디렉토리에 안에 있는 하위 파일/디렉토리까지 모두 소유권을 변경합니다. 소유권 변경이 되지 않으면 웹 브라우저에서 접속했을 때 "403 Forbidden" 에러가 발생하므로 "403 Forbidden" 에러가 발생하면 소유권 권한을 먼저 확인해봐야 합니다.

sudo chown -R www-data: /var/www/mydomain.com

디렉토리 소유권 변경 결과
-----------------------
drwxr-xr-x  2 www-data www-data 4096 Mar 22 20:34 mydomain.com/

Nginx 사용자 계정은 /etc/nginx 디렉토리 안의 "nginx.conf" 파일 최상단에 정의되어 있습니다. 기본 사용 계정이 "www-data" 입니다.

소유권 변경 후 디렉토리에 index.html 파일을 생성하려고 하면 소유권 문제가 생기므로 먼저 index.html 파일을 생성하는 것이 좋습니다.

서버 블록 구성 파일 생성

이제 서버 블록 구성 파일을 만들어야 합니다.

앞서 간단하게 소개한대로 서버 블록을 위한 구성 파일은 "/etc/nginx/sites-available" 디렉토리 안에 생성합니다.

표준적인 네이밍 규칙이 있으므로 텍스트 편집기로 다음과 같은 파일 이름(mydomain.com)으로 설정 파일을 만듭니다. 우분투 내장 vi로 새 파일을 생성합니다.

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

Nginx 웹서버의 최소한의 구성 내용은 다음처럼 구성됩니다. 사용하는 도메인(mydomain.com)과 디렉토리 경로 부분만 수정하면 됩니다. 80포트를 통한 웹 서비스 구성 예이며 HTTPS 구성을 추가하려면 server {} 블록을 추가로 작성하고 "listen 443 ssl;"로 리스닝 포트를 변경하면 됩니다.

server {
    listen 80;

    server_name mydomain.com www.mydomain.com;

    root /var/www/mydomain.com;

    index index.html;

    access_log /var/log/nginx/mydomain.com.access.log;
    error_log /var/log/nginx/mydomain.com.error.log;
}

구성까지 완료되었지만 설정과 디렉토리가 연결되지 않았기 때문에 Nginx 웹서버는 http://mydomain.com으로 들어오는 트래픽을 식별하지 못합니다. 디렉토리 연결이 되지 않으면 http://mydomain.com으로 들어오는 트래픽도 모두 기본 구성 웹사이트로 향하게 됩니다.

심볼링 링크 생성

다음 커맨드를 사용해서 구성과 디렉토리가 연결되도록 ln 커맨드로 심볼릭 링크를 만듭니다.

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

링크가 성공적으로 만들어지면 /etc/nginx/sites-enabled 디렉토리에 다음처럼 "mydomain.com" 파일의 심볼릭 링크가 생깁니다. "default"를 Nginx 설치할 때 생성되는 기본 웹사이트를 위한 설정 파일입니다.

ubuntu@ubuntu:/etc/nginx/sites-enabled$ ll
total 8
drwxr-xr-x 2 root root 4096 Mar 23 03:00 ./
drwxr-xr-x 8 root root 4096 Mar 23 01:44 ../
lrwxrwxrwx 1 root root   34 Mar 23 01:44 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root   39 Mar 23 03:00 mydomain.com -> /etc/nginx/sites-available/mydomain.com

같은 방식으로 웹사이트 디렉토리와 설정 파일, 그리고 심볼릭 링크를 생성하면 여러 개의 웹 사이트를 하나의 Nginx 웹 서버에서 서비스할 수 있습니다.

Nginx 재시작

설정 파일에 오류가 없는지 확인하려면 다음 Nginx 설정 테스트 커맨드를 사용합니다. "syntax is ok" 라고 메시지가 나오면 설정 파일이 정상입니다.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

설정 파일에 오류가 없으면 Nginx 웹서버를 재시작해서 설정이 반영되도록 합니다.

sudo systemctl restart nginx

이제 웹 브라우저에서 http://mydomain.com 으로 접속하면 앞서 만든 index.html 페이지가 표시됩니다.