개요
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파일도 모르는 부분은 공식문서를 참고하며 컨테이너를 잘 띄울 수 있었다.
에러
"/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가 최고다
'TIL > 트러블슈팅' 카테고리의 다른 글
프론트 백엔드간 배포시 쿠키 저장이 안됐던 이슈 (0) | 2023.03.16 |
---|---|
쿠키 저장 이슈를 통해 정리한 쿠키 옵션과 HTTPS로 리디렉션 (0) | 2023.03.14 |
next/router query 버그 / 리액트 합성 이벤트 (0) | 2023.03.04 |
Google Cloud Platform, docker-compose로 배포하면서 겪은 이슈 (0) | 2023.02.24 |
Google Cloud Platform 배포 삽질 (0) | 2023.02.21 |