IPv6'da nginx ad tabanlı sanal ana bilgisayarlar


44

Yaklaşık yarım düzine farklı web sitesine hizmet veren bir nginx sunucum var. IPv6 yerel desteğini (Dallas veri merkezi) yeni alan bir Linode üzerinde çalışıyor ve sitelerimin çoğunu çift yığınlı işlem için yapılandırmaya çalışıyorum. İlki başlattım ve şöyle bir IPv6-only alt etki alanı kullanarak çalışıyor:

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
}

Bu harika çalışır - example.com yalnızca IPv4'tür (şimdilik) ve ipv6.example.com yalnızca IPv6’dır (öncelikle test amaçlıdır). Yapabilirim ping6 ipv6.example.com, ve hatta wget ipv6.example.combir ter bile olmadan - bu çok hoş bir acısızdı (nginx'in sanal konakları bağladığı, ipv6only=onargümanı ve ikili listenyönergeleri gerektirecek şekilde "gotcha" yı bulduktan sonra ).

Ancak, bunu static.example.com ile başlayan diğer etki alanlarımı desteklemek için genişletmeye çalışıyorum; Yukarıdaki gibi aynı yaklaşımı uyguladığımda, ( argüman listendahil ikili direktifler ipv6only=on), nginx'i yeniden başlatırken şu hatayı alıyorum:

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

Belki nginx'in IPv6 için bağlanma yönteminin isme dayalı sanal konaklara izin vermediği görünüyor? Ana bilgisayarımdan ek IPv6 adresleri almak zorundayım (sorun değil) ve IPv6'da IP tabanlı sanal barındırma ile IPv4 üzerinde IP tabanlı sanal barındırma kullanmam gerekir mi? Veya yapılandırmalarımın her iki yığında da tutarlı kalmasına izin verecek bir çözümü özlüyor muyum?

Dünya IPv6 Günü için sitemin tam olarak IPv6 yığınında olmasını umuyordum , ancak bunu hızlı bir şekilde temizleyemezsem hazır olmayabilirim. Herhangi bir pratik bakış açısından büyük bir sorun değil - sitelerimden hiçbiri hayal gücünün bir gerilimi ile "büyük bir organizasyon" olarak nitelenmiyor - ancak geek inancımı kurtarmama yardım et!

Eklemek için düzenlendi:

@Kolbyjack'in yanıtı sayesinde şu anda tamamen işlevsel bir çift yığınlı web sunucum var. Sadece açıklık uğruna, bana verdiği çözümde düzenleme yapıyorum, böylece herkes cevabın ne olduğunu açıkça görebiliyor.

Benim varsayılan catchall vhost aşağıdaki listenyönergelere sahiptir:

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

Siparişin önemli olup olmadığını bilmiyorum, ama işte. Sonra, her bir ek vhost aşağıdaki listenyönergelere sahiptir:

listen 80;
listen [::]:80;

(Ya da bunun yerine bu bağlantı noktasını dinleyen kişi için 8080.) Buradaki önemli kısım, varsayılan vhost'un listendirektifleri haricindeki tüm argümanlardaki eksikliğin toplamı gibi görünüyor - yani tekrarı yok ipv6only=on.

Yine, burada çözüm için @ kolbyjack için çok teşekkürler!


Nginx 1.2.1 ile belirtmek zorunda değildim ipv6only=on. Ancak her şey aynı kaldı, bunun için teşekkürler!
BeepDog

Yanıtlar:


46

Bir soket için yalnızca bir bildirimde dinleme seçeneklerine ihtiyacınız vardır. Genelde onları default_server bayrağını da içeren bildiriye koyarsınız, ancak bazı seçenekler için, onları sadece herhangi bir dinleme yönergesine koyabileceğinizi düşünüyorum. Sadece ipv6only = on bir tane hariç tüm dinleyicilerden kaldırın.


2
Bekle, kafam karıştı. Sunucu bildirimi başına en az bir dinleme direktifinin gerekli olduğunu düşündüm - aksi halde nginx hangi sunucu bloğunun hangi portlara cevap vereceğini nasıl bilebilir? Yukarıda bahsetmedim, çünkü konuyla ilgili olduğunu düşünmedim, ama 8080'de bir sunucum, 80'de gerisi var ve bu ütüyü alır almaz bir çift için 443 teklif etmeyi düşünüyorum. sonra kendime bir SSL sertifikası alın.
Kromey

Tamam, belgelere tekrar bakarsak, 80 numaralı bağlantı noktasındaki siteler aslında bir dinleme yönergesine ihtiyaç duymayacak gibi görünüyorlar, sadece birincisi, catchall vhost'umda default_server bayrağıyla. Bununla birlikte, 8080'deki sunucum için hala başarısız oluyor, bunun için de varsayılan bir catchall kullanıyorum (catchall, açıkça başka bir vhost'ta konfigüre etmediğim bir ana bilgisayar adı için yapılan istekleri yoksaymak için yazılmıştır).
Kromey

1
Bütün dinleme direktiflerini çıkarmanı demiyorum. Sadece ipv6only = bayrak üzerinde onlardan bir tanesini kaldırın. Her sunucuda bir dinleme yönergesi olmadan, sadece 80 dinlemek için varsayılanlar olacaktır; ki bunlar ipv6 içerebilir veya içermeyebilir. Bence doğru yaklaşım her iki sunucuya da her iki dinleme direktifini de eklemek, ancak ipv6only = 'yi sadece sunuculardan birine yerleştirmek.
kolbyjack

4
Ah, şimdi ne demek istediğini anlıyorum. Yazınızı orijinal olarak yanlış anladım. Bu benim için çalıştı: ipv6only=onvarsayılan vhost (yanında default_server) sadece listelenir (dinlediğim her port için ); Her vhost daha sonra IPv4 ve IPv6'da çalışmak üzere basitçe listen 80;ve listen [::]:80(hiçbir ek parametre yok) belirler. Şimdi tek yapmam gereken çift yığınlı etki alanlarım için AAAA kayıtlarını eklemeyi bitirmek ve buraya gitmek için iyi olmalıyım. Teşekkürler!
Kromey

1
benim için de çalıştı ama neden nginx'in ipv4'ü çoklu bloklar için dinleyebildiğini anlamıyorum, fakat ipv6'yı değil. . açıklayabilir misin ?
Adeerlike,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.