máy chủ ảo dựa trên tên nginx trên IPv6


44

Tôi có một máy chủ nginx phục vụ gần nửa tá trang web khác nhau. Nó đang chạy trên Linode vừa có hỗ trợ riêng IPv6 (trung tâm dữ liệu Dallas) và tôi đang cố gắng định cấu hình hầu hết các trang web của mình để vận hành ngăn xếp kép. Tôi đã nhận được cái đầu tiên và chạy bằng tên miền phụ chỉ IPv6 như vậy:

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
}

Điều này hoạt động rất tốt - example.com chỉ dành cho IPv4 (hiện tại) và ipv6.example.com chỉ dành cho IPv6 (chủ yếu ở đó cho mục đích thử nghiệm). Tôi có thể ping6 ipv6.example.com, và thậm chí wget ipv6.example.comkhông đổ mồ hôi - điều này rất dễ chịu (sau khi tìm thấy "gotcha" với cách nginx liên kết các máy chủ ảo, đòi hỏi phải có ipv6only=onlập luận và các listenchỉ thị kép ).

Tuy nhiên, hiện tôi đang cố gắng mở rộng điều này để hỗ trợ các tên miền khác của mình, bắt đầu với static.example.com; Mặc dù vậy, khi tôi thực hiện cùng một cách tiếp cận như trên (các listenchỉ thị kép , bao gồm cả ipv6only=onđối số), tôi gặp lỗi sau khi khởi động lại nginx:

* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3

Có vẻ như phương pháp ràng buộc cho IPv6 của nginx không cho phép các máy chủ ảo dựa trên tên? Tôi sẽ phải nhận thêm địa chỉ IPv6 từ máy chủ của mình (không phải là vấn đề) và sử dụng lưu trữ ảo dựa trên IP trên IPv6 với lưu trữ ảo dựa trên tên được đặt qua IPv4? Hoặc tôi đang thiếu một giải pháp cho phép cấu hình của tôi duy trì nhất quán trên cả hai ngăn xếp?

Tôi đã hy vọng có trang web của mình đầy đủ trên ngăn xếp IPv6 kịp thời cho Ngày IPv6 thế giới , nhưng trừ khi tôi có thể làm rõ điều này một cách nhanh chóng thì tôi có thể không sẵn sàng. Không phải là một vấn đề lớn từ bất kỳ quan điểm thực tế nào - không có trang web nào của tôi đủ điều kiện là một "tổ chức lớn" bởi bất kỳ sự tưởng tượng nào - nhưng hãy giúp tôi tiết kiệm uy tín của mình!

Chỉnh sửa để thêm:

Nhờ câu trả lời từ @kolbyjack, hiện tại tôi có một máy chủ web xếp chồng kép đầy đủ chức năng. Để rõ ràng, tôi đang chỉnh sửa giải pháp mà anh ấy đưa cho tôi để mọi người có thể thấy rõ câu trả lời là gì.

Vhost Catchall mặc định của tôi có các listenchỉ thị sau :

listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;

Tôi không biết nếu thứ tự có vấn đề, nhưng nó có. Sau đó, mỗi vhost bổ sung có các listenchỉ thị sau :

listen 80;
listen [::]:80;

(Hoặc 8080 cho một trong đó lắng nghe trên cổng đó để thay thế.) Phần quan trọng ở đây dường như là tổng thiếu của bất kỳ đối số bổ sung đối với tất cả ngoại trừ các vhost mặc định của listenchỉ thị - tức là không có sự lặp lại của ipv6only=on.

Một lần nữa, cảm ơn @kolbyjack về giải pháp tại đây!


Với nginx 1.2.1 tôi không phải chỉ định ipv6only=on. Mọi thứ khác vẫn giữ nguyên, tuy nhiên, cảm ơn vì điều này!
BeepDog

Câu trả lời:


46

Bạn chỉ cần nghe tùy chọn trên một khai báo cho một ổ cắm. Nói chung, bạn sẽ đưa chúng vào phần khai báo cũng bao gồm cờ default_server, nhưng đối với một số tùy chọn, tôi nghĩ bạn chỉ có thể đặt chúng trên bất kỳ lệnh nghe nào. Chỉ cần xóa ipv6only = on khỏi tất cả các trình nghe trừ một.


2
Đợi đã, tôi bối rối. Tôi nghĩ rằng ít nhất một chỉ thị lắng nghe cho mỗi tuyên bố máy chủ là bắt buộc - nếu không thì nginx sẽ biết khối máy chủ nào được dự định đáp ứng trên (các) cổng nào? Tôi đã không đề cập đến nó ở trên bởi vì tôi không nghĩ nó có liên quan, nhưng tôi có một máy chủ vào năm 8080, còn lại là 80 và tôi dự định sẽ cung cấp 443 cho một cặp vợ chồng ngay khi tôi nhận được điều này. sau đó lấy cho mình một chứng chỉ SSL.
Kromey

Được rồi, nhìn lại tài liệu, các trang web trên cổng 80 trông giống như chúng thực sự sẽ không cần một lệnh nghe, chỉ cần một trang có cờ default_server trên vhost của tôi. Tuy nhiên, điều này vẫn không thành công cho máy chủ của tôi vào năm 8080, do đó tôi cũng sử dụng một công cụ bắt mặc định (phần lưu trữ được viết để đơn giản bỏ qua mọi yêu cầu cho tên máy chủ mà tôi chưa cấu hình rõ ràng trong một vhost khác).
Kromey

1
Tôi không nói để loại bỏ tất cả các chỉ thị lắng nghe của bạn. Chỉ cần xóa ipv6only = trên cờ khỏi tất cả trừ một trong số chúng. Nếu không có lệnh nghe trong mỗi máy chủ, họ sẽ mặc định chỉ nghe 80; có thể có hoặc không bao gồm ipv6. Tôi nghĩ cách tiếp cận đúng là bao gồm cả hai lệnh nghe trong mỗi máy chủ, nhưng chỉ đặt ipv6only = chỉ trong một trong các máy chủ.
kolbyjack

4
Ah, tôi hiểu ý của bạn rồi. Tôi đọc sai bài viết của bạn ban đầu. Điều này đã làm việc cho tôi: ipv6only=onchỉ được liệt kê (cho mỗi cổng tôi nghe) trong vhost mặc định của tôi (cùng với default_server); mỗi vhost sau đó chỉ cần chỉ định listen 80;listen [::]:80(không có tham số bổ sung nào) để hoạt động trên cả IPv4 và IPv6. Bây giờ tất cả những gì tôi phải làm là hoàn thành việc thêm các bản ghi AAAA cho các miền ngăn xếp kép của mình và tôi nên đi đến đây. Cảm ơn!
Kromey

1
cũng làm việc cho tôi, nhưng tôi không hiểu tại sao tôi nginx có thể nghe trên ipv4 cho nhiều khối, nhưng không phải là ipv6. . bạn có thể giải thích ?
Adeerlike
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.