nginx.conf 에서 환경변수 사용
nginx.conf에서 환경변수를 사용하여 동적으로 nginx 설정을 변경하는 방법을 알아보자.
envsubst 사용하는 방법
envsubst
는 인풋으로부터 $VARIABLE
또는 ${VARIABLE}
로 되어있는 값을 읽어 환경변수로 바꾸어주는 프로그램이다. envsubst을 활용해서 nginx.template 파일로 환경변수가 사용된 nginx 설정파일을 작성하고, nginx가 실행될 때 envsubst를 사용해 변환해주면 된다.
step 1 : nginx.template 파일 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /home1/irteam/deploy/client/build;
index index.html index.htm;
location / {
try_files ${DOLLAR}uri ${DOLLAR}uri/ /index.html = 404;
}
location /api {
proxy_pass http://${SPRING_HOST_NAME}:${SPRING_HOST_PORT};
}
}
}
- 환경 변수가 들어갈 자리는
${}
로 감쌌다.${SPRING_HOST_NAME}
: 스프링 서버의 호스트 이름${SPRING_HOST_PORT}
: 스프링 서버의 포트번호${DOLLAR}
: envsubst을 사용하면$
로 시작하는 값은 전부 치환한다. 값이 존재하지 않을 경우 공백으로 변하므로,DOLLAR
환경변수를 새롭게 선언하여$
가 필요할 땐${DOLLAR}
로 사용하자.
step 2 : 실행 시 envsubst 사용
1
2
3
4
5
6
curl -L https://github.com/a8m/envsubst/releases/download/v1.2.0/envsubst-`uname -s`-`uname -m` -o envsubst # 1
chmod +x envsubst
export DOLLAR='$' # 2
export SPRING_HOST_NAME='localhost'
export SPRING_HOST_PORT="8080"
./envsubst '${SPRING_HOST_NAME} ${SPRING_HOST_PORT} ${DOLLAR}' < nginx.template > nginx.conf # 3
- envsubst가 없는 환경에서는 새로 설치한다.
- 환경변수를 설정하였다
- envsubst을 사용해
nginx.template
파일을nginx.conf
파일로 컴파일했다.
step 3 : 결과 확인
다음과 같이 nginx.conf 파일이 환경변수로 설정한 대로 나왔다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /home1/irteam/deploy/client/build;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html = 404;
}
location /api {
proxy_pass http://localhost:8080;
}
}
}
docker nginx 이미지 사용하는 방법.
만약 nginx를 도커 컨테이너에서 사용하고, 베이스 이미지가 nginx
라면, 더 쉬운 방법이 있다.
nginx 1.19 이미지부터는 envsubst
를 자동으로 지원한다. 다만 docker-compose와 함께 사용해야한다.
1
2
3
4
5
6
7
8
9
web:
image: nginx
volumes:
- ./templates:/etc/nginx/templates
ports:
- "8080:80"
environment:
- NGINX_HOST=foobar.com
- NGINX_PORT=80
출처
- https://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf