Saya telah melihat berbagai contoh konfigurasi untuk menangani dual-stack IPv4 dan IPv6 virtual hosts di nginx. Banyak yang menyarankan pola ini:
listen 80;
listen [::]:80 ipv6only=on;
Sejauh yang saya bisa lihat, ini mencapai hal yang persis sama dengan:
listen [::]:80 ipv6only=off;
Mengapa Anda menggunakan yang pertama? Satu-satunya alasan yang dapat saya pikirkan adalah jika Anda memerlukan params tambahan yang khusus untuk setiap protokol, misalnya jika Anda hanya ingin mengatur deferred
IPv4.
listen
arahan, dan opsi diterapkan per host: pasangan port.Jawaban:
Yang mungkin adalah tentang satu-satunya alasan Anda akan menggunakan bekas konstruksi, hari ini.
Alasan Anda melihat ini mungkin karena default
ipv6only
diubah di nginx 1.3.4. Sebelum itu, defaultnya adalahoff
; dalam versi yang lebih baru defaultnya adalahon
.Ini terjadi untuk berinteraksi dengan opsi soket IPV6_V6ONLY di Linux, dan opsi serupa pada sistem operasi lain, yang standarnya tidak selalu dapat diprediksi. Oleh karena itu, konstruk sebelumnya diperlukan sebelum 1.3.4 untuk memastikan bahwa Anda benar-benar mendengarkan koneksi pada IPv4 dan IPv6.
Perubahan ke standar nginx untuk
ipv6only
memastikan bahwa standar sistem operasi untuk soket tumpukan ganda tidak relevan. Sekarang, nginx secara eksplisit mengikat ke IPv4, IPv6, atau keduanya, tidak pernah bergantung pada OS untuk membuat soket tumpukan ganda secara default.Memang, konfigurasi nginx standar saya untuk pre-1.3.4 memiliki konfigurasi pertama, dan post-1.3.4 semua memiliki konfigurasi kedua.
Meskipun, karena mengikat soket tumpukan ganda adalah hal yang hanya Linux, konfigurasi saya saat ini lebih mirip contoh pertama, tetapi tanpa
ipv6only
set, untuk menjelaskan:sumber
listen localhost:8080;
tampaknya mendengarkan keduanya (1.12.2) dan menggunakanproxy_pass http://localhost:8080
akan memuat keseimbangan antara :: 1 dan 127.0.0.1 - Saya harus menambahkan baris untuk ipv6 untuk mendapatkan ip nyata dalam logset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Jika Anda meng-host beberapa domain vhost dengan instance Nginx tunggal, Anda tidak dapat menggunakan arahan mendengarkan gabungan tunggal
untuk masing-masing. Nginx memiliki kekhasan aneh di mana Anda hanya dapat menentukan
ipv6only
parameter satu kali untuk setiap port, atau gagal memulai. Itu berarti Anda tidak dapat menentukannya untuk setiap blok server domain vhost.Seperti yang disebutkan Michael, dimulai dengan Nginx 1.3.4,
ipv6only
parameternya adalah defaulton
.Oleh karena itu, jika Anda ingin meng-host beberapa domain pada IPv4 dan IPv6 dengan server Nginx tunggal, Anda terpaksa menggunakan dua arahan mendengarkan untuk setiap blok server domain:
Selain itu, seperti yang disebutkan Sander, menggunakan
ipv6only=off
memiliki kelemahan bahwa alamat IPv4 diterjemahkan ke IPv6. Ini dapat menyebabkan masalah jika aplikasi Anda melakukan pemeriksaan IP terhadap daftar hitam seperti Akismet atau StopForumSpam karena kecuali Anda membuat lapisan terjemahan terbalik, aplikasi Anda akan memeriksa terjemahan IPv6 dari alamat IPv4 pengirim spam, yang tidak akan cocok dengan alamat IPv4 mana pun di Daftar hitam.sumber
deferred
, dan arahan per-protokol lainnya. Akan bermanfaat jika mereka dapat ditentukan secara terpisah dari arahan mendengarkan karena alasan yang Anda ucapkan.ipv6only=off
untuk port yang sama dua kali. Jawaban Anda memecahkan masalah!listen 443; listen [::]:443;
. Menggunakanlisten [::]:80 ipv6only=off;
akan melempar kesalahan nginx bahwa port sudah digunakanDengan
ipv6only=off
gaya konfigurasi, alamat IPv4 mungkin ditampilkan sebagai alamat IPv6 menggunakan alamat IPv6 (hanya perangkat lunak) yang dipetakan di misalnya file log, variabel lingkungan (REMOTE_ADDR) dll.sumber
Untuk pemahaman saya (dan menurut dokumen di http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), menggunakan hanya
... cukup jika Anda ingin menyalurkan lalu lintas IPv4 & IPv6 pada port yang sama.
sumber