
Nginx : 오픈 소스 웹 서버 소프트웨어다. 웹 서버, 리버스 프록시, 로드 밸런서, 메일 프록시 등 다양한 기능을 제공하는 고성능 서버이다.
나는 windows 환경에서 진행했다. Docker를 활용해 Nginx를 설치했다.
Docker와 관련된 설정이 다 되었다고 가정하고,
Nginx Docker 이미지를 다운로드 한다.
docker pull nginx
다운로드 된 이미지 확인
docker images
windows에서 Docker 이미지 설치 경로는 다음과 같았다. %USERPROFILE%\AppData\Local\Docker\wsl\disk\docker_data.vhdx
Nginx 컨테이너 실행
docker run --name my-nginx -d -p 80:80 nginx
docker run : 새 컨테이너를 생성하고 실행--name my-nginx : my-nginx로 컨테이너 이름 지정-d : 백그라운드 모드에서 실행-p 80:80 : 호스트 80번 포트를 컨테이너의 80번 포트에 매핑-P <호스트 포트>:<컨테이너 포트>컨테이너 목록 확인
docker ps
컨테이너 중지
docker stop <컨테이너 이름>
컨테이너 삭제
docker rm <컨테이너 이름>
프론트엔드 프로젝트에서 Nginx와 관련된 설정 파일을 만들고 백엔드와 연결 설정, Nginx 공식 이미지를 기반으로 정적 파일을 담아 Nginx 컨테이너를 생성하는 과정으로 진행. (백엔드만 Nginx를 통해서 배포할려면 백엔드 프로젝트에서 해당 과정 수행)
Nginx를 이용해 프론트 엔드(정적 파일)를 배포(서빙)하는 과정은 다음과 같다.
Backend는 다른 서버에서 배포가 되어있는 상태로 가정하고 진행.
프론트엔드 빌드 파일 준비
npm run build를 통해서 프로젝트를 빌드한다.Dockerfile 작성
# Nginx 공식 이미지를 기반으로 새 이미지 생성
FROM nginx
# 로컬에서 빌드한 결과물을 /usr/share/nginx/html 으로 복사합니다.
COPY ./dist /usr/share/nginx/html
# custom 설정파일을 컨테이너 내부로 복사합니다.
COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf
# 컨테이너의 80번 포트를 열어줍니다.
EXPOSE 80
# nginx 서버를 실행하고 백그라운드로 동작하도록 합니다.
CMD ["nginx", "-g", "daemon off;"]
프론트엔드 프로젝트에서 nginx.conf 작성(Nginx 설정 파일 작성)
프론트엔드 프로젝트의 루트경로에 nginx.conf 파일을 생성한 후, Nginx Container에 해당 파일을 복사(default.conf로)하는 방식으로 Nginx 설정을 관리할 것이다.
이렇게 설정을 하는 경우 Nginx 컨테이너에 직접 접근해 수정하는 번거로움을 줄일 수 있고, CI/CD에 용이하다.
server {
listen 80;
server_name localhost;
# 프론트엔드 정적 파일 제공
location / {
root /usr/share/nginx/html; # 프론트엔드 빌드 파일 경로
index index.html;
try_files $uri /index.html; # SPA 라우팅 지원
}
# 백엔드 API 요청 프록시
location /api {
proxy_pass http://<backend>:8080; # 백엔드 IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 에러 페이지 설정
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# Gzip 압축 설정 (선택 사항)
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 5;
gzip_vary on;
# SSL 설정 (Optional: HTTPS 적용 시 필요)
# server {
# listen 443 ssl;
# server_name your-domain.com;
# ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# location / {
# proxy_pass http://backend:8080;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# }
# }
}
docker-compose.yml 작성(Docker 이미지 빌드, Docker 컨테이너 실행)
docker build -t <도커계정이름>/<이미지이름> .)와 Docker 컨테이너 실행 단계(sudo docker run --name <사용할 컨테이너 이름> -d -p 80:80 <도커계정 이름>/<이미지 이름>)를 docker-compose.yml 파일을 작성해서 과정을 단순화시키고 효율적으로 관리할 수 있다. (docker build, docker run 명령어를 따로 수행하지 않고, docker-compose.yml에 작성 후 docker-compose 명령어로 한꺼번에 수행)version: "4" # Docker Compose 버전
services:
nginx: # 서비스 이름
image: nginx # 이미지 이름
container_name: my-nginx # Nginx 컨테이너 이름
ports:
- "80:80" # 외부에서 접근 가능한 HTTP 포트
volumes:
- ./dist:/usr/share/nginx/html # 정적 파일 디렉토리를 컨테이너 내부로 마운트
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf # Nginx 설정 파일 마운트
restart: "always" # 컨테이너 중지 시 자동 재시작
docker-compose를 통한 이미지 빌드 및 컨테이너 실행
docker-compose up -d
이미지 재빌드
docker-compose up -d --build
컨테이너 중지
docker-compose down
Docker Compose 목록 확인
docker-compose ps
이미지 다운로드 : docker pull <이미지명>
로컬 이미지 목록 확인 : docker images
이미지 삭제 : docker rmi <이미지명>
이미지 빌드 : docker build -t <이미지명> <Dockerfile 경로>
컨테이너 실행 : docker run [옵션] <이미지명>
--name : 컨테이너 이름 지정-d : 백그라운드 실행-p : 호스트와 컨테이너 간 포트 매핑-v : 호스트 디렉토리를 컨테이너에 마운트docker psdocker exec -it <컨테이너 이름> /bin/bashdocker stop <컨테이너 이름>docker start <컨테이너 이름>docker restart <컨테이너 이름>docker rm <컨테이너 이름>docker logs <컨테이너 이름>docker logs -f <컨테이너 이름>네트워크 목록 확인 : docker network ls
네트워크 정보 확인 : docker network inspect <네트워크 이름>
네트워크 생성 : docker network create <네트워크 이름>
컨테이너를 특정 네트워크에 연결 : docker network connect <네트워크 이름> <컨테이너 이름>
컨테이너를 네트워크에서 제거 : docker network disconnect <네트워크 이름> <컨테이너 이름>
네트워크 삭제 : docker network rm <네트워크 이름>
볼륨 목록 확인 : docker volume ls
볼륨 생성 : docker volumn create <볼륨 이름>
컨테이너 실행 시 볼륨 마운트 : docker run -d -v <볼륨 이름>:<컨테이너 경로> <이미지명>
볼륨 삭제 : docker volumn rm <볼륨 이름>
사용하지 않는 볼륨 삭제 : docker volumn prune
Docker Compose 목록 확인 : docker-compose ps
Docker Compose 실행 : docker-compose up
백그라운드에서 Docker Compose 실행 : docker-compose up -d
Docker Compose 종료 : docker-compose down
Docker Compose 특정 서비스만 실행 : docker-compose up <서비스 이름>