Ubuntu 26.04 강좌 / Nginx 사이트 구성: sites-available과 sites-enabled
Ubuntu Nginx의 사이트 설정은 실제 include 구조를 확인한 뒤 sites-available의 구성 파일을 sites-enabled에서 활성화하는 방식으로 관리할 수 있습니다. 이 실습은 127.0.0.1:8080에 두 사이트를 구성해 외부 공개 없이 Host별 응답을 확인합니다.
여기서 외부 공개하지 않는 대상은 새 8080번 실습 사이트입니다. Ubuntu의 Nginx 설치는 기본 사이트를 시작할 수 있으므로 서버 전체가 루프백 전용이 되는 것은 아닙니다. 설치 전 UFW 강좌의 관리 접속 보존과 방화벽 범위를 확인하거나 외부와 분리된 전용 실습 VM에서 진행합니다.
설치와 기존 설정 확인하기
sudo apt update
sudo apt install nginx curl
sudo nginx -t
sudo nginx -T
sudo ss -lntp
전용 VM에서 진행하고 기존 웹 서버가 포트를 사용하면 강제로 종료하지 않습니다. nginx -T에서 실제 sites-enabled include와 기존 listen·server_name·기본 서버를 확인합니다. 전체 구성에는 민감한 주소나 인증 설정이 있을 수 있으므로 공개하지 않습니다.
Ubuntu Nginx 구성 안내는 기본 사이트와 server block·문서 루트의 관계를 설명합니다.
기본 80번 사이트의 노출도 확인하기
sudo ss -lntp
sudo ufw status verbose
ls -l /etc/nginx/sites-enabled
sudo nginx -T
0.0.0.0:80·[::]:80 같은 리스너는 127.0.0.1:8080과 다릅니다. UFW 비활성 또는 광범위한 80번 허용 환경에서는 기본 사이트에 다른 장치가 접근할 수 있습니다. 서버 내부와 실제 허용·제외 클라이언트의 새 연결을 나누어 확인합니다.
새 전용 VM에서 패키지 기본 사이트가 필요 없다면 아래 블록으로 그 심볼릭 링크만 보관 후 비활성화할 수 있습니다. 기존 운영 사이트에는 적용하지 않습니다. 예상 링크·대상 또는 검사·백업이 다르거나 실패하면 중단합니다.
(
set -eu
link=/etc/nginx/sites-enabled/default
if [ ! -L "$link" ] || [ "$(readlink -f "$link")" != /etc/nginx/sites-available/default ]; then
printf 'Not the expected package-default symlink; inspect manually.\n' >&2
exit 1
fi
backup_dir=$(sudo mktemp -d /root/nginx-default-link.XXXXXX)
sudo cp -a "$link" "$backup_dir/default"
printf 'Preserved link: %s/default\n' "$backup_dir"
sudo rm -- "$link"
sudo nginx -t
sudo systemctl reload nginx
sudo ss -lntp
)
원본 sites-available/default는 남깁니다. 80번이 남으면 다른 사이트·프로세스를 조사합니다. 복원은 기록한 백업의 링크를 사용하되 같은 이름에 이후 변경이 없는지 확인하고 원래 위치로 돌린 뒤 nginx -t 성공 후 reload합니다. 다른 관리자의 변경을 덮어쓰지 않습니다.
Ubuntu의 Nginx 설치 안내에서 패키지 도입과 서비스 시작을 확인할 수 있습니다.
서로 다른 문서 루트 준비하기
아래 이름의 폴더와 설정 파일이 이미 있다면 내용을 보존하고 실습용 이름을 새로 정합니다. 전용 빈 경로에서 다음과 같이 서로 다른 응답을 만듭니다. 웹 서버 사용자가 읽을 수 있어야 하지만 모든 사용자에게 쓰기 권한을 줄 필요는 없습니다.
sudo install -d -m 0755 /srv/ubuntu-course-alpha /srv/ubuntu-course-beta
printf '%s\n' 'alpha-site' | sudo tee /srv/ubuntu-course-alpha/index.html
printf '%s\n' 'beta-site' | sudo tee /srv/ubuntu-course-beta/index.html
한 구성 파일에 완전한 로컬 사이트 정의하기
/etc/nginx/sites-available/ubuntu-course-lab라는 새 파일에 다음 전체 구성을 저장합니다. alpha.example.test와 beta.example.test는 문서·로컬 시험용 이름이며 실제 DNS 등록이나 HTTPS 인증 대상이 아닙니다. 기존 80번 기본 사이트는 이 8080번 실습과 별도로 유지합니다.
server {
listen 127.0.0.1:8080 default_server;
server_name _;
return 404;
}
server {
listen 127.0.0.1:8080;
server_name alpha.example.test;
root /srv/ubuntu-course-alpha;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 127.0.0.1:8080;
server_name beta.example.test;
root /srv/ubuntu-course-beta;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
첫 블록은 같은 주소·포트에서 알려지지 않은 Host를 404로 처리합니다. server_name의 밑줄 자체가 특별한 거부 기능인 것은 아니고 default_server가 기본 요청을 받도록 한 구성입니다. 동일 주소·포트에 기본 서버를 중복 지정하지 않습니다.
활성화 후 구문 검사와 reload
(
set -eu
sudo ln -s /etc/nginx/sites-available/ubuntu-course-lab /etc/nginx/sites-enabled/ubuntu-course-lab
sudo nginx -t
sudo systemctl reload nginx
)
심볼릭 링크가 이미 있으면 덮어쓰지 말고 대상부터 확인합니다. nginx -t가 실패하면 reload하지 않고 파일·줄·포트 충돌을 수정합니다. 구문 검사 성공은 실제 파일 권한이나 올바른 Host 응답까지 보장하지 않습니다.
이름·경로·기본 응답을 각각 시험하기
curl --fail --show-error --resolve alpha.example.test:8080:127.0.0.1 http://alpha.example.test:8080/
curl --fail --show-error --resolve beta.example.test:8080:127.0.0.1 http://beta.example.test:8080/
curl -i -H "Host: unknown.example.test" http://127.0.0.1:8080/
첫 두 요청은 각각 alpha-site·beta-site를, 마지막 요청은 404를 기대합니다. --resolve는 이 요청의 이름과 접속 주소만 지정하며 시스템 DNS를 바꾸지 않습니다. 서버 응답이 다르면 include·중복 server_name·요청 포트·문서 루트와 로그를 대조합니다.
실습을 비활성화하려면 이번 sites-enabled 링크만 제거한 뒤 nginx -t를 통과하면 reload합니다. 기존 사이트나 원본 파일을 함께 삭제하지 않습니다. 실제 인터넷 공개는 도메인·주소·방화벽·HTTPS·로그 정책을 별도로 준비한 후 진행해야 합니다.




