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
nameserver
mục từ/etc/resolv.conf
và in chúng thành một dòng, vì vậy bạn có thể sử dụng chúng vớiresolver
chỉ 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.template
trô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
envsubst
chương trình để tạonginx.conf
và 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/*.conf
trong 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/bin
trong 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 để resolver
chỉ thị khi được đặt thành local=on
, có nghĩa là đường dẫn tiêu chuẩn /etc/resolv.conf
sẽ đượ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
,grep
hoặctr
ở đó.