/etc/resolv.conf의 Nginx 리졸버 주소 수 /etc/resolv.conf있습니까? 예를 들어 docker

resolvernginx 프록시 구성에서 주소 를 설정할 수 /etc/resolv.conf있습니까?

예를 들어 docker 또는 virtualenvironment에서 유용 할 수 있습니다.



답변

불행히도 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 resolvconfnginx를 만들 수 있습니다 . 레 졸버의 동적 변경이 드문 경우에도 잘 작동합니다.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/binPATH 없이 실행될 수 있으므로 awk에 대한 절대 경로가 필요할 수 있습니다.


답변

nginx의 Openresty 버전을 사용 하는 경우 지시자에 특별한 local인수를 사용 resolver하면로 설정 될 때 local=on표준 경로가 /etc/resolv.conf해석기에서 사용됨을 의미합니다 (자세한 내용은 Openresty resolver docs 참조 ).

resolver local=on;


답변