[Infra] Nginx 설정

[Infra] Nginx 설정

Nginx 란?

💡 오픈 소스 웹 서버 소프트웨어로, Apache와 같이 웹서버로 클라이언트 요청에 맞는 정적 파일을 응답해주는 Web Server 또는 요청을 다른 서버로 전달하는 리버스 프록시 역할을 수행

특징

  • 높은 성능: 비동기 처리 및 이벤트 기반 아키텍처로 인해 높은 동시 연결 처리 가능
  • 가벼움 및 저용량 리소스 사용: 메모리 사용이 적음
  • 리버스 프록시 지원: 클라이언트 요청을 여러 서버로 분산
  • 정적 파일 및 동적 콘텐츠 서빙: 정적 파일을 빠르게 서빙하며, 필요시 백엔드 서버로 부터 동적 콘텐츠를 가져옴
  • SSL/TLS 지원: 안전한 통신을 위해 SSL/TLS 프로토콜 지원(HTTP -> HTTPS)

Nginx 설치

  • nginx-proxy: Docker를 사용하여 nginx 리버스 프록시를 실행하는데 사용
  • letsencrypt: SSL 인증서 발급
  • 두 이미지를 받을 nginx frontend 서버가 필요
  • 단, 모두 같은 네트워크로 묶여야함
version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./docker_volumes/nginx/certs:/etc/nginx/certs:rw
      - ./docker_volumes/nginx/html:/usr/share/nginx/html:rw
      - ./docker_volumes/nginx/vhost.d:/etc/nginx/vhost.d:rw
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - infra
    environment:
      - TZ=Asia/Seoul

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    environment:
      - TZ=Asia/Seoul
      - NGINX_PROXY_CONTAINER=nginx-proxy
    depends_on:
      - nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./docker_volumes/nginx/certs:/etc/nginx/certs:rw
      - ./docker_volumes/nginx/vhost.d:/etc/nginx/vhost.d:rw
      - ./docker_volumes/nginx/html:/usr/share/nginx/html:rw
      - ./docker_volumes/acme.sh:/etc/acme.sh
    networks:
      - infra
volumes:
  certs:
    driver: local
    driver_opts:
      type: none
      device: $PWD/docker_volumes/nginx/certs
      o: bind
  vhostd:
    driver: local
    driver_opts:
      type: none
      device: $PWD/docker_volumes/nginx/vhost.d
      o: bind
  html:
    driver: local
    driver_opts:
      type: none
      device: $PWD/docker_volumes/nginx/html
      o: bind

FrontEnd

  • LETSENCRYPT_HOST에 URL을 넣으면 위의 letsecrypt 컨테이너가 SSL 인증서를 발급함
version: '3'

services:
  frontend:
    image: ss0510s/a303-frontend
    container_name: a303-frontend-dev
    networks:
      - infra
    ports:
    - "3000:80"
    environment:
      - VIRTUAL_HOST=${HOST}
      - LETSENCRYPT_HOST=${HOST}
      - LETSENCRYPT_EMAIL=${EMAIL}

networks:
  infra:
    external: true
  • 잘 발급받았는지 확인하려면 아래 명령어로 로그 확인
docker-container logs letsencrypt

 

Nginx 설정

  • 경로 ./docker_volumes/nginx/vhost.d/[인증서 받을 사이트]
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

location /api/ {
     proxy_pass http://{container이름}:{port번호};
     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;
}
  • 아래와 같은 명령어로 relaod 하면 설정이 반영됨
$ docker exec -it nginx-proxy nginx -s reload

 

'Infra' 카테고리의 다른 글

[Infra] Spring Boot Pipeline 구축  (0) 2024.05.25
[Infra] React Pipeline 구축  (0) 2024.05.25
[Infra] Docker-Compose 를 통한 DB 구축  (0) 2024.05.25
[Infra] Docker 설치  (0) 2024.05.25
[Infra] Jenkins - GitLab 연동  (0) 2024.05.25