Địa chỉ trình phân giải Nginx từ /etc/resolv.conf


18

Có thể đặt resolverđịa chỉ trong cấu hình proxy nginx từ /etc/resolv.conf?

Nó có thể hữu ích ví dụ trong docker hoặc trong môi trường ảo.

Câu trả lời:


16

Thật không may, không có cách nào dễ dàng để làm điều này bởi vì nginx sử dụng triển khai trình giải quyết riêng của nó. Hai giải pháp tôi thấy là:

1) Bạn tạo danh sách trình phân giải từ tập lệnh và bao gồm nó, ví dụ:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2) Bạn biên dịch lại nginx với một mô-đun bên thứ ba như mô-đun perl thử nghiệm (rất) và viết một trình xử lý biến:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

Bây giờ, nếu bạn là một địa ngục của một lập trình viên C (chuẩn bị tinh thần cho một chút máu), bạn vẫn có thể viết một bản vá hoặc mô-đun thay thế để làm cho nó hoạt động theo cách này.


6

Đối với người dùng Docker, giải pháp được tìm thấy ở đây :

Đây là một cách giải quyết cho những người sử dụng Docker.

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

Những gì nó làm là lấy tất cả các nameservermục từ /etc/resolv.confvà in chúng thành một dòng, vì vậy bạn có thể sử dụng chúng với resolverchỉ thị của nginx . Dockerfile của bạn sẽ cần phải có một tập lệnh tùy chỉnh cho điểm truy cập tạo tệp cấu hình và sau đó bắt đầu nginx. Hãy nói rằng bạn có một tệp được gọi nginx.conf.templatetrông giống như:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Tập lệnh khởi động của bạn sau đó có thể sử dụng envsubstchương trình để tạo nginx.confvà sau đó bắt đầu nginx. ví dụ:

#!/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;"

LƯU Ý rằng trong docker, điều này có xu hướng dẫn đến cùng một tệp, vì theo mặc định, máy chủ DNS nhúng docker là 127.0.0.11, hãy xem câu trả lời này cho Docker Network Nginx Resolver .


2
Awk, tìm hiểu nó, nó là một công cụ tuyệt vời để munging văn bản : export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Không cần cat, grephoặc trở đó.
j0057

điều này không hoạt động trên Kubernetes mặc dù.
Kim

1

Nếu hệ thống của bạn sử dụng độ phân giải (như nhiều máy ảo thực hiện, nhưng tiếc là Docker không có, xem man 8 resolvconf), bạn có thể tạo nginx resolvers.conf(như trong câu trả lời khác) trong /etc/resolvconf/update-libc.d/nginx. Điều này hành xử độc đáo ngay cả trong trường hợp hiếm hoi của sự thay đổi năng động của bộ giải.

#!/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

Một số bản phân phối linux bao gồm /etc/nginx/conf.d/*.conftrong cấu hình mặc định của chúng. Tải lại thường bị bỏ qua khi dịch vụ không chạy. Lưu ý rằng tập lệnh có thể được chạy mà không có /usr/bintrong PATH, vì vậy bạn có thể cần đường dẫn tuyệt đối để awk.


1

Nếu bạn đang sử dụng phiên bản nginx của Openresty thì bạn có thể sử dụng localđối số đặc biệt của chúng để resolverchỉ thị khi được đặt thành local=on, có nghĩa là đường dẫn tiêu chuẩn /etc/resolv.confsẽ được sử dụng bởi trình phân giải (để biết thêm chi tiết, xem tài liệu trình giải quyết Openresty ):

resolver local=on;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.