[ CrossOverflow에 대해 sysadmin과 같은 것으로 간주 되어 https://stackoverflow.com/questions/21933955 에서 교차 게시 및 편집되었습니다 .]
Nginx를 실행하는 도커 컨테이너가 있는데 다른 도커 컨테이너에 연결됩니다. 두 번째 컨테이너의 호스트 이름과 IP 주소는 시작할 때 환경 변수로 Nginx 컨테이너에로드되지만 그 이전에는 알 수 없습니다 (동적). nginx.conf
이 값을 사용 하고 싶습니다. 예 :
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
시작할 때 환경 변수를 Nginx 구성으로 가져 오려면 어떻게해야합니까?
편집 1
아래의 제안 된 답변 후 전체 파일입니다.
env APP_WEB_1_PORT_5000_TCP_ADDR;
# Nginx host configuration for django_app
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_pass http://gunicorn;
}
}
nginx를 다시로드하면 오류가 발생합니다.
$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1
편집 2 : 자세한 내용
현재 환경 변수
root@87ede56e0b11:/# env | grep APP_WEB_1
APP_WEB_1_NAME=/furious_turing/app_web_1
APP_WEB_1_PORT=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP_PROTO=tcp
APP_WEB_1_PORT_5000_TCP_PORT=5000
APP_WEB_1_PORT_5000_TCP_ADDR=172.17.0.63
루트 nginx.conf :
root@87ede56e0b11:/# head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;
사이트 nginx 구성 :
root@87ede56e0b11:/# head /etc/nginx/sites-available/default
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
nginx 구성을 다시로드하십시오.
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
답변
에서 공식 Nginx에 고정 표시기 파일 :
nginx 구성에서 환경 변수 사용 :
기본적으로 Nginx는 대부분의 구성 블록 내에서 환경 변수 사용을 지원하지 않습니다.
그러나
envsubst
nginx가 시작되기 전에 nginx 구성을 동적으로 생성해야하는 경우 임시 해결책으로 사용될 수 있습니다.docker-compose.yml을 사용하는 예는 다음과 같습니다.
image: nginx
volumes:
- ./mysite.template:/etc/nginx/conf.d/mysite.template
ports:
- "8080:80"
environment:
- NGINX_HOST=foobar.com
- NGINX_PORT=80
command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
mysite.template 파일은 다음과 같은 변수 참조를 포함 할 수 있습니다.
listen ${NGINX_PORT};
최신 정보:
그러나 이것이 Nginx 변수로 인해 다음과 같이 발생한다는 것을 알고 있습니다.
proxy_set_header X-Forwarded-Host $host;
손상 :
proxy_set_header X-Forwarded-Host ;
그래서 그것을 막기 위해이 트릭을 사용합니다.
docker-compose
파일에서 Nginx 서버의 명령 옵션으로 사용되는 Nginx를 실행하는 스크립트가 있습니다 run_nginx.sh
.
#!/usr/bin/env bash
export DOLLAR='$'
envsubst < nginx.conf.template > /etc/nginx/nginx.conf
nginx -g "daemon off;"
그리고 스크립트에 새로운 DOLLAR
변수 가 정의 run_nginx.sh
되었으므로 이제 nginx.conf.template
Nginx 자체 변수에 대한 파일 내용 은 다음과 같습니다.
proxy_set_header X-Forwarded-Host ${DOLLAR}host;
그리고 정의 된 변수는 다음과 같습니다.
server_name ${WEB_DOMAIN} www.${WEB_DOMAIN};
또한 여기 에는 실제 사용 사례가 있습니다.
답변
루아와 함께하는 것이 소리보다 훨씬 쉽습니다.
server {
set_by_lua $server_name 'return os.getenv("NGINX_SERVERNAME")';
}
나는 그것을 여기에서 발견했다.
https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html
편집하다:
분명히 이것은 lua 모듈을 설치해야합니다 : https://github.com/openresty/lua-nginx-module
편집 2 :
이 접근법을 사용하면 env
Nginx에서 변수 를 정의해야합니다 .
env ENVIRONMENT_VARIABLE_NAME
최상위 컨텍스트에서이 작업을 수행해야합니다. 그렇지 nginx.conf
않으면 작동하지 않습니다! 아니 서버 블록 또는 일부 사이트의 설정에서 /etc/nginx/sites-available
이으로 포함되어 있기 때문에, nginx.conf
에 http
(아닌 최상위 상황) 상황.
또한이 방법을 사용하면 리디렉션을 시도하면 다음과 같습니다.
server {
listen 80;
server_name $server_name;
return 301 https://$server_name$request_uri;
}
그것은 잘 작동하지 않습니다 :
2016/08/30 14:49:35 [emerg] 1#0: the duplicate "server_name" variable in /etc/nginx/sites-enabled/default:8
그리고 별도의 변수 이름을 지정하면 :
set_by_lua $server_name_from_env 'return os.getenv("NGINX_SERVERNAME")';
server {
listen 80;
server_name $server_name_from_env;
return 301 https://$server_name$request_uri;
}
nginx는이를 해석하지 않고로 리디렉션합니다 https://%24server_name_from_env/
.
답변
도움이되거나 도움이되지 않을 수있는 것을 썼습니다 : https://github.com/yawn/envplate
환경 변수에 대한 $ {key} 참조를 사용하여 구성 파일을 인라인 편집하여 선택적으로 백업을 작성하고 수행하는 작업을 로깅합니다. Go로 작성되었으며 Linux 및 MacOS의 릴리스 탭에서 정적 바이너리를 간단히 다운로드 할 수 있습니다.
또한 exec () 프로세스, 대체 기본값, 로그 및 합리적인 의미 체계가 있습니다.
답변
공식의 nginx 이미지 사용을 권장envsubst
하지만, 다른 사람에 의해 지적 또한 대체합니다 $host
및 바람직하지 않다 다른 변수. 그러나 다행히 변수 이름을 대체 할 매개 변수로envsubst
사용할 수 있습니다 .
컨테이너에 대한 매우 복잡한 명령 매개 변수를 피하려면 (연결된 예에서와 같이) 명령을 실행하기 전에 환경 변수를 채우는 Docker 진입 점 스크립트를 작성할 수 있습니다. 진입 점 스크립트는 매개 변수를 확인하고 기본값을 설정하는 데에도 적합합니다.
여기 취하는 Nginx의 용기의 예 API_HOST
와 API_PORT
환경 변수로 매개 변수.
nginx-default.conf.template
resolver 127.0.0.11 valid=10s; # recover from the backend's IP changing
server {
listen 80;
location / {
root /usr/share/nginx/html;
}
location /api {
proxy_pass http://${API_HOST}:${API_PORT};
proxy_set_header Host $http_host;
}
}
docker-entrypoint.sh
#!/usr/bin/env sh
set -eu
envsubst '${API_HOST} ${API_PORT}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf
exec "$@"
도커 파일
FROM nginx:1.15-alpine
COPY nginx-default.conf.template /etc/nginx/conf.d/default.conf.template
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
답변
내가 한 것은 erb 를 사용하는 것이었다 !
cat nginx.conf | grep -i error_log
error_log <%= ENV["APP_ROOT"] %>/nginx/logs/error.log;
–erb를 사용한 후
export APP_ROOT=/tmp
erb nginx.conf | grep -i error_log
error_log /tmp/nginx/logs/error.log;
Cloudfoundry staticfile-buildpack 에서 사용됩니다.
샘플 nginx 구성 : https://github.com/cloudfoundry/staticfile-buildpack/blob/master/conf/nginx.conf
당신의 경우
head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
지다
head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env <%= ENV["APP_WEB_1_PORT_5000_TCP_ADDR"] %>
upstream gunicorn {
server <%= ENV["APP_HOST_NAME"] %>:<%= ENV["APP_HOST_PORT"] %>
}
#After applying erb
export APP_WEB_1_PORT_5000_TCP_ADDR=12.12.12.12
export APP_HOST_NAME=test
export APP_HOST_PORT=7089
erb /etc/nginx/nginx.conf
head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env 12.12.12.12
upstream gunicorn {
server test: 7089
}
답변
erb 사용에 대한 답변을 참조하면 다음과 같이 할 수 있습니다.
NGINX 구성 파일을 환경 변수가 포함 된 erb 파일로 작성하고 erb 명령을 사용하여 일반 구성 파일로 평가하십시오.
erb nginx.conf.erb > nginx.conf
nginx.conf.erb 파일의 서버 블록 안에는
listen <%= ENV["PORT"] %>;
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만 누군가 내가 이것에 걸려 넘어지는 경우를 대비하여 훨씬 더 좋은 방법이 있습니다. docker는 / etc / hosts에 연결된 컨테이너의 별칭을 삽입하기 때문에 할 수 있습니다.
upstream upstream_name {
server docker_link_alias;
}
docker 명령을 가정하면과 같습니다 docker run --link othercontainer:docker_link_alias nginx_container
.