Linux 강좌 / Nginx 웹 서버 설치부터 HTTP·HTTPS 공개까지
Nginx 웹 서비스를 공개하려면 웹 서버 설치와 설정 검사뿐 아니라 올바른 파일 경로·대기 포트·방화벽·DNS·TLS 인증서가 함께 준비되어야 합니다. 먼저 로컬 HTTP로 페이지를 검증한 뒤 원격 연결과 도메인, 마지막으로 HTTPS를 단계별로 확인하세요.
접속 실패를 진단할 때는 네트워크 계층별 점검, 외부 공개 전에는 방화벽과 계정 보호를 함께 적용하세요. 패키지 저장소에 따라 Nginx·인증서 도구의 버전이 다르므로 설치된 버전과 해당 배포판의 안내를 기준으로 설정합니다.
시스템 설정 실습의 기준은 Ubuntu 26.04 LTS와 Rocky Linux 9 계열의 일반 설치 VM입니다. 컨테이너·WSL·다른 릴리스에서는 서비스와 패키지 구성이 다를 수 있습니다. 가상 머신 실습 환경 만들기에서 콘솔 복구와 버전 확인을 먼저 준비하세요.
준비할 서버·도메인·접속 조건
실습용 Ubuntu 또는 Rocky Linux 서버, sudo 계정과 콘솔 복구 수단이 필요합니다. linux-course.test는 로컬 시험용 이름이며 공개 DNS에 등록할 이름이 아닙니다. 공개 단계에서는 본인이 관리하는 실제 도메인으로 바꾸고, NAT 환경은 포트 전달·공유기의 외부 주소·통신사 제한도 확인합니다. 기존 80·443 포트를 다른 서비스가 쓰는지 먼저 조회합니다.
sudo ss -lntp
cat /etc/os-release
배포판에 맞게 Nginx 설치하기
아래 첫 블록은 Ubuntu, 둘째는 Rocky Linux용입니다. 제안된 패키지 변경을 확인한 뒤 설치하고 필요한 저장소 정책을 따릅니다. 기본 페이지가 있어도 다른 사이트 설정을 삭제하지 말고 별도 서버 블록을 추가합니다.
sudo apt update
sudo apt install nginx curl
sudo systemctl enable --now nginx
sudo dnf install nginx curl
sudo systemctl enable --now nginx
별도 문서 루트와 전체 설정 만들기
아래 두 경로에 기존 실습 자료가 있으면 먼저 백업하고 다른 이름을 선택합니다. 정적 HTML이므로 배포판 공통 경로 /var/www/linux-course에 읽기 가능한 파일을 둡니다. nginx.conf가 conf.d 아래 .conf 파일을 include하는 일반 패키지 구성을 전제로 하며, 다르면 실제 include 구조를 먼저 확인해야 합니다.
sudo install -d -m 755 /var/www/linux-course
printf '<!doctype html><html lang="en"><meta charset="utf-8"><title>Linux course</title><h1>Linux course server works</h1></html>\n' | sudo tee /var/www/linux-course/index.html
sudo chmod 644 /var/www/linux-course/index.html
sudo tee /etc/nginx/conf.d/linux-course.conf > /dev/null <<'EOF'
server {
listen 80;
server_name linux-course.test;
root /var/www/linux-course;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo nginx -t
본문의 h1은 웹 서버가 제공할 별도 실습 HTML의 제목이며 이 워드프레스 글의 제목 태그가 아닙니다. nginx -t가 성공한 경우에만 아래 reload를 실행합니다. 오류가 나면 메시지가 지목한 파일·줄을 고치고 다시 검사하며 기존 서비스가 동작하는 동안 잘못된 설정으로 재시작하지 마세요.
sudo systemctl reload nginx
curl -i --resolve linux-course.test:80:127.0.0.1 http://linux-course.test/
HTTP 200과 Linux course server works를 확인합니다. --resolve는 해당 요청에만 도메인과 주소 대응을 지정하므로 시스템 DNS를 바꾸지 않습니다. 기본 Nginx 페이지가 나오면 Host 이름과 server_name, 실제 로드한 설정을 확인하세요.
파일 권한·SELinux와 네트워크 공개 구분하기
Rocky Linux에서 SELinux가 활성화되어 있다면 ls -Zd /var/www/linux-course로 레이블을 확인하고 기본 정책 경로에는 sudo restorecon -Rv /var/www/linux-course를 적용할 수 있습니다. 별도 경로는 영구 레이블 정책이 필요할 수 있습니다. HTTP 403을 해결하려고 SELinux를 끄거나 전체 경로에 777 권한을 주지 마세요.
로컬 응답을 확인한 뒤 HTTP 80/tcp와 추후 HTTPS 443/tcp를 필요한 범위로 허용합니다. Ubuntu UFW에서는 sudo ufw allow 80/tcp처럼 규칙을 추가하며, firewalld는 실제 zone에 http·https 서비스를 runtime으로 시험한 뒤 해당 규칙만 permanent에 저장합니다. 클라우드 방화벽도 확인하고 SSH 허용은 유지합니다.
다른 컴퓨터에서 curl -H "Host: linux-course.test" http://실제서버주소/로 같은 페이지가 나오는지 확인합니다. 로컬 성공·원격 실패이면 바인딩·방화벽·라우팅·NAT를 조사하고, 403·404·502 같은 HTTP 응답이 오면 서버·경로·애플리케이션 층을 조사합니다.
실제 도메인과 HTTPS 적용하기
- 실제 도메인의 A·AAAA를 의도한 공개 주소에 연결합니다. 서버가 IPv6를 제공하지 않으면 잘못된 AAAA를 등록하지 않습니다.
- server_name을 실제 도메인으로 바꾸고 nginx -t 뒤 reload합니다. 다른 네트워크에서 도메인으로 HTTP 응답을 확인합니다.
- 공식 Certbot 설치 안내에서 운영체제·Nginx에 맞는 설치 방식을 선택합니다. Ubuntu 패키지 방식은 apt install certbot python3-certbot-nginx를 사용할 수 있으며 다른 배포판은 저장소 구성을 먼저 확인합니다.
- 80·443 접근과 소유 도메인을 확인한 뒤 sudo certbot --nginx -d 실제도메인으로 인증서 발급·설정을 진행합니다.
- HTTPS 인증서의 이름·체인·만료와 리디렉션을 확인하고 sudo certbot renew --dry-run으로 갱신 시험을 합니다.
HTTP 인증 방식이 막힌 환경은 DNS 인증 등 다른 지원 방식을 선택해야 합니다. 공개 DNS·인증서 조건이 없는 로컬 실습을 완료했다고 HTTPS 공개까지 완료했다고 판단하지 마세요. HTTP 시험 단계에서는 비밀번호·토큰 같은 민감한 정보를 전송하지 않습니다.
장애 확인과 실습 설정 복구하기
systemctl status nginx --no-pager
journalctl -b -u nginx -n 50 --no-pager
sudo nginx -t
문제를 확인할 때는 실제 error_log 경로와 요청 시각도 함께 봅니다. 실습을 제거하려면 만든 conf 파일만 백업 후 제거하고 nginx -t가 통과하면 reload합니다. 문서 루트·인증서·DNS·방화벽은 실제 사용 관계를 확인한 뒤 이번에 만든 항목만 정리합니다. 기존 사이트·공용 인증서·SSH 규칙을 일괄 삭제하지 않습니다.




