Bạn có cần các chỉ thị lắng nghe IPv4 và IPv6 riêng biệt trong nginx không?


72

Tôi đã thấy các ví dụ cấu hình khác nhau để xử lý các máy chủ ảo IPv4 và IPv6 xếp chồng kép trên nginx. Nhiều người đề xuất mô hình này:

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

Theo như tôi có thể thấy, điều này đạt được chính xác như:

listen [::]:80 ipv6only=off;

Tại sao bạn sẽ sử dụng trước đây? Lý do duy nhất tôi có thể nghĩ đến là nếu bạn cần các thông số bổ sung dành riêng cho từng giao thức, ví dụ nếu bạn chỉ muốn đặt deferredtrên IPv4.


Được coi là không có gì để làm với phiên bản ngăn xếp IP, đó là một tùy chọn TCP.
Xavier Lucas

1
Chắc chắn, nhưng bạn đặt nó trong các listenchỉ thị và các tùy chọn được áp dụng cho mỗi máy chủ: cặp cổng.
Synchro

Hum Tôi thực sự không thể tưởng tượng được một trường hợp mà bạn muốn làm điều đó. Tôi nghĩ lý do duy nhất là lịch sử và Michael Hampton đóng đinh nó.
Xavier Lucas

Câu trả lời:


48

Đó có lẽ lý do duy nhất bạn sẽ sử dụng cấu trúc cũ, những ngày này.

Lý do bạn thấy điều này có lẽ là mặc định ipv6onlyđã thay đổi trong nginx 1.3.4. Trước đó, nó được mặc định là off; trong các phiên bản mới hơn, nó mặc định là on.

Điều này xảy ra để tương tác với tùy chọn ổ cắm IPV6_V6ONLY trên Linux và các tùy chọn tương tự trên các hệ điều hành khác, mặc định không nhất thiết phải dự đoán được. Do đó, cấu trúc trước đây được yêu cầu trước 1.3.4 để đảm bảo rằng bạn thực sự đang lắng nghe các kết nối trên cả IPv4 và IPv6.

Việc thay đổi mặc định nginx để ipv6onlyđảm bảo rằng mặc định của hệ điều hành cho ổ cắm ngăn xếp kép là không liên quan. Bây giờ, nginx liên kết rõ ràng với IPv4, IPv6 hoặc cả hai, không bao giờ phụ thuộc vào HĐH để tạo ổ cắm ngăn xếp kép theo mặc định.

Thật vậy, các cấu hình nginx tiêu chuẩn của tôi cho trước 1.3.4 có cấu hình đầu tiên và sau 1.3.4 đều có cấu hình thứ hai.

Mặc dù, vì ràng buộc một ổ cắm ngăn xếp kép là một thứ chỉ dành cho Linux, nên các cấu hình hiện tại của tôi bây giờ trông giống như ví dụ đầu tiên, nhưng không ipv6onlyđược đặt, để dí dỏm:

listen [::]:80;
listen 80;

4
Một số hệ điều hành hoàn toàn không có ổ cắm ipv4 và ipv6 kép, như OpenBSD, do đó bạn sẽ phải nghe hai lần.
Justin Cormack

@JustinCormack Vâng, bạn nói đúng và tôi đã tính đến điều đó một thời gian. Chỉ chưa cập nhật bài viết này cho đến bây giờ.
Michael Hampton

1
listen localhost:8080;dường như nghe cả hai (1.12.2) và sử dụng proxy_pass http://localhost:8080sẽ tải cân bằng giữa :: 1 và 127.0.0.1 - Tôi đã phải thêm một dòng cho ipv6 để có được ip thực trong nhật kýset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Antony Gibbs

65

Nếu bạn lưu trữ nhiều tên miền vhost với một phiên bản Nginx, bạn không thể sử dụng lệnh nghe kết hợp duy nhất

listen [::]:80 ipv6only=off;

cho mỗi người trong số họ. Nginx có một cách giải quyết kỳ lạ khi bạn chỉ có thể chỉ định ipv6onlytham số một lần cho mỗi cổng, nếu không sẽ bắt đầu. Điều đó có nghĩa là bạn không thể chỉ định nó cho từng khối máy chủ tên miền vhost.

Như Michael đã đề cập, bắt đầu với Nginx 1.3.4, ipv6onlytham số mặc định là on.

Do đó, nếu bạn muốn lưu trữ nhiều tên miền trên cả IPv4 và IPv6 với một máy chủ Nginx, bạn buộc phải sử dụng hai chỉ thị lắng nghe cho mỗi khối máy chủ tên miền:

listen 80;
listen [::]:80; 

Ngoài ra, như Sander đã đề cập, việc sử dụng ipv6only=offcó một nhược điểm là địa chỉ IPv4 được dịch sang IPv6. Điều này có thể gây ra sự cố nếu ứng dụng của bạn kiểm tra IP đối với các danh sách đen như Akismet hoặc StopForumSpam vì trừ khi bạn xây dựng lớp dịch ngược, ứng dụng của bạn sẽ kiểm tra bản dịch IPv6 của địa chỉ IPv4 của người gửi thư rác, không khớp với bất kỳ địa chỉ IPv4 nào trong danh sách đen.


2
Vâng, đó là giống như tôi đã đề cập deferredvà các chỉ thị cho mỗi giao thức khác. Sẽ hữu ích nếu chúng có thể được chỉ định tách biệt với chỉ thị nghe vì lý do bạn nói.
Synchro

1
Và cốt lõi của vấn đề là, bạn cần xác định chỉ thị lắng nghe cho từng miền riêng biệt. Nếu không thì chuyện gì sẽ xảy ra? trang web sẽ hoạt động tốt thông qua ipv4 và qua ipv6 nó sẽ hiển thị trang chào mừng nginx. ROFL
Mặt trăng bạc

2
Cảm ơn bạn đã giải thích kỹ lưỡng! Tôi đã nhận được một lỗi khó hiểu khi tôi chỉ định ipv6only=offcho cùng một cổng hai lần. Câu trả lời của bạn đã giải quyết vấn đề!

1
Ngoài ra nếu bạn muốn sử dụng 2 vhost cả nghe 443 : listen 443; listen [::]:443;. Việc sử dụng listen [::]:80 ipv6only=off;sẽ gây ra lỗi nginx mà cổng đã được sử dụng
lukeaus


2

Theo hiểu biết của tôi (và theo các tài liệu tại http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), chỉ sử dụng

listen 80;

... là đủ nếu bạn muốn kênh lưu lượng cả IPv4 & IPv6 tại cùng một cổng.


1
Điều đó đã được thiết lập, và được đề cập trong câu hỏi. Xin vui lòng xem các câu trả lời khác cho sự khác biệt.
Synchro

3
Nó không cho tôi, tôi cần cả hai. wget và curl thất bại khi sử dụng ipv6 cho đến khi tôi thêm dòng "nghe [::]: 80 ipv6only = on;"
Basil A
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.