개요

CI/CD를 위해 여러 설정을 만져보면서 여러 자료들을 참고했다. GCP에서 5000번 포트를 열어서 서비스를 실행 하고 있었는데 보안적인 문제나 성능적인 문제도 신경쓰이고 웹서버에 빠지지않는 nginx도 추가해보고 싶어서 공부할 겸 간단한 설정과 함께 추가해보려했다.

 

구조를 고민하던 중 기존에 docker로 설정해두었고 추가로 production 환경을 구분하려고 해서 Nginx를 같이 컨테이너로 띄우는 것을 목표로 했다.

 

NGINX + Docker-compose

 

docker-compose.yml 파일은 다음과 같다.

version: '3.8'

networks:
  server-connection:
    driver: bridge
  db-connection:
    driver: bridge

services:
  nginx:
    container_name: nginx
    image: nginx
    restart: always
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - server-connection
    environment:
      - TZ=Asia/Seoul
    depends_on:
      - server
      - db

  server:
    container_name: clip-planet-server
    build:
      dockerfile: ./Dockerfile
    restart: always
    expose:
      - '5000'
    networks:
      - db-connection
      - server-connection
    depends_on:
      - db
    env_file:
      - .env
  db:
    image: mysql:8.0.30
    command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    container_name: mysql-container
    networks:
      - db-connection
    expose:
      - '3306'
    environment:
      MYSQL_DATABASE: ${DATABASE_NAME}
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_TCP_PORT: ${DATABASE_PORT}
      MYSQL_DATA_DIR: /var/lib/mysql

서비스에 nginx를 추가했다. 보안을 위해 기존에 db와 server 실행시키며 열어두었던 포트를 닫고 컨테이너 내부 포트를 활용할 수 있도록 expose 옵션으로 변경하였다.

여기까진 큰 문제는 없었다. 블로그 글과 NGINX conf파일도 모르는 부분은 공식문서를 참고하며 컨테이너를 잘 띄울 수 있었다.

 

docker로 nginx 설정하기(기본편)

도커로 nginx를 설정해주는 방법은 크게 2가지 단계로 볼 수 있다. 1. nginx의 설정파일인 /etc/nginx/nginx.conf 수정하기 2. docker-compose.yml 작성 후 up 하기 nginx.conf 작성 /etc/nginx/nginx.conf 는 위치와 파일명

middleearth.tistory.com

 

에러

"/usr/share/nginx/html/api/auth/google/login" failed (2: no such file or directory)

 

위 에러가 계속 발생했는데 local에서 80번 포트로 접근하면 nginx 기본 페이지가 잘 뜨는데 매핑해둔 api에 요청을 보내면 찾을 수 없다는 오류가 발생했다.

 

여기서 몇시간을 삽질헀는데 Nginx 옵션들을 전부 읽어보면서 대충 proxy_pass에 문제가 있을거라고 생각하며 계속해서 수정해봐도 해결되지 않았다. 그래서 문서랑 여러 자료들을 참고해서 간단하게 작성하였고 해결할 수 있었다.

 

worker_processes  auto;
events { worker_connections 1024; }
http {
  upstream app_server {
    server server:5000;
  }
  server {
    listen 80;
    server_name _;
    location / {
      proxy_pass http://app_server;
      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;
    }
  }
}

 

proxy 설정하기 위한 upstream과 proxy_pass, location 설정을 계속 읽어보다가 이건 NGINX만에 문제가 아니구나라는걸 느껴 컴포즈 + nginx 조합을 다시 찾아봤고 개인적으로 생각되는 문제는 다음과 같다

 

프록시를 위한 upstream을 설정하고자 할때 server: container_name:port가 아닌 services_name:port라고 생각한다.

header 옵션이 문제였을수도 있는데 아무래도 접근자체가 불가능했다보니 지정해주는 문제부터 에러가 발생했던 부분이라고 생각하고 저번에 docker-compose를 활용해 db를 연결할때도 같은 문제가 발생해서 아무래도 가능성이 높다고 생각했다.

upstream app_server {
	server server:5000;
}

해결

잘 연결됐다.

 

회고

공식문서랑 chatGPT가 최고다

복사했습니다!