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ó 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:
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.
Đố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ớiresolverchỉ 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ọinginx.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ạonginx.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 .
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.
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;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Không cầncat,grephoặctrở đó.