(트러블슈팅) standalone 배포시 hostname 적용 안되는 문제

standalone-1.png

MacOS에서 standalone 옵션을 적용하고 Docker 용량 차이

문제 상황

standalone을 적용하고 나서 배포하려 할 때 이미지 빌드까지는 완료되었으나 health-check가 실패하여 ECS 배포가 실패하는 문제가 있었음. 일단 health-check를 성공하게 설정해서 태스크를 배포해보니 502 Bad Gateway 에러가 발생

standalone-2.png

해결방법

ECS에서 로그를 확인하니 standalone을 사용할 때와 차이점이 존재했는데

standalone-3.png
(standalone을 사용했을 때)
standalone-4.png
(standalone을 사용하지 않았을 때) 기존의 next start를 이용하여 서버를 띄웠을 때

standalone을 사용할 때는 localhost가 아니라 내부 DNS 이름이 할당 되었다. 이는 server.js에서 아래와 같은 코드 때문인데


const path = require('path') 
const dir = path.join(__dirname) 

process.env.NODE_ENV = 'production' 
process.chdir(__dirname) 

const currentPort = parseInt(process.env.PORT, 10) || 3000 // 이쪽에서 ENV의 hostname을 참조한다.
const hostname = process.env.HOSTNAME || '0.0.0.0'

이때문에 nginx proxy가 잘못되어서 생간 문제가 아닐까 하는 생각에 ECS Container 내에 직접 접속해서 확인해보기로 함

$ aws ecs execute-command --cluster 클러스터명 --task arn:aws...(태스크id) --container 컨테이너명 --command "/bin/sh" --interactive

standalone-6.png

ENV 명령어를 찍어보니 HOSTNAME에 대한 ENV가 변경되지 않은것을 확인함. 그런데 분명 Dockerfile에서 아래와 같이 HOSTNAME을 바꾸어주었기 때문에 내부 DNS HOSTNAME으로 처리되는게 이상해서 구글링하던 중 아래 이슈를 발견했다.

ENV HOSTNAME="localhost"

https://github.com/vercel/next.js/issues/54093

standalone을 사용해서 배포할때 HOSTNAME이 ECS에 의해서 덮어쓰여진다는 것이다. 이를 해결하기 위해 태스크에서 변경해주거나 아래와 같이 Dockerfile을 변경해주니 올바르게 배포 되었다.

ENV HOSTNAME="0.0.0.0"