문제
프로젝트에서 nginx 의 default.conf 파일을 아래와 같이 proxy_pass 부분에 실제 서비스 주소를 입력했었다.
server {
listen 80;
listen [::]:80;
server_name reuse.kro.kr;
location /api {
proxy_pass 실제 서비스 주소;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_redirect off;
}
}
실행은 당연히 잘 되었지만 github 으로 파일을 관리하고 싶어서 위 주소를 환경 변수로 만들고자 했다.
같은 경로에 'service_url_blue.inc' 라는 파일을 만들고
default.conf 부분에 include 해주었다.
default.conf
server {
listen 80;
listen [::]:80;
server_name reuse.kro.kr;
include $HOME/nginx/conf.d/service-url-blue.inc
location /api {
proxy_pass $service_url;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_redirect off;
}
}
service-url-blue.inc
set $service_url 실제 서비스 주소;
하지만 이렇게 설정해주니 에러가 떴는데
no resolver defined to resolve
resolver 에러가 뜨면서 웹에는 cors 에러가 떴다. (실제 서비스 주소와 포트 번호를 직접 주소창에 입력하고 접속하면 정상적으로 실행되긴 했다.)
구글링 해보니 역시 proxy_pass 문제
https://tilnote.io/pages/63bbd869c78a5bca41f7e9be
include 하는 방식으로 간접적으로 변수를 설정해주면 적용이 안되는 것 같았다.
nginx conf 파일에 환경 변수가 정상적으로 작동하는지 찾아봤지만 보통 같은 방법으로 하면 되지 않고
envsubst 이라는 명령어로 가능하다고 한다!
해결
우선
default.conf.template 파일을 생성하고
server {
listen 80;
listen [::]:80;
server_name reuse.kro.kr;
location /api {
proxy_pass ${SERVICE_URL};
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_redirect off;
}
}
환경변수로 지정하고 싶은 변수를 '${변수명}' 로 설정해준다.
nginx 를 reload 하기 전에 bash 쉘에서
export SERVICE_URL=실제 서비스 주소
를 쳐주고
envsubst "\$SERVICE_URL" < /저장/경로/default.conf.template > /저장/경로/default.conf
를 입력해주면
default.conf 파일에 SERVICE_URL 부분에 export 한 값이 들어가있는 상태로 새로 만들어진다.
그 후, 필자는 docker 로 nginx 를 실행시키고 있어서
docker-compose 부분에 해당 경로의 default.conf 파일을 volumes 로 마운트해주고 reload 를 시켜주니 적용이 되었다.
만약
envsubst < /저장/경로/default.conf.template > /저장/경로/default.conf
처럼 환경변수를 주입할 변수를 지정해주지 않으면
server {
listen 80;
listen [::]:80;
server_name reuse.kro.kr;
location /api {
proxy_pass 실제 서비스 주소;
proxy_set_header X-Forwarded-For ;
proxy_set_header Host ;
proxy_set_header X-Real_IP ;
proxy_redirect ;
}
}
이런 식으로 다른 $달린 변수들은 값이 아예 사라지게 되니 주의해야 한다.
참고
https://www.baeldung.com/linux/nginx-config-environment-variables