[Docker] Docker3 - Nginx 설치
Nginx 웹 서버란?
Nginx(엔진엑스)는 고성능 HTTP 웹 서버이자 리버스 프록시 서버, 로드 밸런서, 이메일 프록시 서버(IMAP/POP3)로도 사용되는 오픈 소스 소프트웨어이다.
1. 웹서버(Web Server)로서의 역할
- 사용자의 HTTP 요청(예: 웹사이트 접속 요청)을 받아서, 정적인 콘텐츠(HTML, CSS, 이미지 등)를 전달한다.
- 클라이언트-서버 구조에서 클라이언트(브라우저)에게 웹 페이지를 보여주는 역할을 한다.
2. 주요 특징
- 높은 성능 : 비동기(Event-driven) 방식으로 동작하여, 동시에 많은 연결을 효율적으로 처리할 수 있다.
- 경량화 : 적은 메모리와 CPU 자원으로도 빠르게 동작한다.
- 리버스 프록시 지원 : 다른 서버로 요청을 전달하고 응답을 받아오는 중간 서버 역할을 할 수 있다.
- 로드 밸런싱 기능 : 여러 서버에 요청을 분산시켜 성능을 높이고 안정성을 유지할 수 있다.
- 정적 콘텐츠 서빙 : HTML, CSS, JS, 이미지 파일 등을 빠르게 전달하는 데 최적화되어 있다.
3. 주 사용
- 정적 웹 페이지 배포
- 백엔드 서버 앞단에서 요청 분산(리버스 프록시 + 로드 밸런서)
- 도커나 클라우드 환경에서 웹 애플리케이션의 프론트 역할로 사용
1. Ubuntu에 직접 설치
$ sudo apt update
$ sudo apt install nginx
$ sudo systemctl start nginx
$ sudo systemctl start enable nginx
설치 후 LocalHost로 테스트
기본 인덱스 파일 수정 및 테스트
Nginx의 기본 웹 페이지(default index file)은 보통 /var/www/html 디렉토리 안에 존재한다. ~/html 디렉토리 안에 index.nginx-debian.html 파일을 nano 명령어로 수정해준다. 간단하게 “Welcome!”만 적어보겠다.
<h1>Welcome!!</h1>
수정 후 다시 웹페이지에 127.0.0.1 주소를 넣어보면 변경된 것을 볼 수 있다.
2. Docker + Ubuntu 컨테이너에서 설치
Docker2에서 실습한 명령어에서 -p 커맨드를 추가해서 실행한다. -p 옵션은 호스트의 포트 8000을 컨테이너의 포트 80에 매핑하는 것이다. 앞에 8000은 호스트(내 PC)의 포트번호이다. 현재는 ubuntu를 의미한다. 80은 컨테이너 내부의 포트 번호를 의미한다. 즉, 내 컴퓨터(호스트)의 8000번 포트로 들어오는 요청을 컨테이너의 80번 포트로 전달해라라는 의미이다.
http://localhost:8000 접속 -> 컨테이너의 80번 포트로 전달됨 -> 웹 페이지 응답이 옴
$ docker run -it -p 8000:80 ubuntu bash
위 우분투에서 nginx 설치와 동일하게 apt update 이후 nginx를 설치해준다.
우분투 컨테이너에서는 systemctl 대신에 service 커맨드를 사용한다. 아래 키워드로 ubuntu 컨테이너 위에 nginx의 상태를 확인해 본다.
nginx를 가동시키고 상태를 확인한다.
# service nginx start
# service nginx status
아래는 ifconfig 커맨드 사용을 위해 설치한다.(net-tools)
curl은 nginx가 제대로 작동하는지 테스트하는 용도이다. 브라우저 대신 curl 명령어를 사용하여 서버의 응답 상태와 내용을 터미널에서 직접 확인이 가능핟.
curl을 이용해서 서버의 응답 상태와 내용을 확인해 본다.
웹 서버가 정상적으로 응답함을 알 수 있다.
이제 기본 웹 페이지 파일을 수정을 해본다. 기본 웹 페이지 파일의 위치는 /var/www/html에 위치한다.
nano 명령어가 없으므로, cat을 이용해서 아래 처럼 수정을 해준다. (저장 및 나가기 단축키는 Ctrl + D이다.)
다시 브라우저를 통해(http://127.0.0.1:8000/) 테스트를 해보면 정상적으로 웹 페이지 글이 변경된 것을 확인할 수 있다.
이 전에 우분투에서 nginx를 직접 설치한 웹페이지와 다른 것을 확인 가능하다.
3. Docker + Nginx 이미지 직접 사용
Docker Hub에는 공식 nginx 이미지가 존재하므로, 다음 명령어를 통해 이미지 다운로드(pull)와 컨테이너 실행(run)을 한 번에 수행할 수 있다.
$ docker run -d -p 9000:90 nginx
-d 옵션은 detach 모드로 실행한다는 의미이다. 즉 백그라운드에서 컨테이너가 실행되며 터미널을 점유하지 않는다는 의미이다.
브라우저 테스트 시 Nginx의 기본 웹 페이지가 정상적으로 뜨는 것을 확인할 수 있다.
현재 실행 중인 컨테이너를 확인해보면 nginx 컨테이너가 따로 표시되는 것을 확인할 수 있다.
Nginx의 기본 인덱스 파일은 보통 다음 경로에 위치한다.
/usr/share/nginx/html/index.html
기본 페이지를 사용자 정의 페이지로 바꾸기 위해 다음과 같은 작업을 수행한다. index.html 파일 내용을 수정 후 Ctrl + D로 저장하고 나온다.
웹 브라우저에서 다시 127.0.0.1:9000에 접속하면 아래와 같이 직접 작성한 문구가 포함된 새 페이지가 성공적으로 출력된다.
Nginx 실행 비교
Alpine Linux
Alpine Linux는 초경량 리눅스 배포판으로 기본 이미지 크기가 약 5MB정도 된다. 보안 강화 및 단순화된 구조이며 apk 패키지 매니저를 사용한다.
$ docker run -it alpine
$ apk update
$ apk add nginx
Alpine Linux의 장점
- 경량화 : 이미지 크기가 작아서 CI/CD 빠름
- 빠른 부팅 : 컨테이너 실행 속도 빠름
- 보안성 : 최소한의 패티지로 공격 표면 감소
- 실무 인기 : 특히 마이크로서비스나 서버리스 환경에 적합하다.
Alpine Lunux의 단점
- 호환성 문제 : glibc 대신 musl 사용 -> 일부 패키지 호환성 이슈 발생 가능
- 학습 곡선 : 익숙하지 않은 사용자에게는 apk 환경과 설정 방식이 다소 낯설 수 있음
- 디버깅 어려움 : 최소한의 툴만 존재 -> 문제 발생 시 분석이 어렵다.
뭐가 더 효율적인가?
- 개발 환경이라면, Ubuntu 설치 또는 Ubuntu 컨테이너 사용이 유연하다.
- 배포 환경이나 CI/CD 파이프라인에서는 Alpine 기반 이미지가 성능, 보안, 효율 면에서 탁월하다.
- 빠른 테스트가 목적이라면 공식 Nginx 이미지 사용이 가장 적절하다.
실습 문제
Alpine 기반의 Nginx 컨테이너와 httpd(Apache2) 컨테이너를 각각 생성하여, 다음 조건을 만족하는 실습 환경을 구성하세요.
1. Nginx 컨테이너와 httpd(Apache2) 컨테이너를 Alpine Linux 기반으로 각각 생성한다.
2. 두 컨테이너는 동시에 실행되어야 한다.
3. 각 컨테이너의 웹 루트 디렉토리에 본인만의 웹 페이지(index.html)를 작성하여 넣는다. : 각 웹 페이지에는 컨테이너 종류를 구분할 수 있는 텍스트가 포함되어 있어야 한다.
4. 브라우저 또는 curl 명령어를 통해 각 컨테이너의 웹 페이지가 정상적으로 표시되는지 확인한다.