Nginx Server_names_hash_max_size ve server_names_hash_bucket_size ayarlarını yapma


22

Nginx'i, herkesin kendi web sitesini veren bir hizmette Apache'nin ters proxy'si olarak kullanıyoruz. Hesap oluşturulurken, sistem, biri 80 numaralı bağlantı noktası, diğeri 443 için olmak üzere iki giriş içeren yeni bir nginx conf dosyası oluşturur. Her 30 alan adında hatayı aldığımızı fark ediyoruz:

Restarting nginx: nginx: [emerg] could not build the server_names_hash, 
you should increase either server_names_hash_max_size: 256 
or server_names_hash_bucket_size: 64.

Yaklaşık 200 etki alanı ve büyüyen sunucu_adı_hash_max boyutunu 4112'ye yükseltmek zorunda kaldık ve bunun iyi ölçeklenmeyeceğinden endişe ediyoruz. Bu yapılandırmaların nasıl çalıştığını ve bu yöntemi kullanarak binlerce alana ulaşabileceğimizden emin olmak için en uygun ayarların ne olacağını anlamaya çalışıyorum.

Ayrıca, bu karma boyutta nginx'in yeniden yüklenmesi birkaç saniye sürmeye başlar, bu da yeniden başlatılırken sistemin kullanılamamasına neden olur.

Genel ayarlar şunlardır (Ubuntu sunucu 10.10 nginx / 1.0.4 üzerinde çalışıyor):

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 300;
    types_hash_max_size 2048;
    # server_tokens off;

    server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    # server_names_hash_max_size 2056;
    server_names_hash_max_size 4112;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;

ssl_session_cache shared:SSL:10m;
ssl_ciphers ALL:!kEDH:-ADH:+HIGH:+MEDIUM:-LOW:+SSLv2:-EXP;
}

(Şifrelerin altında çift ana site yapılandırması ve tümünü yakala):

include /etc/user-nginx-confs/*;

server {
listen 80;
server_name .domain.com;
location / {
proxy_pass http://127.0.0.1:8011;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 111;
}
}

server {
listen 443 ssl;
server_name .suredone.com;
ssl_certificate /etc/apache2/sddbx/sdssl/suredone_chained.crt;
ssl_certificate_key /etc/apache2/sddbx/sdssl/suredone.key;
location / {
proxy_pass http://127.0.0.1:44311;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 111;
}
}

server {
listen 80 default_server;
listen 443 default_server ssl;
server_name _;
ssl_certificate /ssl/site_chained.crt;
ssl_certificate_key /ssl/site.key;
return 444;
}

(Ve örnek bir kullanıcı conf dosyası)

server {
listen 80;
server_name username.domain.com;
location / {
proxy_pass http://127.0.0.1:8011;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 1111;
}
}

server {
listen 443 ssl;
server_name username.domain.com;
ssl_certificate /ssl/site_chained.crt;
ssl_certificate_key /ssl/site.key;
location / {
proxy_pass http://127.0.0.1:44311;
proxy_set_header host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-SystemUse-Header 1111;
}
}

Herhangi bir yardım ve yön büyük takdir !!

Yanıtlar:


14

serverNginx'in sunduğu adların listesi hızlı arama için bir karma tabloda saklanır . Giriş sayısını artırdıkça, karma tablonun boyutunu ve / veya tablodaki karma kova sayısını artırmanız gerekir.

Kurulumunuzun doğası göz önüne alındığında, servertabloda sakladığınız ad sayısını kolayca azaltmanın hiçbir yolunu düşünemiyorum . Bununla birlikte, nginx'i "yeniden başlatmamanızı", ancak yapılandırmasını yeniden yüklemesini öneririm. Örneğin:

service nginx reload

Sorunun ikinci kısmı için harika, teşekkürler. Yani server_names_hash_max_size 10000 etki alanı almak için 20000 civarında bir yerde olacak endişe?
jasonspalace

Bu sadece nginx'i yeniden başlattığınızda bir sorundur. Dediğim gibi, reloadbunun yerine mümkün olduğunca sorunu önlemek için.
Michael Hampton

23

Kazandığım bazı teknik detaylar kaynak kodunu oluşturuyor:

  • Genel öneri, her iki değeri de mümkün olduğunca küçük tutmak olacaktır.
  • Eğer nginx şikayet ederse, şikayet max_sizeettiği sürece önce artar . Sayı büyük bir sayıyı aşarsa (örneğin, 32769), bucket_sizeşikayet ettiği sürece platformunuzdaki varsayılan değerin çoğuna yükseltin . Artık şikayet etmiyorsa, şikayet etmediği max_sizesürece geriye doğru azaltın . Artık sunucu adları kümeniz için en iyi kuruluma sahipsiniz (her sunucu_adı kümesi farklı kurulum gerektirebilir).
  • Daha büyük max_sizebellek, daha fazla bellek tüketilmesi anlamına gelir (çalışan veya sunucu başına bir kez, lütfen biliyorsanız yorum yapın).
  • Daha büyük bucket_sizeCPU döngüleri (her alan adı araması için) ve ana bellekten önbelleğe daha fazla aktarım anlamına gelir.
  • max_sizesunucu_adı sayısıyla doğrudan ilişkili değildir, sunucu sayısı iki katına çıkarsa, max_sizeçarpışmaları önlemek için 10 kat veya daha fazla artırmanız gerekebilir . Onlardan kaçınamıyorsanız, artmanız gerekir bucket_size.
  • bucket_size kaynak kodundan ikisinin bir sonraki gücüne arttırıldığı söyleniyor, varsayılan değerden birden fazla yapmak için yeterli olması gerektiğine inanıyorum, bu önbelleğe en uygun şekilde aktarmayı sürdürmelidir.
  • Ortalama alan adı, karma dizi ek yükü olsa bile 32 bayta sığmalıdır. bucket_size512 bayta çıkarsanız , çarpışma karma anahtarıyla 16 alan adı barındırır. Bu istediğiniz bir şey değildir, çarpışma olursa doğrusal olarak arama yapar . Mümkün olduğunca az çarpışma yapmak istiyorsunuz.
  • Eğer varsa max_size az 10000 ve küçük bucket_sizenginx bir döngü içinde optimum hash boyutu bulmaya çünkü, uzun yükleme süresi rastlamak olabilir.
  • Eğer max_size10000'den büyükseniz, şikayet etmeden önce "sadece" 1000 döngü gerçekleştirilecektir.

Bu harika bir bilgi; araştırma ve yazma için teşekkürler.
womble

@brablc 32769'a nasıl geldiğinizi merak ediyorum. Geçerli yığın boyutunun ne olduğunu nereden görebilirsiniz?
Uhl Hosting

İşgal edilen bellek max_size * bucket_size olur (ancak paylaşılan mı yoksa çalışan başına mı bilmiyorum). 8000 sunucu ismim vardı ve 32769 zaten çok yüksek hissettim. Ancak çok fazla belleğiniz varsa daha yükseğe çıkmak isteyebilirsiniz.
brablc

4

Nginx.conf içindeki "server_names_hash_bucket_size" yapılandırmasını artırın.

64 tane vardı ve 128 olarak değiştirdim.

Sorun çözüldü.


2

@Michael Hampton cevabı konusunda kesinlikle haklı. Bu karma tablo, yeniden başlatma veya yeniden yükleme sırasında oluşturulur ve derlenir ve daha sonra çok hızlı çalışır. Sanırım bu karma tablo, performansı fark etmeden çok daha fazla büyüyebilir. Ama C kodunun doğası gereği 4096 gibi iki büyüklükte bir boyut kullanmanızı öneririm.


Hangi baz ile ikisinin gücü, Varsayılan 512'nin katları halinde büyümek doğru mu?
jasonspalace

Evet kesinlikle.
Fleshgrinder

1

Senin durumda% 100 emin değilim, ama aynı uyarıyı alıyordum çünkü iki kez X-Forwarded-Proto için proxy_set_header çağırıyordum:

proxy_set_header X-Forwarded-Proto ...;

Bu proxy_params dahil edildi çünkü oldu, ve diğerleri arasında bu satırı içerir:

proxy_set_header X-Forwarded-Proto $scheme;

Bu satırı sitemin yapılandırmasından kaldırmak uyarıyı ortadan kaldırdı.


1
gerçek $$$ tavsiye, teşekkürler.
sjas

-2

Değişiklik

proxy_set_header X-Forwarded-For $remote_addr;

için

proxy_set_header X-Real-IP $remote_addr;

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.