Nginx 서버 환경 구축

Jihu Kim·2025년 1월 11일
post-thumbnail

Nginx

Nginx : 오픈 소스 웹 서버 소프트웨어다. 웹 서버, 리버스 프록시, 로드 밸런서, 메일 프록시 등 다양한 기능을 제공하는 고성능 서버이다.

Nginx 활용 예시

  • 정적 웹사이트 제공 : HTML, CSS, JavaScript 파일을 클라이언트에 제공.
  • 백엔드 API 프록시 : 클라이언트가 /api로 요청을 보내면, Nginx가 이를 백엔드로 전달.
  • HTTPS 적용 : SSL/TLS 인증서를 설정하여 보안 연결 제공.
  • 로드 밸런서 : 트래픽을 여러 백엔드 서버에 분산.
  • Docker 및 Kubernetes 연계 : 컨테이너화된 서비스와의 통합에 활용.

Nginx 서버 환경 구축

로컬에서 Docker 활용해 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 <호스트 포트>:<컨테이너 포트>
      • 웹 서버(Nginx)는 기본적으로 80번 포트 사용
      • 80번 포트는 HTTP 프로토콜의 기본 포트
      • 만약 호스트 포트를 8080으로 했을 경우, 클라이언트는 8080 포트로 요청을 보내야만 함
  • 컨테이너 목록 확인

    docker ps
  • 컨테이너 중지

    docker stop <컨테이너 이름>
  • 컨테이너 삭제

    docker rm <컨테이너 이름>

Nginx를 이용한 배포

프론트엔드 프로젝트에서 Nginx와 관련된 설정 파일을 만들고 백엔드와 연결 설정, Nginx 공식 이미지를 기반으로 정적 파일을 담아 Nginx 컨테이너를 생성하는 과정으로 진행. (백엔드만 Nginx를 통해서 배포할려면 백엔드 프로젝트에서 해당 과정 수행)

Nginx를 이용해 프론트 엔드(정적 파일)를 배포(서빙)하는 과정은 다음과 같다.
Backend는 다른 서버에서 배포가 되어있는 상태로 가정하고 진행.

  1. 프론트엔드 빌드 파일 준비
  2. Dockerfile 작성(docker-compose.yml에서 Dockerfile을 사용하지 않으면 생략해도 됨)
  3. Nginx 설정 파일 작성
  4. docker-compose.yml 작성(Docker 이미지 빌드, Docker 컨테이너 실행)
  5. 브라우저에서 확인
  • 프론트엔드 빌드 파일 준비

    • npm run build를 통해서 프로젝트를 빌드한다.
  • Dockerfile 작성

    • docker-compose.yml에서 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 이미지 빌드(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

EC2로 배포할 때 Nginx 서버 환경 구축

  • AWS EC2를 통해서 배포한다고 하면 EC2에서 Docker를 설치한 뒤, Nginx를 설치하고 위와 같은 과정으로 환경 구축을 진행한다.
    • EC2 인스턴스를 프리티어로 생성했어도 여러개의 리전에서 생성을 하면 비용이 청구 될 수 있으며, 탄력적 IP를 할당하지 않으면 비용이 청구된다는 점 유의하자.
    • 프리티어는 AWS 계정 생성 후 12개월 동안만 적용이 가능하다.

Docker 필수 명령

이미지 관리

이미지 다운로드 : docker pull <이미지명>
로컬 이미지 목록 확인 : docker images
이미지 삭제 : docker rmi <이미지명>
이미지 빌드 : docker build -t <이미지명> <Dockerfile 경로>

컨테이너 관리

컨테이너 실행 : docker run [옵션] <이미지명>

  • 옵션 :
    - --name : 컨테이너 이름 지정
    - -d : 백그라운드 실행
    - -p : 호스트와 컨테이너 간 포트 매핑
    - -v : 호스트 디렉토리를 컨테이너에 마운트
    컨테이너 목록 확인 : docker ps
    컨테이너 접속 : docker exec -it <컨테이너 이름> /bin/bash
    컨테이너 중지 : docker 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 목록 확인 : docker-compose ps
Docker Compose 실행 : docker-compose up
백그라운드에서 Docker Compose 실행 : docker-compose up -d
Docker Compose 종료 : docker-compose down
Docker Compose 특정 서비스만 실행 : docker-compose up <서비스 이름>


profile
Jihukimme

0개의 댓글