ที่อยู่ตัวแก้ไข Nginx จาก /etc/resolv.conf


18

มันเป็นไปได้ที่จะตั้งค่าresolverที่อยู่ในการกำหนดค่าพร็อกซี Nginx จาก/etc/resolv.conf?

มันอาจมีประโยชน์เช่นในนักเทียบท่าหรือในสภาพแวดล้อมเสมือนจริง

คำตอบ:


16

น่าเสียดายที่ไม่มีวิธีง่ายๆในการทำเช่นนี้เพราะ nginx ใช้การใช้งานตัวแก้ไขของตัวเอง โซลูชันสองอย่างที่ฉันเห็นคือ:

1) คุณสร้างรายการตัวแก้ไขจากสคริปต์และรวมไว้เช่น:

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

http {

    include resolvers.conf;

}

2) คุณคอมไพล์ nginx อีกครั้งกับโมดูลของบุคคลที่สามเช่นโมดูล perl แบบทดลอง (มาก) และเขียนตัวจัดการตัวแปร:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

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

    resolver "$resolvers";
}

ทีนี้ถ้าคุณเป็นนักเขียน C (เตรียมสายตาให้พร้อมสำหรับเลือด) คุณยังสามารถเขียนแผ่นแปะหรือโมดูลอื่นเพื่อให้มันทำงานได้


6

สำหรับผู้ใช้ Docker พบวิธีแก้ปัญหาที่นี่ :

นี่เป็นวิธีแก้ปัญหาสำหรับผู้ใช้ Docker

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

สิ่งนี้จะนำnameserverรายการทั้งหมดจาก /etc/resolv.confและพิมพ์ในบรรทัดเพื่อให้คุณสามารถใช้กับresolverคำสั่งของ nginx 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;"

ทราบว่าในนักเทียบท่านี้มีแนวโน้มที่จะส่งผลให้ในไฟล์เช่นเดียวกับนักเทียบท่าโดยค่าเริ่มต้นเซิร์ฟเวอร์ DNS ที่ฝังตัว127.0.0.11ดูคำตอบนี้ไปเทียบท่าเครือข่าย Nginx Resolver


2
Awk เรียนรู้มันเป็นเครื่องมือที่ยอดเยี่ยมสำหรับ munging export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)ข้อความ: ไม่จำเป็นต้องcat, grepหรือtrในการมี
j0057

สิ่งนี้ใช้ไม่ได้กับ Kubernetes
คิม

1

ถ้าใช้ระบบของคุณ resolvconf (เป็นเสมือนเครื่องหลายคนทำ แต่โชคร้ายที่เทียบท่าไม่ได้ดู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

การแจกแจงลินุกซ์บางอย่างรวม/etc/nginx/conf.d/*.confอยู่ในการกำหนดค่าเริ่มต้น การโหลดซ้ำมักจะถูกละเว้นเมื่อบริการไม่ทำงาน สังเกตว่าสคริปต์อาจทำงานโดยไม่มี/usr/binใน PATH ดังนั้นคุณอาจต้องใช้พา ธ สัมบูรณ์เป็น awk


1

หากคุณกำลังใช้ nginx รุ่น Openresty คุณสามารถใช้localอาร์กิวเมนต์พิเศษของพวกเขาในresolverคำสั่งซึ่งเมื่อตั้งค่าlocal=onหมายความว่าตัวแก้ไขมาตรฐาน/etc/resolv.confจะถูกใช้โดยตัวแก้ไข (สำหรับรายละเอียดเพิ่มเติมดูเอกสารตัวแก้ไขของ Openresty ):

resolver local=on;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.