ฉันมีเซิร์ฟเวอร์ nginx ที่ให้บริการเว็บไซต์ที่แตกต่างกันเกือบครึ่งโหล มันกำลังทำงานบน Linode ที่เพิ่งรองรับ IPv6 ดั้งเดิม (ศูนย์ข้อมูลดัลลัส) และฉันพยายามกำหนดค่าไซต์ส่วนใหญ่ของฉันสำหรับการดำเนินการแบบ dual-stack ฉันได้โดเมนแรกและทำงานโดยใช้โดเมนย่อย IPv6 เท่านั้นเช่น:
server {
listen [::]:80 ipv6only=on;
listen 80;
server_name example.com ipv6.example.com;
root /var/www/example.com/htdocs;
#More stuff, including PHP, WordPress
}
สิ่งนี้ใช้งานได้ดี - example.com เป็น IPv4 เท่านั้น (ตอนนี้) และ ipv6.example.com นั้นเป็น IPv6 เท่านั้น (ส่วนใหญ่มีไว้เพื่อการทดสอบ) ฉันทำได้ping6 ipv6.example.com
และแม้จะwget ipv6.example.com
ไม่ทำให้เหงื่อออก - มันก็ไม่เจ็บปวดอย่างน่าพอใจ (หลังจากค้นหา "gotcha" ด้วยวิธีที่ nginx ผูกโฮสต์เสมือนไว้โดยไม่จำเป็นต้องipv6only=on
โต้แย้งและlisten
แนวทางคู่)
อย่างไรก็ตามตอนนี้ฉันกำลังพยายามขยายเพื่อรองรับโดเมนอื่น ๆ ของฉันเริ่มต้นจาก static.example.com เมื่อฉันใช้วิธีเดียวกันกับข้างต้นแม้ว่า ( listen
คำสั่งคู่รวมถึงการipv6only=on
โต้แย้ง) ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อรีสตาร์ท nginx:
* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
ดูเหมือนว่าวิธีการของ nginx ในการเชื่อมต่อกับ IPv6 ไม่อนุญาตให้โฮสต์เสมือนตามชื่อใช่หรือไม่ ฉันจะต้องได้รับที่อยู่ IPv6 เพิ่มเติมจากโฮสต์ของฉัน (ไม่ใช่ปัญหา) และใช้การโฮสต์เสมือนบน IP บน IPv6 ที่มีการโฮสต์เสมือนตามชื่อผ่าน IPv4 หรือไม่ หรือฉันขาดวิธีแก้ปัญหาที่จะช่วยให้การกำหนดค่าของฉันยังคงสอดคล้องกับทั้งสองกอง?
ฉันหวังว่าจะให้เว็บไซต์ของฉันใช้งาน IPv6 ได้ทันตามกำหนดเวลาสำหรับวัน IPv6 ของโลกแต่ถ้าฉันไม่สามารถเคลียร์สิ่งนี้ได้อย่างรวดเร็วฉันอาจไม่พร้อม ไม่ใช่เรื่องใหญ่จากมุมมองเชิงปฏิบัติใด ๆ - ไม่มีไซต์ของฉันที่มีคุณสมบัติเป็น "องค์กรหลัก" โดยจินตนาการที่กว้างไกล - แต่ช่วยฉันประหยัดความน่าเชื่อถือ!
แก้ไขเพื่อเพิ่ม:
ขอบคุณคำตอบจาก @kolbyjack ตอนนี้ฉันมีเว็ปเซิร์ฟเวอร์คู่ทำงานได้อย่างสมบูรณ์แล้ว เพียงเพื่อประโยชน์ของความชัดเจนฉันกำลังแก้ไขในวิธีการแก้ปัญหาที่เขาให้ฉันเพื่อให้ทุกคนสามารถเห็นได้อย่างชัดเจนว่าคำตอบคืออะไร
catchall vhost ของฉันมีlisten
คำสั่งดังต่อไปนี้:
listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;
ฉันไม่ทราบว่าคำสั่งซื้อนั้นสำคัญ แต่มีอยู่หรือไม่ จากนั้นแต่ละ vhost เพิ่มเติมมีlisten
คำสั่งต่อไปนี้:
listen 80;
listen [::]:80;
(หรือ 8080 สำหรับคนที่ฟังในพอร์ตที่แทน.) ส่วนที่สำคัญที่นี่ดูเหมือนจะขาดรวมของการขัดแย้งใด ๆ เพิ่มเติมในทุก แต่ vhost เริ่มต้นของlisten
คำสั่ง - ipv6only=on
คือการซ้ำซ้อนของไม่มี
ขอขอบคุณ @kolbyjack อีกครั้งสำหรับวิธีการแก้ปัญหาที่นี่!
ipv6only=on
ฉันไม่ได้มีการระบุ ทุกอย่างยังคงเหมือนเดิมขอบคุณสำหรับสิ่งนี้!