답변:
불행히도 nginx는 자체 리졸버 구현을 사용하기 때문에 쉬운 방법은 없습니다. 내가 보는 두 가지 솔루션은 다음과 같습니다.
1) 스크립트에서 리졸버 목록을 생성하고 포함합니다 (예 :
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
2) (매우) 실험적인 perl 모듈 과 같은 타사 모듈로 nginx를 다시 컴파일 하고 변수 핸들러를 작성하십시오.
http {
perl_modules perl/lib;
perl_set $resolvers '
sub {
return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
};
resolver "$resolvers";
}
이제, 당신이 C 코더의 지옥이라면 (혈액을 위해 눈을 준비하십시오), 여전히 이런 방식으로 작동하도록 대체 패치 나 모듈을 작성할 수 있습니다.
Docker 사용자의 경우 해결책은 다음과 같습니다 .
Docker를 사용하는 사람들을위한 해결 방법은 다음과 같습니다.
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
이것이하는 일은 모든
nameserver
항목을 가져 와서/etc/resolv.conf
한 줄로 인쇄하는 것이므로 nginx의resolver
지시문 과 함께 사용할 수 있습니다 . Dockerfile에는 구성 파일을 생성 한 다음 nginx를 시작하는 진입 점에 대한 사용자 정의 스크립트가 있어야합니다.nginx.conf.template
다음과 같은 파일이 있다고 가정하겠습니다 .
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
그런 다음 시작 스크립트는
envsubst
프로그램을 사용nginx.conf
하여을 생성 한 다음 nginx를 시작할 수 있습니다. 예 :
#!/bin/bash
if [ "$NAMESERVER" == "" ]; then
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
fi
echo "Nameserver is: $NAMESERVER"
echo "Copying nginx config"
envsubst '$NAMESERVER' < /nginx.conf.template > /nginx.conf
echo "Using nginx config:"
cat /nginx.conf
echo "Starting nginx"
nginx -c /nginx.conf -g "daemon off;"
docker에서 이것은 기본적으로 docker 내장 DNS 서버와 동일한 파일을 생성하는 경향이 있습니다 . Docker Network Nginx Resolver에 대한 답변을127.0.0.11
참조하십시오 .
시스템이 resolvconf를 사용하는 경우 (많은 가상 머신이 있지만 불행히도 Docker는 그렇지 않습니다)를 참조하십시오 . 에서 다른 답변과 같이 man 8 resolvconf
nginx를 만들 수 있습니다 . 레 졸버의 동적 변경이 드문 경우에도 잘 작동합니다.resolvers.conf
/etc/resolvconf/update-libc.d/nginx
#!/bin/sh
conf="resolver $(/usr/bin/awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf);"
[ "$conf" = "resolver ;" ] && exit 0
confpath=/etc/nginx/conf.d/resolvers.conf
if [ ! -e $confpath ] || [ "$conf" != "$(cat $confpath)" ]
then
echo "$conf" > $confpath
service nginx reload >/dev/null
fi
exit 0
일부 Linux 배포판은 /etc/nginx/conf.d/*.conf
기본 구성에 포함 됩니다. 재로드는 일반적으로 서비스가 실행되고 있지 않을 때는 무시됩니다. 스크립트가 /usr/bin
PATH 없이 실행될 수 있으므로 awk에 대한 절대 경로가 필요할 수 있습니다.
nginx의 Openresty 버전을 사용 하는 경우 지시자에 특별한 local
인수를 사용 resolver
하면로 설정 될 때 local=on
표준 경로가 /etc/resolv.conf
해석기에서 사용됨을 의미합니다 (자세한 내용은 Openresty resolver docs 참조 ).
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. 필요 없음cat
,grep
또는tr
거기에있다.